您可以使用let块引入新上下文.这是一个宏,它做到了这一点:
macro f(s, args...)
args = [:($(esc(a.args[1])) = $(esc(a.args[2]))) for a in args]
quote
let $(args...)
$(esc(s))
end
end
end
z = 5
x = 1
@f("abc$x, $(2y), $z", x=3, y = 2x)
# "abc3, 12, 5"
Run Code Online (Sandbox Code Playgroud)
注意函数的区别,其中y = 2x将x在调用者的范围内引用,即to x=1.所以我不确定这是否是你需要的.