Elixir Macros: Get unquoted parameter value outside of quote
我有一个宏,它获取模块名称作为参数,我想在该模块上调用一个函数来获取一些数据以生成
示例:
1 2 3 4 5 | defmacro my_macro(module) do data = apply(module, :config, []) # do something with data to generate the quote do end end |
显然,这是行不通的,因为参数值被引用了。我可以在引用块中获取数据并采取相应的行动,但这会将整个逻辑放在使用我的宏的模块中,这很脏。我想注入尽可能少的代码。
您可以通过与引用形式进行模式匹配来提取模块:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | defmodule A do defmacro my_macro({:__aliases__, _, list}) do module = Module.concat(list) module.foo() end end defmodule B do def foo do quote do 42 end end end defmodule C do import A IO.inspect my_macro B end |
输出:
1 | 42 |