2017-03-12 3 views

답변

1

Sylwester의 솔루션의 변형이 방법으로 계속 사용

(define (example n) 
    (call-with-current-continuation 
    (lambda (return) 
    (let loop ([n 0]) 
     (if (= n 5) ; done 
      (return 'the-result) 
      (loop (+ n 1))))))) 

(example 10) 

구현이있는 경우 하나 (call/ec로 전체 연장 대신 이스케이프 지속을 사용할 수 있습니다 탈출 지속).

+0

감사합니다. 그게 정확히 내가 필요했던거야! –

+0

취소를 계속 기다릴 필요가 없으므로 여기서'call/cc '을 사용하는 이유를 볼 수 없습니다. ''결과만으로도 성공했을 것입니다. – Sylwester

1

가장 좋은 방법은 누적기를 사용하는 것입니다. 중단은 재귀가 아닙니다.

(define (copy-unless-contains-5 lst) 
    (define (helper lst acc) 
    (cond 
     ((null? lst) (reverse acc)) 
     ((equal? (car lst) 5) #f) 
     (else (helper (cdr lst) (cons (car lst) acc))))) 
    (helper lst '())) 

당신이 연속으로 재귀하고 그 그것을하는 최적의 방법 인 경우, call-with-current-continuation 당신을 기다리고 연속 요청을 취소하고 반환하도록 선택할 수있는 방법을 제공 할 수 있습니다.

(define (copy-unless-contains-5 lst) 
    (call-with-current-continuation 
    (lambda (abort) 
    (define (helper lst) 
     (cond 
     ((null? lst) '()) 
     ((equal? (car lst) 5) (abort #f)) 
     (else (cons (car lst) (helper (cdr lst)))))) 
    (helper lst)))) 

이 마지막 버전은 지나치게 복잡합니다. 모두 동일하게 작동 :

(copy-unless-contains-5 '(1 2 3 4)) ; ==> (1 2 3 4) 
(copy-unless-contains-5 '(1 2 5 3 4)) ; ==> #f