当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Elixir Macro用法及代码示例


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