Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros 有没有一种简单的方法可以查看Elixir宏的扩展情况?_Macros_Elixir - Fatal编程技术网

Macros 有没有一种简单的方法可以查看Elixir宏的扩展情况?

Macros 有没有一种简单的方法可以查看Elixir宏的扩展情况?,macros,elixir,Macros,Elixir,在过去18个月左右的时间里,Elixir一直是我的goto语言,但是我有时会发现“没有魔法”的咒语(特别是引用Phoenix vs Rails)和宏的使用之间存在着紧张关系 虽然我现在在使用没有宏的语言时会想念宏,但我还是希望更容易看到它们实际上在做什么。我的某些部分总是想拉开DSL的帷幕,看看真正的代码 有没有一种简单的方法可以扩展宏并查看它们生成的代码(可能是通过IEx),这样我就不必在脑海中钻研defmacro的各个层来拼凑它。您可以使用 然后,您可以使用将输出作为字符串而不是AST获取:

在过去18个月左右的时间里,Elixir一直是我的goto语言,但是我有时会发现“没有魔法”的咒语(特别是引用Phoenix vs Rails)和宏的使用之间存在着紧张关系

虽然我现在在使用没有宏的语言时会想念宏,但我还是希望更容易看到它们实际上在做什么。我的某些部分总是想拉开DSL的帷幕,看看真正的代码


有没有一种简单的方法可以扩展宏并查看它们生成的代码(可能是通过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