2016-02-19 15 views
3

h unquote說它「從宏內部引用給定的表達式」。爲什麼`unquote`可以在宏外調用?

但是,我剛剛看到一種方式,unquote可以在宏外使用。

defmodule Example do 
    x = 4 
    def foo do 
    unquote(x) 
    end 

    x = 5 
    def bar do 
    x = 4 
    "#{unquote(x)}, #{x}" 
    end 
end 

IO.puts Example.foo #=> 4 
IO.puts Example.bar #=> "5, 4" 

這是相同的unquote,還是不同的?這是一個功能還是錯誤? (它似乎與"temporary storage" purpose of module attributes重疊。)

爲什麼我可以撥打unquote以外的宏quote

回答

3

這是有效的,因爲def本身是一個用defmacro實現的宏,並返回帶引號的表達式。所以雖然看起來你並不在引用的表達式中,因爲你不叫quote,你確實是。

https://github.com/elixir-lang/elixir/blob/928302a912e397917be957142a9837ae58610207/lib/elixir/lib/kernel.ex#L3225L3227

還有其他地方,這也是如此,例如內部ExUnit測試(又因爲test宏使用def定義一個函數。https://github.com/elixir-lang/elixir/blob/928302a912e397917be957142a9837ae58610207/lib/ex_unit/lib/ex_unit/case.ex#L256

相關問題