Julia 生成表达式,然后将其签入

Julia 生成表达式,然后将其签入,julia,eval,code-generation,Julia,Eval,Code Generation,我的目标是能够生成一个表达式列表,例如,检查一个数字是否在某个时间间隔内,然后对其求值 我可以用下面的方法来做。 首先,创建这样一个Expr的函数genExpr: function genExpr(a::Real, b::Real)::Expr quote x < $(a + b) && x > $(a - b) end end 现在,我的问题是如何将这些表达式与数字x一起传递给函数。然后,这个函数检查这样一个数字是否同时满足这两个条件。我能够通过以

我的目标是能够生成一个表达式列表,例如,检查一个数字是否在某个时间间隔内,然后对其求值

我可以用下面的方法来做。 首先,创建这样一个
Expr
的函数
genExpr

function genExpr(a::Real, b::Real)::Expr
  quote
    x < $(a + b) && x > $(a - b)
  end
end
现在,我的问题是如何将这些表达式与数字
x
一起传递给函数。然后,这个函数检查这样一个数字是否同时满足这两个条件。我能够通过以下功能实现它:

function applyTest(y::Real, vars::Expr...)::Bool
  global x = y
  for var in vars
    if eval(var)
      return true
    end
  end
  return false
end

这是可行的,但出现的
global
表明存在一种更好的方法来实现同样的目标。这就是我的问题:创建一个带有参数、数字和
Expr
列表的函数。如果满足任何条件,该函数将返回
true
,否则返回
false

这看起来像是您可能正在使用宏查看的一个:

macro genExpr(a::Real, b::Real)
  quote
    x-> x < $(a + b) && x > $(a - b)
  end
end

function applyTest(y::Real, vars::Function...)::Bool
    any(var(y) for var in vars)
end
但是,使用此简单代码,只生成lambda的函数也同样适用:

function genExpr2(a::Real, b::Real)
  return x-> x < (a + b) && x > (a - b)
end
函数genExpr2(a::Real,b::Real) 返回x->x<(a+b)和&x>(a-b) 结束
julia> e1 = @genExpr(0,3)
#15 (generic function with 1 method)

julia> e2 = @genExpr(8,2)
#17 (generic function with 1 method)

julia> applyTest(0,e1,e2)
true
function genExpr2(a::Real, b::Real)
  return x-> x < (a + b) && x > (a - b)
end