가장 쉬운 방법은 자신의 재귀 할 것입니다 : 당신이 배와 그것을 해결하려면
(define (only-one predicate lst)
(let loop ((lst lst) (seen #f))
(cond ((null? lst) seen)
((not (predicate (car lst))) (loop (cdr lst) seen))
;; from here on we know predicate is true
(seen #f) ; at least two
(else (loop (cdr lst) #t))))) ; recurse with seen as #t
을 할 수 있습니다 :
(define (only-one predicate lst)
(call/cc
(lambda (return)
(foldl (lambda (e seen)
(cond ((not (predicate e)) seen) ; keep seen (whatever it is)
(seen (return #f)) ; short circuit at second match
(else #t))) ; change seen to #t
#f
lst))))
모든 요소가 처리되기 전에 우리가 결과를 알고있는 경우에 대비하여 종료 절차를 얻기 위해 call/cc
을 사용합니다. 하나가 일치하지 않으면 #f
이고, 정확히 한 번만 있으면 #t됩니다. 이 같은
두 작품 : 당신은 배의 커널 함수가 가변 변수를 포함하는 어휘 범위를 캡처 할 수있는 경우
(only-one (lambda (x) (equal? x 1)) '(0 1 2 3 4 5)) ; ==> #t
(only-one (lambda (x) (equal? x 1)) '(2 3 4 5)) ; ==> #f
(only-one (lambda (x) (equal? x 1)) '(0 1 2 1 3 4 5)) ; ==> #f