defcall sum(x, y), do: reply(x+y)
end
在以上两个例子中, 我们使用到了一些自定义的宏, 这些宏会在编译时 (compile time) 都转化成其它的代码....AST1 会以嵌套的 Elixir Terms 的形式来表述你的代码. 然后进入展开阶段. 在这个阶段, 各种内置的和自定义的宏被转换成了最终版本....元编程总是会引入一个隐形 (或不明显)的层, 在 Elixir 中这只发生在编译时, 并独立于程序的各种执行路径....)
我们会得到错误, 因为这里没有叫做一个叫做 a 的变量 (或函数)....所以, 当我们调用 Tracer.trace(1+2), 我们的宏(它是一个函数)不会接收到 3. 相反, expression_ast 的内容会是 quote(do: 1+2) 的结果.