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

lb3vh1jj  于 2022-12-08  发布在  Erlang
关注(0)|答案(3)|浏览(232)

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

Json = ?record_to_json(artist, Artist).

源代码的完整上下文可以在here中找到。

dgtucam1

dgtucam11#

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用作普通的变量,只要你不将它作为?的前缀。这很容易混淆,但并不违法。

41zrol4v

41zrol4v2#

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

c90pui9n

c90pui9n3#

?表示宏。
Erlang也有预定义的宏。例如:?模块。您可以在www.example.com上找到完整的列表https://www.erlang.org/doc/reference_manual/macros.html#predefined-macros

相关问题