Подтвердить что ты не робот

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

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

Например:

Json = ?record_to_json(artist, Artist).

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

4b9b3361

Ответ 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 как обычную переменную столько, сколько вы не префикс ее ?. Смутно, определенно, но не противозаконно.

Ответ 2

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

И из Изучите несколько Erlang:

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