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

17

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

Например:

Json = ?record_to_json(artist, Artist).

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

    
задан Ted Karmel 18.09.2010 в 16:09
источник
  • Используется google, но ничего не придумал (для: «синтаксис вопросительных знаков erlang»). Возможно, мне нужно активировать историю веб-поиска или что-то, чтобы получить более релевантные результаты (даже при использовании тех же ключевых слов результаты не одинаковы для всех, особенно для более уникальных ключевых слов). но спасибо за комментарий ... все же я был бы признателен, кто-то с опытом erlang, предоставляя более глубокий контекст о том, как и почему ... –  Ted Karmel 18.09.2010 в 16:16
  • @delnan - Googling поднимает этот вопрос –  OrangeDog 12.05.2011 в 13:24

2 ответа

23

Erlang использует знак вопроса, чтобы идентифицировать макросы . Напр. рассмотрите приведенный ниже код:

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

    
ответ дан Manoj Govindan 18.09.2010 в 16:17
  • Чтобы быть разборчивым: знак вопроса означает попытаться расширить то, что следует за макро-вызовом. Нет ничего запрещающего использовать имя макроса (атом или переменную) как обычный атом или переменную. Итак, в вашем примере вы можете использовать DEBUG как обычную переменную столько, сколько вы ее не префикс? Смущает, определенно, но не противозаконно. –  rvirding 19.09.2010 в 13:25
  • @rvirding: Спасибо! Бесстыдно заимствовал его и добавил к моему ответу. –  Manoj Govindan 19.09.2010 в 16:38
5

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

И из Узнай, что у тебя есть Erlang :

  

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

    
ответ дан Jon Skeet 18.09.2010 в 16:13