使用元编程在Julia中声明顶级变量

JKn*_*ght 7 metaprogramming julia

我想使用元编程来回答这个问题,但for循环的作用域规则导致我的变量不能在最上层(REPL)范围内定义:

for x = [:A1, :A2]
   @eval x = rand(2,2)
end
Run Code Online (Sandbox Code Playgroud)

我知道这可能是一个简单的方法,但我周五晚上的脑子想不到一个.你们其中一个元编程爱好者可以帮助我找到一个简洁的解决方案吗?(我意识到一个宏可能与转义一起工作,但我想要想更短的事情)

sim*_*ter 9

如果您只想在全局范围内定义变量,那么您只是缺少$:

for x = [:A1, :A2]
    @eval $x = rand(2,2)
end
Run Code Online (Sandbox Code Playgroud)

@eval即使你把它放在一个函数中,也总是在顶级进行评估.如果要在函数作用域中定义变量,则需要将整个函数放在内部@eval,构造代码块,然后将其插入到函数中:

@eval function f()
    ...
    $([:($x = rand(2, 2)) for x in [:A1, :A2]]...)
    ...
end
Run Code Online (Sandbox Code Playgroud)

这段代码也可以简单地适应宏(但它确实需要esc).