【问题标题】:Erlang: What does question mark syntax mean?Erlang:问号语法是什么意思?
【发布时间】:2011-04-14 02:35:52
【问题描述】:

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

例如:

Json = ?record_to_json(artist, Artist).

来源的完整上下文可以在here找到。

【问题讨论】:

  • 使用谷歌但没有提出任何东西(for:“erlang 问号语法”)。也许我应该激活网络历史记录或其他东西以获得更相关的结果(即使使用相同的关键字结果对每个人来说都是不一样的,尤其是在更特殊的关键字上)。但是感谢您的评论...我仍然会感谢具有 erlang 经验的人提供有关如何以及为什么使用的更深入的上下文...
  • @delnan - 谷歌搜索提出了这个问题

标签: syntax erlang


【解决方案1】:

Erlang 使用问号来识别macros。例如考虑下面的代码:

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

正如文档所说,

宏在编译期间被扩展。一个简单的宏?Const 将被替换为Replacement

这个 sn-p 定义了一个名为 DEBUG 的宏,如果在编译时设置了 debug,则该宏将替换为打印字符串的调用。然后在以下代码中使用该宏:

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

如果设置了debug,则此语句将被扩展并替换为适当的内容。因此,只有在设置了debug 时,您才能看到调试消息。

更新

感谢@rvirding

问号意味着尝试将后面的内容扩展为宏调用。没有什么禁止将宏名称(原子或变量)用作普通原子或变量。因此,在 [上述] 示例中,您可以将 DEBUG 用作普通变量,只要您不使用 ? 作为前缀即可。令人困惑,绝对是,但并不违法。

【讨论】:

  • 挑剔:问号意味着尝试将后面的内容扩展为宏调用。没有什么禁止将宏名称(原子或变量)用作普通原子或变量。因此,在您的示例中,您可以将DEBUG 用作普通变量,只要您不使用? 作为前缀即可。令人困惑,绝对是,但并不违法。
  • @rvirding:谢谢!无耻地借用它并添加到我的答案中。
【解决方案2】:

基于this documentation,我相信这是引用宏的语法。

来自Learn You Some Erlang

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 2014-01-21
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多