Эрланг: Что означает синтаксис вопросительного знака? - PullRequest
21 голосов
/ 18 сентября 2010

Что означает вопросительный знак в синтаксисе Эрланга?

Например:

Json = ?record_to_json(artist, Artist).

Полный контекст источника можно найти здесь .

Ответы [ 2 ]

27 голосов
/ 18 сентября 2010

Эрланг использует знак вопроса для определения макросов . Например, рассмотрите следующий код:

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

Как сказано в документации,

Макросы раскрываются во время компиляции. Простой макрос ?Const будет заменен на Replacement.

Этот фрагмент определяет макрос с именем DEBUG, который заменяется вызовом для печати строки, если во время компиляции установлен debug Макрос затем используется в следующем коде, таким образом:

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

Это утверждение расширяется и заменяется соответствующим содержанием, если установлено debug. Поэтому вы можете видеть отладочные сообщения, только если установлено debug.

Update

Благодаря @ rvirding :

Знак вопроса означает попытаться развернуть то, что следует, как вызов макроса. Ничто не запрещает использовать имя макроса (атом или переменную) в качестве обычного атома или переменной. Таким образом, в приведенном выше примере вы можете использовать DEBUG как обычную переменную, лишь бы вы не добавляли префикс ?. Смущает, определенно, но не незаконно.

5 голосов
/ 18 сентября 2010

Основываясь на этой документации , я полагаю, что это синтаксис для ссылки на макрос.

И из Изучаем вас Erlang :

Макросы Erlang действительно похожи на операторы C #define, в основном используемые для определения коротких функций и констант.Это простые выражения, представленные текстом, которые будут заменены перед компиляцией кода для виртуальной машины.Такие макросы в основном полезны, чтобы избежать магических значений, плавающих вокруг ваших модулей.Макрос определяется как атрибут модуля в форме: -define (MACRO, some_value).и используется как? MACRO внутри любой функции, определенной в модуле.Макрос 'function' может быть записан как -define (sub (X, Y), XY).и используется как? sub (23,47), позже замененный компилятором на 23-47.Некоторые люди используют более сложные макросы, но основной синтаксис остается прежним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...