繁体   English   中英

在Elixir中引用函数名称

[英]Quote function name in Elixir

我现在正在学习Elixir,我真的对quoteunquote感到困惑。 这是我们使用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: '('

拜托,怎么回事,我不明白

这就是在Elixir中实现quoteunquote 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM