defmodule A do
end
defmodule B do
end
defmodule D do
defmacro req(mods) do
for mod <- mods do
quote do
require unquote(mod)
end
end
end
end
defmodule C do
import D
req([A, B])
end
defmodule A do
end
defmodule B do
end
defmodule D do
defmacro req(mods) do
quote do
for mod <- unquote(mods) do
require mod
end
end
end
end
defmodule C do
import D
mods = Application.compile_env(:xd, :mods, [A, B])
req(mods)
end
You moved the for mod <- mods into a quote do. It won’t work that way. But looking at Application.compile_env is doesn’t seem to return actual compile time values, which feels strange given the name. The macro just returns code for fetching a value.
This, I think, does what is expected (basically @LostKobrakai’s solution with the addition of Code.eval_quoted/1 to get the runtime value at compile time) and then passing the dynamic configuration directly as a parameter. Its tricky to pass module level assigns as a parameter to a macro.
defmodule Mac do
defmacro r(modules) do
{modules, _} = Code.eval_quoted(modules)
for module <- modules do
quote do
require unquote(module)
end
end
end
end
defmodule C do
require Mac
Mac.r(Application.compile_env(:xd, :mods, [A, B]))
end