【问题标题】:How to name a macro so that it can look like a constant in Elixir?如何命名宏,使其看起来像 Elixir 中的常量?
【发布时间】:2014-01-12 15:22:26
【问题描述】:

在Erlang中,我们可以定义像-define(TIME, 60 * 60).这样的宏,而通过调用?TIME这样的宏,我们可以准确地知道它们是宏。

然而,在 Elixir 中,宏的调用看起来像函数调用。我们不能轻易区分宏调用和函数调用。

那么,有没有一种方法可以给一些像常量一样的宏命名?

【问题讨论】:

    标签: macros naming-conventions constants elixir


    【解决方案1】:

    在 Erlang 中,宏作为模板工作。所以-define(TIME, 60 * 60) 将有效地将60 * 60 引入您的源代码(在这种特定情况下可能由编译器预先计算)。

    Elixir 中的等价物是:

    defmacro time do
     quote do
       60 * 60
     end
    end
    

    但这与 Erlang 的问题完全相同。如果你真的想计算一些昂贵的东西,它仍然会在运行时在你使用宏 time 的所有地方计算。

    也就是说,Elixir 有另一个构造,它允许您在编译时预先计算一个值,并通过属性简单地在您的函数中重用:

    defmodule MyModule do
      @time 60 * 60
    
      def using_time do
        @time
      end
    end
    

    【讨论】:

    • 你的第一个例子不能在模块之外工作,所以它不是一个在整个程序中可用的常量。
    • 上面还是回答了。如果您希望跨模块可用,则需要通过函数导出它。这是唯一的方法。
    • 我只是建议您将示例更改为 defmodule Clock do macro_defined_here end
    猜你喜欢
    • 2016-02-10
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 2018-08-31
    • 2011-04-27
    • 1970-01-01
    相关资源
    最近更新 更多