Elixir語言中 Macro
相關用法介紹如下。
宏是編譯時構造,以 Elixir 的 AST 作為輸入並以 Elixir 的 AST 的超集作為輸出來調用。
讓我們看一個顯示函數和宏之間區別的簡單示例:
defmodule Example do
defmacro macro_inspect(value) do
IO.inspect(value)
value
end
def fun_inspect(value) do
IO.inspect(value)
value
end
end
現在讓我們試一試:
import Example
macro_inspect(1)
#=> 1
#=> 1
fun_inspect(1)
#=> 1
#=> 1
到目前為止,它們的行為相同,因為我們將整數作為參數傳遞。但是當我們傳遞一個表達式時會發生什麽:
macro_inspect(1 + 2)
#=> {:+, [line: 3], [1, 2]}
#=> 3
fun_inspect(1 + 2)
#=> 3
#=> 3
宏接收作為參數給出的代碼的表示,而函數接收作為參數給出的代碼的結果。宏必須返回代碼表示的超集。有關詳細信息,請參閱
和input/0
。output/0
要了解有關 Elixir 的 AST 以及如何以編程方式構建它們的更多信息,請參閱
。quote/2
自定義印記
宏也常用於實現自定義印記。要創建自定義印記,請定義一個名稱為 sigil_{identifier}
的宏,該宏帶有兩個參數。第一個參數是字符串,第二個參數是包含任何修飾符的字符列表。如果印記是小寫的(例如 sigil_x
),則字符串參數將允許插值。如果印記是大寫的(例如 sigil_X
),則不會對字符串進行插值。
有效修飾符僅包括小寫和大寫字母。其他字符會導致語法錯誤。
必須先導入包含自定義 sigil 的模塊,然後才能使用 sigil 語法。
例子
defmodule MySigils do
defmacro sigil_x(term, [?r]) do
quote do
unquote(term) |> String.reverse()
end
end
defmacro sigil_x(term, _modifiers) do
term
end
defmacro sigil_X(term, [?r]) do
quote do
unquote(term) |> String.reverse()
end
end
defmacro sigil_X(term, _modifiers) do
term
end
end
import MySigils
~x(with #{"inter" <> "polation"})
#=>"with interpolation"
~x(with #{"inter" <> "polation"})r
#=>"noitalopretni htiw"
~X(without #{"interpolation"})
#=>"without \#{"interpolation"}"
~X(without #{"interpolation"})r
#=>"}\"noitalopretni\"{# tuohtiw"
相關用法
- Elixir Macro.Env.fetch_alias用法及代碼示例
- Elixir Macro.prewalk用法及代碼示例
- Elixir Macro.generate_unique_arguments用法及代碼示例
- Elixir Macro.quoted_literal?用法及代碼示例
- Elixir Macro.Env.required?用法及代碼示例
- Elixir Macro.validate用法及代碼示例
- Elixir Macro.Env.prepend_tracer用法及代碼示例
- Elixir Macro.camelize用法及代碼示例
- Elixir Macro.operator?用法及代碼示例
- Elixir Macro.var用法及代碼示例
- Elixir Macro.unescape_string用法及代碼示例
- Elixir Macro.unique_var用法及代碼示例
- Elixir Macro.expand_once用法及代碼示例
- Elixir Macro.to_string用法及代碼示例
- Elixir Macro.Env.lookup_import用法及代碼示例
- Elixir Macro.prewalker用法及代碼示例
- Elixir Macro.postwalker用法及代碼示例
- Elixir Macro.underscore用法及代碼示例
- Elixir Macro.generate_arguments用法及代碼示例
- Elixir Macro.Env.has_var?用法及代碼示例
- Elixir Macro.decompose_call用法及代碼示例
- Elixir Macro.Env用法及代碼示例
- Elixir Macro.escape用法及代碼示例
- Elixir Macro.update_meta用法及代碼示例
- Elixir Macro.unpipe用法及代碼示例
注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 Macro。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。