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