Macros 如何将函数捕获传递给Elixir中的宏?

Macros 如何将函数捕获传递给Elixir中的宏?,macros,elixir,Macros,Elixir,这不管用。使用宏.expand/2也没有帮助 defmodule ExBs.Component do defmacro defcomp(名称、选项)do func=关键字.get(选项,:func) IO.检查(职能) func.(“foo”) 结束 结束 defmodule ExBs.Foo do 导入ExBs.Component defcomp(:foo, func:&Phoenix.HTML.Link.Link/2 ) 结束 这是IEx输出: [{:[别名][line:24],:Phoe

这不管用。使用宏.expand/2也没有帮助

defmodule ExBs.Component do
defmacro defcomp(名称、选项)do
func=关键字.get(选项,:func)
IO.检查(职能)
func.(“foo”)
结束
结束
defmodule ExBs.Foo do
导入ExBs.Component
defcomp(:foo,
func:&Phoenix.HTML.Link.Link/2
)
结束
这是IEx输出:

[{:[别名][line:24],:Phoenix,:HTML,:Link]},:Link]
**(BadFunctionError)需要一个函数,得到:nil
展开宏:ExBs.Component.defcomp/2
是否可能?

宏确实接收AST并返回AST。返回的AST被注入调用该宏的位置,而不是调用宏。返回用户使用的AST。也就是说,以下方法将起作用:

defmodule ExBs.Component do
defmacro defcomp(名称、选项)do
引述
func=关键字.get(unquote(opts),:func,fn->“end)
IO.检查(职能)
func.(“foo”)
结束
结束
结束
defmodule ExBs.Foo do
导入ExBs.Component
defcomp(:foo,
func:&IO.inspect/1
)
结束
#⇒#功能
“福”
请注意,函数是在编译阶段执行的,也就是在宏展开时执行的。也就是说,产生的光束没有这种功能的踪迹

我怀疑这是你真正想要的,但如果不知道你想要实现什么,就不可能提出更有价值的建议。在任何情况下,现在代码复制并按设计工作


胡乱猜测:如果您想声明函数
:foo
wrapping
func
,则可以执行以下操作:

defmodule ExBs.Component do
defmacro defcomp(名称、选项)do
func=关键字.get(选项,:func)
引述
def unquote(name)(),do:unquote(func)(“foo”)
结束
结束
结束
defmodule ExBs.Foo do
导入ExBs.Component
defcomp(:foo,
func:&IO.inspect/1
)
结束
ExBs.Foo.Foo
#⇒“福”