如何命名一个宏,使其在Elixir中看起来像一个常量?

时间:2014-01-12 15:22:26

标签: macros naming-conventions constants elixir

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

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

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

1 个答案:

答案 0 :(得分:6)

在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