Я настоятельно рекомендую вам прочитать Руководство по макросам на официальном сайте Elixir. Хотя то, что вы делаете, возможно (используя quote
), это совсем не поощряется.
Макросы должны быть простыми, и их функциональность должна быть разбита на другие макросы и методы в случае необходимости. Один из способов сделать это - использовать оператор import
в вашем макросе, чтобы импортировать другие макросы, которые вам нужны в последнем модуле:
defmodule Interface do
defmacro __using__(opts) do
quote(bind_quoted: [opts: opts]) do
import Interface
@interface_module Keyword.get(opts, :for)
end
end
defmacro expose(name) do
quote do
IO.inspect @interface_module, label: "I need this !!"
def unquote(name)() do
IO.puts "The function has been created with exposed name"
end
end
end
end
Теперь вы можете использовать его:
defmodule MyImplementation do
use Interface, for: AnotherModule
expose(:hello)
end
Вот другой пример из одного из моих проектов о том, как вам следует разбить реализацию больших макросов с помощью вспомогательных функций и других макросов.