Я использую макросы и хочу передать динамический идентификатор макросу Absinthe enum
, желая сгенерировать разные enum
с набором списков. Все внутри for
понимания.
Я читал, что Kernel.apply/3
не работает с макросами.
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)
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
. Можно ли сделать это?
Возможно. Проблема в том, что 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