2
方法が一貫していないように思わ:タプルをマクロに渡す必要がありますか?タプルが処理される
defmodule A do
defmacro a(x) do
IO.inspect x
quote do end
end
end
A.a {:a, :b}
期待通りに印刷さ{:a, :b}
が、A.a {:a}
プリント{:{}, [line: 2], [:a]}
方法が一貫していないように思わ:タプルをマクロに渡す必要がありますか?タプルが処理される
defmodule A do
defmacro a(x) do
IO.inspect x
quote do end
end
end
A.a {:a, :b}
期待通りに印刷さ{:a, :b}
が、A.a {:a}
プリント{:{}, [line: 2], [:a]}
マクロが引用された式としてその引数を受け取り、エリクサーで、長さ2のタプル残りは{:{}, _, [value1, value2, ...]}
として表示されます。
iex(1)> Macro.escape {}
{:{}, [], []}
iex(2)> Macro.escape {1}
{:{}, [], [1]}
iex(3)> Macro.escape {1, 2}
{1, 2}
iex(4)> Macro.escape {1, 2, 3}
{:{}, [], [1, 2, 3]}
iex(5)> Macro.escape {1, 2, 3, 4}
{:{}, [], [1, 2, 3, 4]}
これらの値を注入するとsをunquote
を使用してquote
に変換すると、それらは自動的に実際のタプルに変換されます。
iex(6)> Macro.to_string {:{}, [], [1, 2, 3]}
"{1, 2, 3}"
をあなたは入門ガイドQuote and unquote -> Escapingにこれについての詳細な情報を見つけることができます。私たちはMacro.to_string/2
を使用していることがわかります。