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

Calling Julia macro with runtime-dependent argument

我想使用依赖于运行时的参数调用 Julia 包中的宏(@defNLExpr 在 JuMP 中)。参数是一个依赖于运行时参数 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 的值确定)才会真正执行。

虽然这似乎可行,但有没有更有效的方法来实现它?

您似乎在寻找 eval?请注意,它应该小心使用,并且它不是很快,因为它每次调用时都必须进入编译器。

如果它在全局范围内计算表达式对您来说是一个限制,那么有一些方法可以解决这个问题。