为什么 `f()()` 是引用中的有效形式?

Why is `f()()` a valid form in quote?

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

虽然 f()()() 不是:

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

这很奇怪,因为 f()() 无法编译。

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

fun = :hello
quote do
  unquote(fun)(1, 2, 3)
end

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