Erlang语法中的问号是什么意思?
例如:
Json = ?record_to_json(artist, Artist).
Run Code Online (Sandbox Code Playgroud)
源的完整上下文可以在这里找到.
Man*_*dan 27
Erlang使用问号来识别宏.例如,考虑以下代码:
-ifdef(debug).
-define(DEBUG(Format, Args), io:format(Format, Args)).
-else.
-define(DEBUG(Format, Args), void).
-endif.
Run Code Online (Sandbox Code Playgroud)
正如文件所说,
在编译期间扩展宏.一个简单的宏
?Const将被替换为Replacement.
这个片段定义了一个被调用的宏DEBUG,如果debug在编译时设置了,则调用该字符串来打印字符串.然后在以下代码中使用宏:
?DEBUG("Creating ~p for N = ~p~n", [First, N]),
Run Code Online (Sandbox Code Playgroud)
如果debug已设置,则扩展此语句并替换为相应的内容.因此,只有在debug设置时才能看到调试消息.
更新
感谢@rvirding:
问号意味着尝试扩展作为宏调用的内容.没有什么禁止使用宏名称(原子或变量)作为普通原子或变量.因此,在[上面]示例中
DEBUG,只要不添加前缀,就可以将其用作普通变量?.令人困惑,绝对是,但不是非法的.
基于此文档,我相信它是引用宏的语法.
Erlang宏与C的'#define'语句非常相似,主要用于定义短函数和常量.它们是由文本表示的简单表达式,在为VM编译代码之前将替换它们.这些宏主要用于避免在模块周围浮动魔术值.宏被定义为以下形式的模块属性:-define(MACRO,some_value).并在模块中定义的任何函数中用作?MACRO."函数"宏可以写为-define(sub(X,Y),XY).并使用like?sub(23,47),后来由编译器替换为23-47.有些人会使用更复杂的宏,但基本语法保持不变.