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

时间:2010-09-18 14:09:23

标签: syntax erlang

Erlang语法中的问号是什么意思?

例如:

Json = ?record_to_json(artist, Artist).

可以找到源的完整上下文here

2 个答案:

答案 0 :(得分:27)

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前添加?,就可以使用{{1}}作为普通变量。令人困惑,绝对,但不是非法。

答案 1 :(得分:5)

基于this documentation,我认为这是引用宏的语法。

来自Learn You Some Erlang

  

Erlang宏真的很相似   主要使用C的'#define'语句   定义短函数和   常量。它们是简单的表达   用文字表示   在编译代码之前替换   对于VM。这些宏主要是   有用,以避免具有神奇的价值   漂浮在你的模块周围。一个宏   被定义为的模块属性   形式:-define(MACRO,some_value)。   并在任何内部用作?MACRO   模块中定义的函数。一个   'function'宏可以写成   -define(sub(X,Y),X-Y)。并使用了像?sub(23,47),后来被23-47取代   由编译器。有些人会用   更复杂的宏,但基本的   语法保持不变。