Można użyć makra tak:
macro Name(arg)
string(arg)
end
variablex = 6
a = @Name(variablex)
julia> a
"variablex"
punktów (i więcej informacji): this SO Q & A.
Edit: Szczegóły/Objaśnienie: Z Julia documentation:
makra otrzymują swoje argumenty jako wyrażenia, literały lub symbole
Tak więc, gdybyśmy spróbowali stworzyć ten sam efekt za pomocą funkcji (zamiast makra), mielibyśmy problem, ponieważ funkcje odbierałyby swoje argumenty jako obiekty. Jednak w przypadku makra variablex
(w tym przykładzie) jest przekazywany jako symbol (na przykład odpowiednik wprowadzającego :variablex
). I funkcja string()
może działać na symbolu, przekształcając go w, dobrze, ciąg.
W wersji skróconej można myśleć o symbolu jako bardzo szczególnym typie ciągu, który jest związany i odnosi się do określonego obiektu. Od Julia documentation ponownie:
Symbolem jest internowany identyfikator ciąg
Zatem możemy skorzystać z faktu, że w kodzie bazowym Julii, konfiguracja dla makr już daje nam gotowy sposób aby uzyskać symbol związany z daną zmienną (przekazując tę zmienną jako argument do makra), a następnie skorzystać z faktu, że ponieważ symbole są specjalnym typem ciągu, to jest stosunkowo proste, aby następnie przekształcić je w bardziej standardowy typ ciągu.
Dla bardziej szczegółowej analizy symboli w Julia, zobacz ten słynny SO pytanie: What is a "symbol" in Julia?
Więcej informacji na temat makr, zobacz ten SO pytanie: In Julia, why is @printf a macro instead of a function?
Czy możesz wyjaśnić, jak to działa. Jaka jest funkcja używana tutaj, aby uzyskać nazwę? Na przykład, jeśli nie utworzę makra i po prostu spróbuj użyć ciągu (variablex), otrzymam jego wartość jako ciąg znaków, więc jaka część powyższego podaje nazwę, a nie jej wartość? – lara
@ user3061923 Nie mam tego samego problemu na prostym teście testowym, który próbowałem. Ponieważ opisywany przez Ciebie problem różni się od pierwotnego pytania, które opublikowałeś (wyłączając powtarzalny kod podany w tym pytaniu), zalecamy utworzenie nowego pytania, określenie nowego problemu i podanie odtwarzalnego fragmentu kodu, tak jak Ty zrobił dla twojego oryginalnego. –
Jeśli chciałem użyć tego makra wewnątrz funkcji na zmiennej przekazanej do funkcji, to nie działa. Na przykład funkcją jest funkcja ret (zmienna) println (zmienna) zmienna = @ Nazwa (zmienna) powrót nazwa zmiennej koniec i kiedy używam tego: w: drzewo = 6; in: ret (tree) out: nazwa_zmiennej = zmienna, a nie oczekiwana nazwa_zmiennej = drzewo. – lara