Отвечая на поставленный вопрос: вполне возможно вызывать макросы из других макросов, просто в конце рекурсивно вводить 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
Тем не менее, ваша проблема вызвана.
Sidenote: [{: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