使用依赖于运行时的参数调用Julia宏

时间:2016-02-17 10:48:42

标签: macros runtime metaprogramming julia

我想使用与运行时相关的参数调用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范围内。我使用macro2n的这些不同可能值构建所有可能的表达式,并为每个值调用外部宏(我已在此处用简化的macro1替换) 。对macro1的调用位于if语句中,因此实际上只会执行正确的(在运行时从n的值确定)。

虽然这似乎有效,但有没有更有效的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

似乎您可能正在寻找eval?请注意,它应该谨慎使用,并且它不是非常快,因为它必须在每次调用时为编译器收入。

如果你在全局范围内评估表达式是对你的限制,那么有一些方法可以解决这个问题。