2

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

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

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

4

1 回答 1

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
于 2014-01-12T21:03:50.727 回答