【发布时间】:2017-05-15 06:05:16
【问题描述】:
我需要在对 A.target 的调用中访问 @attr 的实际值
defmodule A do
defmacro target(param) do
IO.inspect param, label: "Inside a macro"
end
end
defmodule B do
@attr 42
require A
A.target(@attr)
end
我肯定有
Inside a macro: {:@, [line: 10], [{:attr, [line: 10], nil}]}
已打印,因为此时正在构建 AST,而A.target/1 不负责扩展其参数。我发现我可以访问参数的值,而不是 quote do 块中的 AST:
defmodule A do
defmacro target(param) do
quote do: IO.inspect uquote(param), label: "unquote"
end
end
问题是我需要预先扩展价值。我尝试过的:
var!Macro.expand-
Code.eval的任何变体
所以,我的问题是:是否可以在宏主体的第一行强制扩展宏参数?
【问题讨论】:
标签: macros elixir metaprogramming