基于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。有些人会使用更复杂的宏,但基本语法保持不变。
3条答案
按热度按时间dgtucam11#
Erlang使用问号来标识宏。例如,考虑以下代码:
正如文档所述,
宏在编译期间被扩展。简单宏
?Const
将被Replacement
替换。此代码段定义了一个名为
DEBUG
的宏,如果在编译时设置了debug
,则该宏将被替换为打印字符串的调用。然后,该宏将在以下代码中使用:如果设置了
debug
,此语句将被扩展并替换为相应的内容。因此,只有在设置了debug
时,您才能看到调试消息。感谢@rvirding:
问号意味着尝试将后面的内容扩展为一个宏调用。没有什么禁止将宏名称(原子或变量)用作普通的原子或变量。所以在[上面的]例子中,你可以将
DEBUG
用作普通的变量,只要你不将它作为?
的前缀。这很容易混淆,但并不违法。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。有些人会使用更复杂的宏,但基本语法保持不变。
c90pui9n3#
?表示宏。
Erlang也有预定义的宏。例如:?模块。您可以在www.example.com上找到完整的列表https://www.erlang.org/doc/reference_manual/macros.html#predefined-macros