带宏的动态标识符

时间:2019-04-04 02:02:25

标签: elixir 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 个答案:

答案 0 :(得分:2)

有可能。问题是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