2011-11-23 6 views
3

에 인수 람다 전달 : 이것은 잘 작동다음과 같이 내가 람다을 받아 부울 제스 기능을 정의 제스

(bind ?condition1 (at-least 1 (lambda (?arg) (= ?arg 0)) ?a ?b ?c)) 
(bind ?condition2 (at-least 2 (lambda (?arg) (< ?arg 0)) ?a ?b ?c)) 

다음과 같이 내가 호출 할 수 있습니다

(deffunction at-least(?n ?lambda $?values) 
    (>= (length$ (filter ?lambda ?values)) ?n)) 

. 그러나 나는 많은 다른 장소에서 같은 람다를 사용, 그래서 나는 그들을 위해 일부 기능을 정의하여 코드가 좀 더 간결하고 싶습니다 :

(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 람다는 클로저가 아니므로 ?x을 사용할 수 없습니다. Jess에서 실행 순서를 속이는 방법은 문자열을 평가하는 것입니다. 우리는? x 값이 반환 될 때 함수에 하드 코딩하기를 원하므로 함수가 어셈블 될 때? x를 평가해야합니다. 이 같은 것이 제대로 작동합니다.

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

감사합니다. 실제로 작동합니다. – jqno