julia - 生成表达式,然后在 Julia 中检查它们

标签 julia eval code-generation

我的目标是能够生成表达式列表,例如,检查数字是否在某个区间内,然后对其进行评估。

我能够通过以下方式做到这一点。 首先,创建这样一个 Expr 的函数 genExpr:

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

创建两个表达式:

e1 = genExpr(0,3)
e2 = genExpr(8,2)

现在,我的问题是如何将这些表达式与数字 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

测试:

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

但是,使用这个简单的代码,只需生成 lambda 的函数就可以了:

function genExpr2(a::Real, b::Real)
  return x-> x < (a + b) && x > (a - b)
end

关于julia - 生成表达式,然后在 Julia 中检查它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62585074/

相关文章:

julia - 如何在 Julia 中为结构创建构造函数?

julia - 如何从字典中删除键?

perl eval block 抛出 execptions 没有错误

java - java的代码生成器可用于maven吗?

c++ - 作为模板参数传递的函数

arrays - Julia - 从 UInt8 数组读取 UInt32

julia - 获取交互式 Julia session 中最后一个命令的输出,例如 Python 的下划线

javascript - 如何在 Node.js 中安全地执行未知的 Javascript 代码?

c# - 我可以在 C#/WPF 中获取绑定(bind)对象的 Type() 吗(即使绑定(bind)值为 null)?

java - Univocity - 是否可以将文件解析为运行时生成的 bean/类?