Динамический идентификатор с макросами - PullRequest
0 голосов
/ 04 апреля 2019

Я использую макросы и хочу передать динамический идентификатор макросу Absinthe enum, желая генерировать различные enum с заданным списком. Все внутри for понимания.

Я читал, что Kernel.apply/3 не работает с макросами.

  1. Я тоже пробовал:
   for name <- [:hello, :world] do
       enum  unquote(name) do
          value(:approved)
       end  
   end

Получение в результате:

** (ArgumentError) argument error
   :erlang.atom_to_binary({:unquote, [line: 36], [{:name, [line: 36], nil}]}, :utf8)
  1. Я тоже пробовал без кавычек:
   for name <- [:hello, :world] do
      enum name do
        value(:approved)
      end
   end

и получите:

** (ArgumentError) argument error
   :erlang.atom_to_binary({:name, [line: 36], nil}, :utf8)

Кажется, я не могу ничего цитировать, передаваемый в качестве идентификатора макроса enum. Возможно ли это сделать?

1 Ответ

2 голосов
/ 04 апреля 2019

Это возможно.Проблема в enum предполагает, что первым аргументом является атом.

defmodule MacroHelper do

  defmacro enum_wrapper(names, do: block) do
    for name <- names do
      quote do
        enum unquote(name), do: unquote(block)
      end
    end
  end

end

defmodule AbsDemo do

  use Absinthe.Schema.Notation
  import MacroHelper

  enum_wrapper [:hello, :world] do
    value :approved
  end

end
...