2011-11-23 39 views
3

我已經定義了一個接受拉姆達一個布爾傑斯功能,如下所示:傳遞lambda表達式與論據傑西

(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 

我想不出我在做什麼錯在這裏。爲什麼這對於不帶參數的函數有效,但對於帶參數的函數不起作用?更重要的是:我該如何做這項工作?

回答

2

Jess lambda沒有關閉,所以?x在執行該功能時不可用。在Jess中執行命令的方式是通過評估字符串;我們希望在返回時將?x的值硬編碼到函數中,所以我們需要在函數被彙編時評估?x。像這樣的東西可以正常工作:

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

謝謝,這確實有效! – jqno