gpt4 book ai didi

macros - Julia 宏中的无效赋值错误

转载 作者:行者123 更新时间:2023-12-05 03:31:47 26 4
gpt4 key购买 nike

我一直在关注 this笔记本(最初是用 Julia 0.x 编写的,我使用的是 Julia 1.7.1)。其中一个单元格定义了以下宏。

macro twice(ex)
quote
$ex
$ex
end
end

在紧邻的下一个单元格中,调用此宏。

x = 0
@twice println(x += 1)

在 REPL 中复制它(为简洁起见)会导致以下错误。

ERROR: syntax: invalid assignment location "Main.x" around REPL[1]:3
Stacktrace:
[1] top-level scope
@ REPL[4]:1

所以,我知道 x += 1 以某种方式导致了这个问题,但是在查看文档 ( metaprogramming ) 之后,我无法弄清楚 为什么这是一个分配无效或如何解决此问题。

@macroexpand @twice println(x += 1) 成功返回以下内容。

quote
#= REPL[1]:3 =#
Main.println(Main.x += 1)
#= REPL[1]:4 =#
Main.println(Main.x += 1)
end

因此,我尝试在没有 Main. 的顶层对它进行 eval,它成功求值了。

x = 0
eval(quote
println(x += 1)
println(x += 1)
end)

输出:

1
2

但是,如果我显式添加模块名称,它会抛出不同的错误。

eval(quote
Main.println(Main.x += 1)
Main.println(Main.x += 1)
end)
ERROR: cannot assign variables in other modules
Stacktrace:
[1] setproperty!(x::Module, f::Symbol, v::Int64)
@ Base ./Base.jl:36
[2] top-level scope
@ REPL[14]:3
[3] eval
@ ./boot.jl:373 [inlined]
[4] eval(x::Expr)
@ Base.MainInclude ./client.jl:453
[5] top-level scope
@ REPL[14]:1

我尝试了一些其他的东西,但这些是我认为可能有所作为的唯一东西。

  • 为什么第一个宏代码块中的赋值无效?是否出于与指定模块 Main 指定的顶层中的 eval 失败相同的原因?
  • 如何规避这种无效分配,或者如何将其移植到 Julia 1.7?

最佳答案

使用 esc(这“防止宏卫生传递将嵌入变量转换为 gensym 变量”):

julia> macro twice(ex)
esc(quote
$ex
$ex
end)
end;

julia> x=1
1

julia> @twice println(x += 1)
2
3

关于macros - Julia 宏中的无效赋值错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70591858/

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