我想使用元编程来回答this question,但for循环的范围规则导致我的变量不能在最上层(REPL)范围内定义:
for x = [:A1, :A2]
@eval x = rand(2,2)
end
我知道这可能是一个简单的方法,但我周五晚上的大脑无法想到一个。你们其中一个元编程爱好者可以帮助我找到一个简洁的解决方案吗? (我意识到一个宏可能适用于逃避,但我试图想到更短的东西)
答案 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
)。