2016-08-17 23 views
5

W Julia 0,4 Mam zmienną o nazwie variablex gdzieZapisz nazwę zmiennej jako ciąg w Julia

in: variablex = 6 
out: 6 
in: typeof(variablex) 
out: Int64 

Chciałbym zapisać nazwę zmiennej jako ciąg, więc chciałbym, aby skończyć z czymś takim zmienna "a" pod którą przechowuje nazwę zmiennej "zmiennax" jako ciąg znaków.

in: a = Name(variablex) 
out: variablex 
in: typeof(a) 
out: ASCIIString 

W powyższym przykładzie właśnie utworzyłem funkcję "Nazwa", która zwraca nazwę zmiennej jako ciąg. Czy istnieje w Julii istniejąca funkcja, która działa tak samo jak mój wyimaginowany przykład funkcji "Nazwa" powyżej?

Odpowiedz

9

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?

+0

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

+0

@ 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. –

+0

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