在Jess中传递带有参数的lambdas

时间:2011-11-23 10:05:07

标签: lambda jess

我已经定义了一个接受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

我无法弄清楚我在这里做错了什么。为什么这对没有参数的函数有效,但对于带参数的函数却没有用?更重要的是:我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

Jess lambdas不是闭包,因此执行函数时?x不可用。在Jess中愚弄执行顺序的方法是评估字符串;我们想在函数返回时将?x的值硬编码到函数中,因此我们需要在函数汇编时评估?x。像这样的东西可以正常工作:

(deffunction fn-less-than(?x)
    (eval (str-cat "(lambda (?arg) (< ?arg " ?x "))")))