2014-01-12 26 views
2

在Erlang中,我们可以定义一个像-define(TIME, 60 * 60).这样的宏,并且从调用宏如?TIME我们可以确切地知道它们是宏。如何命名一个宏,使它在Elixir中看起来像一个常量?

但是,在Elixir中,宏的调用看起来像一个函数调用。我们无法轻松区分函数调用的宏调用。

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

回答

6

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

在药剂的等效是:

defmacro time do 
quote do 
    60 * 60 
end 
end 

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

也就是说,药剂具有另一种构建,使您可以预先计算的值,在编译时,和简单地重新使用在你的功能,这是通过属性:

defmodule MyModule do 
    @time 60 * 60 

    def using_time do 
    @time 
    end 
end 
+0

你第一个例子没有按” t在模块之外工作,所以不是整个程序中可用的常量。 –

+0

它仍然在上面回答。如果您希望跨模块可用,那么您需要通过函数将其导出。这是唯一的方法。 –

+0

我只是建议您将示例更改为defmodule Clock do macro_defined_here end –

相关问题