이 경우 계속은 call/cc
호출의 반환 값을받는 "것"입니다. 따라서 :
(display (call/cc (lambda (k) (k 12)))
는 계획에
(display 12)
Continuations를 같은 결과가 "모양과 느낌"절차처럼,하지만 그들은 실제로 절차처럼 행동하지 않습니다. 지속성을 더 잘 이해하는 데 도움이되는 한 가지 방법은 CPS 변환입니다.
CPS 변환에서 값을 반환하는 대신 대신 continuation 매개 변수를 사용하고 결과와 함께 연속을 호출합니다. 따라서 CPS로 변환 된 sqrt
함수는 (sqrt 64 k)
으로 호출되고 8을 반환하는 대신 tail 위치에 (k 8)
을 호출합니다.
연속 (CPS 변환 기능에서)이 꼬리로 호출되므로이 함수는 연속 반환에 대해 걱정할 필요가 없으며 사실 대부분의 경우 반환 할 것으로 예상되지 않습니다. 이것을 염두
여기 함수의 간단한 예이다 :
(define (hypot x y)
(sqrt (+ (* x x) (* y y))))
및 CPS-변형 버전 :
(define (hypot x y k)
(* x x (lambda (x2)
(* y y (lambda (y2)
(+ x2 y2 (lambda (sum)
(sqrt sum k))))))))
(*
가 +
, 그리고 sqrt
모든되었다고 가정 계속 논증을 수용하기 위해 CPS 변환 됨). 그래서 지금
, 흥미로운 부분 :
call/cc
이해하기 쉽고 구현하기 쉽고, CPS 변환으로
(define (call/cc fn k)
(fn k k))
하십시오 call/cc
CPS-변화는 다음과 같이 정의되어있다. CPS 변환이 없다면, call/cc
은 (예를 들어, 스택 복사 등을 통해) 매우 마법적인 구현이 필요할 것입니다.