Ответ 1
Erlang использует знак вопроса, чтобы идентифицировать macros. Напр. рассмотрите приведенный ниже код:
-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
.
Обновление
Благодаря @rvirding:
Значок вопроса означает попытку и расширение того, что следует в качестве макросообщения. Нет ничего запрещающего использовать имя макроса (атом или переменную) как обычный атом или переменную. Таким образом, в примере [выше] вы можете использовать
DEBUG
как обычную переменную столько, сколько вы не префикс ее?
. Смутно, определенно, но не противозаконно.