Macros 使用__

Macros 使用__,macros,elixir,Macros,Elixir,我有一个叫做接口的模块: defmodule Interfaces do defmacro __using__(module) do @module unquote(module) |> List.first |> elem(1) defmacro expose(name) do IO.inspect params, label: "Expanding macro with: " IO.inspect @module, label: "I

我有一个叫做接口的模块:

defmodule Interfaces do
  defmacro __using__(module) do
    @module unquote(module) |> List.first |> elem(1)
    defmacro expose(name) do
      IO.inspect params, label: "Expanding macro with: "
      IO.inspect @module, label: "I need this !!"

      def unquote(name)() do
        IO.puts "The function has been created with exposed name"
      end
    end
  end
end
另一个名为Interfaces.MyModule的模块:

defmodule Interfaces.MyModule do
  use Interfaces, for: Something.DefinedElseWhere

  expose :plop
end
但在编译时,我得到

** (CompileError) lib/my_module.ex:6: undefined function expose/1

我强烈建议您阅读官方Elixir网站上的。虽然您正在做的事情是可能的(使用
quote
),但根本不鼓励这样做

宏应该是简单的,如果需要,它们的功能应该在其他宏和方法中进一步细分一种方法是使用宏中的
import
语句
导入需要在最终模块中公开的其他宏:

defmodule接口do
使用(opts)do定义宏
引用(bind_quote:[opts:opts])do
导入接口
@接口\模块关键字.get(选项,:for)
结束
结束
defmacro expose(name)do
引述
IO.inspect@interface\u模块,标签:“我需要这个!!”
def unquote(name)()do
IO.puts“已使用公开名称创建函数”
结束
结束
结束
结束
现在您可以使用它了:

defmodulemyimplementation do
使用接口,用于:AnotherModule
暴露(:你好)
结束


以下是我的一个项目中关于如何使用辅助函数和其他宏分解大型宏的实现的内容。

这有什么意义?您已经在宏中了,为什么不定义一个常规函数呢?至于实际问题,我不知道这是否有效。我编辑了我的示例,以便您理解这一点,它应该定义一个在
expose
参数中传递名称的函数为什么不只是创建宏,而不是使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我不想在接口模块中公开
,但我可以接受。谢谢您也可以专门调用
导入接口,仅:[expose:1]
和/或使用单独的未记录的
接口。使用
expose
宏定义
模块并从那里导入。确保用户首先调用
使用接口的另一种方法是使用。