【发布时间】:2019-02-01 16:45:36
【问题描述】:
所以在 Elixir 中 defmacro 的文档中,我们有(我输入了一个 hello 方法作为示例):
defmodule MyLogic do
defmacro unless(expr, opts) do
quote do
if !unquote(expr), unquote(opts)
end
end
def hello, do: "hello"
end
然后,如果我尝试反省可用的功能,则只有 hello/0 显示。
iex(3)> MyLogic.__info__(:functions)
[hello: 0]
但是调用:
MyLogic.unless false do
IO.puts("It works")
end
确实调用了宏。
我的理解是宏被扩展成最终的AST形式,编译后就没有痕迹了。我发现有点令人困惑的是,您似乎可以像调用函数一样调用unless,但在自省.__info__(:functions) 中没有任何痕迹。
1)我认为你不能在编译后反省宏定义,因为编译后没有任何痕迹,但是在构建“除非”扩展后的心智模型时,我应该如何在我的脑海中表示它?我应该把它看成“MyLogic”现在有这个原子名称unless,它调用if表达式if !unquote(expr), unquote(opts)的结果。
2) 那么Elixir 是如何知道unless 是完全展开的宏代码的快捷方式?
【问题讨论】:
标签: elixir