【发布时间】:2017-05-22 03:15:50
【问题描述】:
some_dynamic_atom = :"prefix_#{name}"
quote do
Task.Supervisor.async_nolink(Tasks.Chain, &unquote(some_dynamic_atom)/0)
end
# Should become
Task.Supervisor.async_nolink(Tasks.Chain, &prefix_smth/0)
我需要在 Elixir 宏中创建一个动态函数并将其名称传递给 Task
我做了一个动态函数,但是上面的宏给了我一个错误:
invalid args for &, expected an expression in the format of &Mod.fun/arity, &local/arity or a capture containing at least one argument as &1, got: :prefix_smth / 0
一种可能的解决方案是使用fn -> unquote(some_dynamic_atom)() end,但我的基准测试表明,使用匿名包装器会显着减慢执行速度。
【问题讨论】:
-
&__MODULE__.unquote(some_dynamic_atom)/0工作 FWIW。不知道为什么它会在没有模块的情况下引发该错误。