生成表达式然后在 Julia 中检查它们
generating expressions and then checking them in Julia
我的目标是能够生成一个表达式列表,p.g,检查一个数字是否在某个区间内,然后对其求值。
我能够通过以下方式做到这一点。
首先,创建这样一个 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
列表的函数。这样的功能 returns 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
我的目标是能够生成一个表达式列表,p.g,检查一个数字是否在某个区间内,然后对其求值。
我能够通过以下方式做到这一点。
首先,创建这样一个 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
列表的函数。这样的功能 returns 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