2
在Erlang中,我們可以定義一個像-define(TIME, 60 * 60).
這樣的宏,並且從調用宏如?TIME
我們可以確切地知道它們是宏。如何命名一個宏,使它在Elixir中看起來像一個常量?
但是,在Elixir中,宏的調用看起來像一個函數調用。我們無法輕鬆區分函數調用的宏調用。
那麼,有沒有一種方法可以命名一些像常量一樣的宏呢?
在Erlang中,我們可以定義一個像-define(TIME, 60 * 60).
這樣的宏,並且從調用宏如?TIME
我們可以確切地知道它們是宏。如何命名一個宏,使它在Elixir中看起來像一個常量?
但是,在Elixir中,宏的調用看起來像一個函數調用。我們無法輕鬆區分函數調用的宏調用。
那麼,有沒有一種方法可以命名一些像常量一樣的宏呢?
在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
你第一個例子沒有按」 t在模塊之外工作,所以不是整個程序中可用的常量。 –
它仍然在上面回答。如果您希望跨模塊可用,那麼您需要通過函數將其導出。這是唯一的方法。 –
我只是建議您將示例更改爲defmodule Clock do macro_defined_here end –