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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。