我想使用与运行时相关的参数调用Juia包中的宏(JuMP中的@defNLExpr
)。参数是一个取决于运行时参数n
的表达式。我能想到这样做的唯一方法如下:
macro macro1(x)
y=length(x.args);
return esc(:(k=$y-1))
end
macro macro2(n)
x="0";
for i=1:n
x="$x+$i"
end
x=parse(x);
return :(@macro1($x))
end
n=rand(1:3)
println(n)
if (n==1)
@macro2(1)
elseif (n==2)
@macro2(2)
elseif (n==3)
@macro2(3)
else
error("expected n in 1:3")
end
println(k)
这里我假设我的运行时n
将始终在1-3范围内。我使用macro2
为n
的这些不同可能值构建所有可能的表达式,并为每个值调用外部宏(我已在此处用简化的macro1
替换) 。对macro1
的调用位于if
语句中,因此实际上只会执行正确的(在运行时从n
的值确定)。
虽然这似乎有效,但有没有更有效的方法来实现这一目标?
答案 0 :(得分:1)
似乎您可能正在寻找eval?请注意,它应该谨慎使用,并且它不是非常快,因为它必须在每次调用时为编译器收入。
如果你在全局范围内评估表达式是对你的限制,那么有一些方法可以解决这个问题。