【发布时间】:2018-05-22 09:00:45
【问题描述】:
我正在模块中生成一些函数:
defmodule M do
funs = [do_it: [:arg1, :arg2]]
Enum.each(funs, fn {name, args} ->
args = Enum.map(args, & {&1, [], Elixir})
def unquote(name)(unquote(args)),
do: IO.inspect(unquote(args))
end)
end
问题是生成的函数显然接受一个参数,即大小为 2 的列表:
▶ M.__info__(:functions)
#⇒ [do_it: 1]
目标是动态声明函数接受两个参数。在 ruby 术语中,这将是 unsplat 参数列表。
是否有可能在不对{:do_it, blah, [[ list of arguments ]]} 生成的 AST 进行模式匹配并手动展平列表的情况下完成此操作?
【问题讨论】:
标签: macros elixir metaprogramming