好吧,我真的觉得问这个很蠢,但我很好奇。
在 Jose 的 2023 年主题演讲中,他展示了这个示例,说明了为什么新类型实现无法防止某些错误:
def left and right do
Enum.random([left, right])
end
所以为了看看他是否只是编造一些东西来表达他的观点,我在
iex
中尝试了它,果然——有一个 and
函数。让我困惑的是,为什么left
不是函数的名称?函数名前后怎么可能有参数?
在elixir中,一切都是宏。
Kernel.def/2
也不例外。宏接收其参数的 AST 而不是参数本身。这就是实际收到的内容Kernel.def/2
(为了清楚起见,我简化了该块)
iex|💧|1 ▶ quote do
...|💧|1 ▶ left and right do
...|💧|1 ▶ :ok
...|💧|1 ▶ end
...|💧|1 ▶ end
{:and, [context: Elixir, imports: [{2, M}]],
[{:left, [], Elixir}, {:right, [], [[do: :ok]]}]}
也就是说,这是
Kernel.def/2
宏的职责,在 elixir 中提供 infix“运算符”。
:elixir_def
代码库。