Macros 有没有一种简单的方法可以查看Elixir宏的扩展情况?
在过去18个月左右的时间里,Elixir一直是我的goto语言,但是我有时会发现“没有魔法”的咒语(特别是引用Phoenix vs Rails)和宏的使用之间存在着紧张关系 虽然我现在在使用没有宏的语言时会想念宏,但我还是希望更容易看到它们实际上在做什么。我的某些部分总是想拉开DSL的帷幕,看看真正的代码Macros 有没有一种简单的方法可以查看Elixir宏的扩展情况?,macros,elixir,Macros,Elixir,在过去18个月左右的时间里,Elixir一直是我的goto语言,但是我有时会发现“没有魔法”的咒语(特别是引用Phoenix vs Rails)和宏的使用之间存在着紧张关系 虽然我现在在使用没有宏的语言时会想念宏,但我还是希望更容易看到它们实际上在做什么。我的某些部分总是想拉开DSL的帷幕,看看真正的代码 有没有一种简单的方法可以扩展宏并查看它们生成的代码(可能是通过IEx),这样我就不必在脑海中钻研defmacro的各个层来拼凑它。您可以使用 然后,您可以使用将输出作为字符串而不是AST获取:
有没有一种简单的方法可以扩展宏并查看它们生成的代码(可能是通过IEx),这样我就不必在脑海中钻研defmacro的各个层来拼凑它。您可以使用 然后,您可以使用将输出作为字符串而不是AST获取:
iex> Macro.expand((quote do: (if true, do: 1)), __ENV__) |> Macro.to_string()
"case(true) do\n x when x in [false, nil] ->\n nil\n _ ->\n 1\nend"
然后,您可以使用将字符串打印到终端:
iex> Macro.expand((quote do: (if true, do: 1)), __ENV__) |> Macro.to_string() |> IO.puts()
case(true) do
x when x in [false, nil] ->
nil
_ ->
1
end
试试克里斯·麦考德的这个把戏:
your_ast |> Macro.expand(__ENV__) |> Macro.to_string |> IO.puts
如果我的宏在一个模块中,但我仍然希望看到它扩展成这样,我该怎么做?
your_ast |> Macro.expand(__ENV__) |> Macro.to_string |> IO.puts