[英]Quote function name in Elixir
我现在正在学习Elixir,我真的对quote
和unquote
感到困惑。 这是我们使用macro
使用动态名称创建函数的方法:
defmacro create_fun(n) do
quote do: def unquote(:"times_#{n}")(a), do: a * 4
end
例如,如果我将6
作为宏参数传递,它将创建功能times_6
。
现在我不明白的是:在这里我们取消对原子的引用:"times_#{n}"
。 Elixir文档说,当您引用一个原子时,它将返回一个原子。 因此,当我取消引用原子时,我也应该将该原子取回来。 这是真的:
iex(15)> Macro.to_string quote do: unquote(:"times_6")
":times_6"
但是在引号后使用()
可以得到:
iex(14)> Macro.to_string quote do: unquote(:"times_6")()
"times_6()"
带括号的原子突然变成不是原子。 如果我代替unquote(:"times_6")
与:"times_6"
它不工作:
iex(4)> Macro.to_string quote do: :"times_6"()
** (SyntaxError) iex:4: syntax error before: '('
拜托,怎么回事,我不明白
quote
和unquote
quote
从Elixir元编程指南 :
Elixir程序的基础是具有三个元素的元组。 例如,函数调用
sum(1, 2, 3)
在内部表示为:iex> quote do: sum(1, 2, 3) {:sum, [], [1, 2, 3]}
第一个元素是函数名称,第二个是包含元数据的关键字列表,第三个是参数列表。
模块和方法名称在内部用as剂表示为atoms
。 直接查看调用unquote(:"hello")
和unquote(:"hello")()
时生成的基础药剂数据可能有助于清除此问题:
iex(27)> quote do: unquote(:"hello")
:hello
iex(28)> quote do: unquote(:"hello")()
{:hello, [], []}
第一个简单地返回一个原子,第二个简单地返回一个Elixir数据结构 (一个由3个元素组成的元组),该结构表示对带有0个参数的hello
方法的函数调用。 将unquote(:"hello")()
转换为hello()
,然后将其用作方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.