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

发布于 2024-09-19 13:18:52 字数 192 浏览 4 评论 0原文

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

例如:

Json = ?record_to_json(artist, Artist).

可以在此处找到源的完整上下文。

What does the question mark in Erlang syntax mean?

For example:

Json = ?record_to_json(artist, Artist).

The full context of the source can be found here.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

神魇的王 2024-09-26 13:18:52

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 作为普通变量,只要您不使用 ? 前缀即可。绝对令人困惑,但并不违法。

Erlang uses question mark to identify macros. For e.g. consider the below code:

-ifdef(debug).
-define(DEBUG(Format, Args), io:format(Format, Args)).
-else.
-define(DEBUG(Format, Args), void).
-endif.

As the documentation says,

Macros are expanded during compilation. A simple macro ?Const will be replaced with Replacement.

This snippet defines a macro called DEBUG that is replaced with a call to print a string if debug is set at compile time. The macro is then used in the following code thus:

?DEBUG("Creating ~p for N = ~p~n", [First, N]),

This statement is expanded and replaced with the appropriate contents if debug is set. Therefore you get to see debug messages only if debug is set.

Update

Thanks to @rvirding:

A question mark means to try and expand what follows as a macro call. There is nothing prohibiting using the macro name (atom or variable) as a normal atom or variable. So in [the above] example you could use DEBUG as a normal variable just as long as you don't prefix it with ?. Confusing, most definitely, but not illegal.

若言繁花未落 2024-09-26 13:18:52

根据本文档,我相信这是引用宏的语法。

来自学习一些 Erlang

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

Based on this documentation, I believe it's the syntax for referring to a macro.

And from Learn You Some Erlang:

Erlang macros are really similar to
C's '#define' statements, mainly used
to define short functions and
constants. They are simple expressions
represented by text that will be
replaced before the code is compiled
for the VM. Such macros are mainly
useful to avoid having magic values
floating around your modules. A macro
is defined as a module attribute of
the form: -define(MACRO, some_value).
and is used as ?MACRO inside any
function defined in the module. A
'function' macro could be written as
-define(sub(X,Y), X-Y). and used like ?sub(23,47), later replaced by 23-47
by the compiler. Some people will use
more complex macros, but the basic
syntax stays the same.

凡尘雨 2024-09-26 13:18:52

?表示宏。

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

? indicates Macros.

Erlang has predefined macros as well. Example: ?MODULE. You can find the complete list in https://www.erlang.org/doc/reference_manual/macros.html#predefined-macros

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文