2010-09-18 12 views
17

Co oznacza znak zapytania w składni Erlanga?Erlang: Co oznacza składnia znaku zapytania?

Na przykład

Json = ?record_to_json(artist, Artist). 

pełnego kontekstu źródła znaleźć można here.

+0

Używane Google, ale nie wymyślił niczego (dla: "składnia znaków zapytania Erlanga"). Może powinienem aktywować historię online lub coś, co pozwoli uzyskać bardziej trafne wyniki (nawet przy użyciu tych samych słów kluczowych wyniki nie są takie same dla wszystkich, szczególnie w przypadku bardziej specyficznych słów kluczowych). ale dzięki za komentarz ... nadal byłbym wdzięczny komuś z doświadczeniem erlangu dostarczającym nieco wnikliwego kontekstu na temat tego, jak i dlaczego ... –

+13

@delnan - Googling wywołuje to pytanie – OrangeDog

Odpowiedz

23

Erlang używa znaku zapytania do identyfikacji macros. Dla np. rozważyć poniższy kod:

-ifdef(debug). 
-define(DEBUG(Format, Args), io:format(Format, Args)). 
-else. 
-define(DEBUG(Format, Args), void). 
-endif. 

Jako dokumentacja mówi,

Makra są rozszerzane podczas kompilacji. Proste makro ?Const zostanie zastąpione przez Replacement.

Ten fragment definiuje makro o nazwie DEBUG że jest zastępowany zaproszenia do wydrukowania ciąg jeśli debug jest ustawiony w czasie kompilacji. Makro jest następnie wykorzystywany w następującym kodzie tak:

?DEBUG("Creating ~p for N = ~p~n", [First, N]), 

To stwierdzenie jest rozszerzona i zastąpione odpowiednimi zawartości jeśli debug jest ustawiony. Dlatego wyświetlane są komunikaty debugowania tylko wtedy, gdy ustawiono debug.

Aktualizacja

Dzięki @rvirding:

Znak zapytania oznacza spróbować poszerzyć co następuje jako makro nazwać. Nie ma nic, co zabrania używania nazwy makra (atomu lub zmiennej) jako normalnego atomu lub zmiennej. Tak więc w powyższym przykładzie możesz użyć DEBUG jako normalnej zmiennej tak długo, jak długo nie poprzedzasz jej prefiksem ?. Mylące, zdecydowanie, ale nie nielegalnie.

+3

Aby być wybrednym: znak zapytania oznacza próbę rozszerzenia co następuje jako połączenie makro. Nie ma nic, co zabrania używania nazwy makra (atomu lub zmiennej) jako normalnego atomu lub zmiennej. Tak więc w twoim przykładzie możesz użyć 'DEBUG' jako normalnej zmiennej tak długo, jak długo nie poprzedzasz jej' ''. Mylące, zdecydowanie, ale nie nielegalnie. – rvirding

+0

@rvirding: Thanks! Zawiedziłem go bezwstydnie i dodałem do mojej odpowiedzi. –

5

Na podstawie this documentation, uważam, że jest to składnia odnosząca się do makra.

I od Learn You Some Erlang:

makra Erlang są bardzo podobne do c jest '#define' wypowiedzi, używany głównie zdefiniować krótkie funkcje i stałe. Są to proste wyrażenia reprezentowane przez tekst, który będzie zastąpiony przed skompilowaniem kodu dla maszyny wirtualnej. Takie makra są głównie przydatne do uniknięcia magicznych wartości unoszących się wokół twoich modułów. Makro jest zdefiniowane jako atrybut modułu w postaci: -define (MACRO, some_value). i jest używany jako? MAKRO w dowolnej funkcji zdefiniowanej w module . Makro "funkcja" może być zapisane jako -define (pod (X, Y), X-Y). i używane jak? sub (2347), później zastąpione przez 23-47 przez kompilator. Niektórzy ludzie używają bardziej złożonych makr, ale podstawowa składnia pozostaje taka sama.

Powiązane problemy