我已经定义了一个接受lambda的布尔Jess函数,如下所示:
(deffunction at-least(?n ?lambda $?values)
(>= (length$ (filter ?lambda ?values)) ?n))
我可以打电话如下:
(bind ?condition1 (at-least 1 (lambda (?arg) (= ?arg 0)) ?a ?b ?c))
(bind ?condition2 (at-least 2 (lambda (?arg) (< ?arg 0)) ?a ?b ?c))
这很好用。但是我在很多不同的地方使用相同的lambda,所以我想通过为它们定义一些函数来使代码更简洁:
(deffunction fn-zero()
(lambda (?arg) (= ?arg 0)))
并称之为:
(bind ?condition1 (at-least 1 (fn-zero) ?a ?b ?c))
这也可以。
但是一旦我想添加一个参数,我就会收到一条错误消息。我有这段代码:
(deffunction fn-less-than(?x)
(lambda (?arg) (< ?arg ?x)))
(bind ?condition2 (at-least 1 (fn-less-than 0) ?a ?b ?c))
抛出以下异常:
jess.JessException: No such variable x
我无法弄清楚我在这里做错了什么。为什么这对没有参数的函数有效,但对于带参数的函数却没有用?更重要的是:我怎样才能做到这一点?
答案 0 :(得分:2)
Jess lambdas不是闭包,因此执行函数时?x
不可用。在Jess中愚弄执行顺序的方法是评估字符串;我们想在函数返回时将?x的值硬编码到函数中,因此我们需要在函数汇编时评估?x。像这样的东西可以正常工作:
(deffunction fn-less-than(?x)
(eval (str-cat "(lambda (?arg) (< ?arg " ?x "))")))