在本地范围内访问变量并将它们添加到 Julia 中的全局范围
Accessing variables in local scope and adding them to global scope in Julia
访问本地和全局范围并对其进行操作的任何可能性。也许类似于此 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>
重复一遍:避免这种情况。
访问本地和全局范围并对其进行操作的任何可能性。也许类似于此 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>
重复一遍:避免这种情况。