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

时间:2014-09-27 04:33:23

标签: metaprogramming julia

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

for x = [:A1, :A2]
   @eval x = rand(2,2)
end

我知道这可能是一个简单的方法,但我周五晚上的大脑无法想到一个。你们其中一个元编程爱好者可以帮助我找到一个简洁的解决方案吗? (我意识到一个宏可能适用于逃避,但我试图想到更短的东西)

1 个答案:

答案 0 :(得分:7)

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

for x = [:A1, :A2]
    @eval $x = rand(2,2)
end

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

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

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