访问本地和全局作用域并操作这些作用域的任何可能性。也许类似于这个python示例:
def foo():
x = 10
globals().update(locals()) # update global parameters
print(x) # continue using x
我希望在不单独对变量使用global
的情况下执行此操作。
这似乎是一个非常糟糕的编程,但这里有一种方法可以做到这一点,使用@eval
和Base.@locals
宏(@eval
在全局范围内求值(
julia> function f(a,b)
c = a*b
for (k,v) in Base.@locals
@eval $k = $v
end
end
f (generic function with 2 methods)
julia> f(2,3)
julia> a
2
julia> b
3
julia> c
6
julia> f("a", "b")
julia> a
"a"
julia> b
"b"
julia> c
"ab"
以下是@MarcMush作为宏的答案:
julia> macro horribile_dictu()
return quote
for (name, value) in Base.@locals()
eval(:(global $name = $value))
end
end
end
@horribile_dictu (macro with 1 method)
julia> @macroexpand let x = 1
@horribile_dictu()
end
:(let x = 1
#= REPL[29]:2 =#
begin
#= REPL[28]:3 =#
for (var"#3#name", var"#4#value") = $(Expr(:locals))
#= REPL[28]:4 =#
Main.eval(Core._expr(:global, Core._expr(:(=), var"#3#name", var"#4#value")))
end
end
end)
julia> let x = 1
@horribile_dictu()
end
julia> x
1
julia> function foo()
x = 10
@horribile_dictu()
end
foo (generic function with 1 method)
julia> foo()
julia> print(x)
10
julia>
重复:避免这种情况。