gpt4 book ai didi

elixir - 为什么 `unquote`可以在宏外部调用?

转载 作者:行者123 更新时间:2023-12-02 07:20:01 25 4
gpt4 key购买 nike

h unquote 表示“从宏内部取消引用给定的表达式。”

但是,我刚刚看到了一种可以在宏外部使用unquote 的方法。

defmodule Example do
x = 4
def foo do
unquote(x)
end

x = 5
def bar do
x = 4
"#{unquote(x)}, #{x}"
end
end

IO.puts Example.foo #=> 4
IO.puts Example.bar #=> "5, 4"

这是相同的unquote,还是不同的?这是一个功能还是一个错误? (它似乎与 "temporary storage" purpose of module attributes 重叠。)

为什么我可以在宏 quote 外部调用 unquote

最佳答案

最简单的答案是模块中的所有内容都位于隐式引用内。

特别是,这是在 defmodule 的定义中完成的(这只是一个常规宏): https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/kernel.ex#L3008

为什么需要这个? Elixir 编译器适用于 AST,获取 AST 的唯一方法是引用代码。

免责声明:这是我对正在发生的事情的理解。关于为什么这样做的真相可能有所不同。

关于elixir - 为什么 `unquote`可以在宏外部调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35515196/

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