访问本地作用域中的变量,并将它们添加到Julia中的全局作用域中



访问本地和全局作用域并操作这些作用域的任何可能性。也许类似于这个python示例:

def foo():
x = 10
globals().update(locals()) # update global parameters
print(x) # continue using x

我希望在不单独对变量使用global的情况下执行此操作。

这似乎是一个非常糟糕的编程,但这里有一种方法可以做到这一点,使用@evalBase.@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> 

重复:避免这种情况。

相关内容

  • 没有找到相关文章

最新更新