2014-01-12 58 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 –

相關問題