带宏的动态标识符
Dynamic identifier with macros
我正在使用宏,我想将动态标识符传递给 Absinthe 宏 enum
,想生成不同的 enum
s 和一个集合列表。一切都在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
我正在使用宏,我想将动态标识符传递给 Absinthe 宏 enum
,想生成不同的 enum
s 和一个集合列表。一切都在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