错误信息是误导性的。
& unquote(:"A.#{name}")(&1)
将按字面上的名称调用函数
A.test
在当前范围内,而不是
test/1
模块功能
A
:
defmodule A do
defmacro call(name) do
quote do
fun = & unquote(:"A.#{name}")(&1)
fun.(:foo)
end
end
def unquote(:"A.test")(param), do: IO.inspect(param, label: "!!!")
end
defmodule B do
require A
import A
def test, do: A.call(:test)
end
B.test
输出:
!!!: :foo
把它叫做
测试/1
模块功能
一个
,你可以
& A.unquote(:"#{name}")(&1)
:
defmodule A do
defmacro call(name) do
quote do
fun = & A.unquote(:"#{name}")(&1)
fun.(:foo)
end
end
def test(param), do: IO.inspect(param, label: "test")
end
defmodule B do
require A
def test, do: A.call(:test)
end
B.test
输出:
test: :foo