gpt4 book ai didi

macros - 有没有一种简单的方法可以查看 Elixir 宏扩展到的内容?

转载 作者:行者123 更新时间:2023-12-04 00:49:37 24 4
gpt4 key购买 nike

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

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

有没有一种简单的方法来扩展宏并查看它们生成的代码(也许通过 IEx),这样我就不必在我的脑海中挖掘 defmacro 的层级试图将它们拼凑起来。

最佳答案

您可以使用 Macro.expand/2 扩展宏

iex> Macro.expand((quote do: (if true, do: 1)), __ENV__)
{:case, [optimize_boolean: true],
[true,
[do: [{:->, [],
[[{:when, [],
[{:x, [counter: 6], Kernel},
{:in, [context: Kernel, import: Kernel],
[{:x, [counter: 6], Kernel}, [false, nil]]}]}], nil]},
{:->, [], [[{:_, [], Kernel}], 1]}]]]}

然后您可以使用 Macro.to_string/2将输出作为字符串而不是 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"

然后您可以使用 IO.puts/2将字符串打印到终端:
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

关于macros - 有没有一种简单的方法可以查看 Elixir 宏扩展到的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35204849/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com