我可以在Elixir中另一个宏的引用中扩展一个宏吗?



给定下面的代码,use Composite, user_opts: user_opts行最终在using(opts( 中作为 opts 作为 opts[{:user_opts, [line: 3, counter: {MockUserNode1, 2}], Automaton.Node}]。有没有办法将该代码注入外部宏中?

defmacro __using__(user_opts) do
a =
if Enum.member?(Composite.types(), user_opts[:node_type]) do
IO.inspect(user_opts)
quote bind_quoted: [user_opts: user_opts] do
use DynamicSupervisor
use Composite, user_opts: user_opts
end
else
quote do: use(Action)
end
end

回答这个问题时说:完全可以从其他宏内部调用宏,最后只需递归地注入 AST。

defmodule DeeplyUsed do
defmacro __using__(opts) do
quote bind_quoted: [opts: opts] do
opts
end
end
end
defmodule Used do
defmacro __using__(opts) do
quote bind_quoted: [opts: opts] do
use DeeplyUsed, opts: opts
end
end
end
defmodule Using do
use Used, line: 3, counter: {MockUserNode1, 2}
end

也就是说,您的问题被诱导了。


旁注:[{:user_opts, _, Automaton.Node}]看起来确实非常可疑,这不是引用关键字列表的方式。从显式取消引用开始,并记录在那里user_opts的内容。

defmacro __using__(user_opts) do
IO.inspect(user_opts, label: "Outside")
quote do
IO.inspect(unquote(user_opts), label: "Inside")
use Composite, user_opts: unquote(user_opts)
end
end

最新更新