Erlang:问号语法是什么意思?

Ted*_*mel 21 syntax erlang

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,只要不添加前缀,就可以将其用作普通变量?.令人困惑,绝对是,但不是非法的.

  • 挑剔:问号意味着尝试扩展作为宏调用的内容.没有什么禁止使用宏名称(原子或变量)作为普通原子或变量.所以在你的例子中你可以使用`DEBUG`作为普通变量,只要你不用`?`作为前缀.令人困惑,绝对是,但不是非法的. (3认同)

Jon*_*eet 5

基于此文档,我相信它是引用宏的语法.

了解你一些Erlang:

Erlang宏与C的'#define'语句非常相似,主要用于定义短函数和常量.它们是由文本表示的简单表达式,在为VM编译代码之前将替换它们.这些宏主要用于避免在模块周围浮动魔术值.宏被定义为以下形式的模块属性:-define(MACRO,some_value).并在模块中定义的任何函数中用作?MACRO."函数"宏可以写为-define(sub(X,Y),XY).并使用like?sub(23,47),后来由编译器替换为23-47.有些人会使用更复杂的宏,但基本语法保持不变.