在本地范围内访问变量并将它们添加到 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 变量的情况下执行此操作。

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

重复一遍:避免这种情况。