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

25

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

例如:

Json = ?record_to_json(artist, Artist).

完整的源代码上下文可以在这里找到。


用谷歌搜索了一下,但没有找到任何关于“erlang问号语法”的信息。也许我应该激活网络历史记录之类的东西以获得更相关的结果(即使使用相同的关键字,每个人的结果也不同,尤其是在更为特定的关键字上)。但还是感谢评论...仍然希望有经验的Erlang程序员能够提供一些更深入的上下文,说明如何以及为什么使用... - Ted Karmel
14
@delnan - 在谷歌上搜索会出现这个问题。 - OrangeDog
3个回答

30

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,只要不以?为前缀即可。令人困惑,但绝对不是非法的。


4
挑剔一些:问号表示尝试将其后面的内容扩展为宏调用。并没有禁止使用宏名称(原子或变量)作为普通的原子或变量。因此,在您的示例中,只要不使用“?”作为前缀,您就可以将DEBUG用作普通变量。这确实很令人困惑,但并非违法。 - rvirding
@rvirding:谢谢!我无耻地借用了它并添加到我的答案中。 - Manoj Govindan

5
根据这份文档,我认为这是引用宏的语法。
而根据Learn You Some Erlang
Erlang宏与C语言中的“#define”语句非常相似,主要用于定义短函数和常量。它们是由文本表示的简单表达式,在代码编译为虚拟机之前将被替换。这些宏主要用于避免在模块中漂浮着魔数。宏定义为形如:-define(MACRO,some_value)的模块属性,并在模块中定义的任何函数内部使用?MACRO。'function'宏可以编写为-define(sub(X,Y),X-Y)。并像?sub(23,47)一样使用,稍后由编译器替换为23-47。有些人会使用更复杂的宏,但基本语法保持不变。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接