Elixir 为什么'f()()`在引号中是有效的形式?

Elixir 为什么'f()()`在引号中是有效的形式?,elixir,Elixir,而f()()不是: iex(1)> quote do: f()() {{:f, [], []}, [], []} 这很奇怪,因为f()()没有编译。因为第一个表达式可以是引号内的unquote: iex(2)> quote do: f()()() ** (SyntaxError) iex:2: syntax error before: '(' 这将生成一个带引号的表达式,该表达式调用hello(1,2,3)。这就是为什么我们只支持两个级别,因为这就是我们所需要的。如果我们将来需要

f()()
不是:

iex(1)> quote do: f()()
{{:f, [], []}, [], []}

这很奇怪,因为
f()()
没有编译。

因为第一个表达式可以是引号内的unquote:

iex(2)> quote do: f()()()
** (SyntaxError) iex:2: syntax error before: '('

这将生成一个带引号的表达式,该表达式调用
hello(1,2,3)
。这就是为什么我们只支持两个级别,因为这就是我们所需要的。如果我们将来需要的话,我们可以让它支持n级。

所以这实际上只在与
unquote
一起使用时才有用,对吗?如果与
unquote
以外的其他内容一起使用,生成错误或警告是否有意义?如果您与unquote以外的其他内容一起使用,我们已经出现了错误。我的意思是
quote do:f(:bla)(
可以调整以导致错误,但
quote do:unquote(:bla)(
当然不会。还是我没有正确理解这一点?
fun = :hello
quote do
  unquote(fun)(1, 2, 3)
end