Эрланг использует знак вопроса для определения макросов . Например, рассмотрите следующий код:
-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
как обычную переменную, лишь бы вы не добавляли префикс ?
. Смущает, определенно, но не незаконно.