R6RS Scheme: 연속체
R6RS Scheme: 연속체
Scheme의 연속체(continuation) 개념을 설명해요. 계산의 미래를 나타내는 연속체와 call-with-current-continuation 프로시저를 다뤄요.
출처: 문서
본문
Scheme 표현식이 평가될 때마다 그 표현식의 결과를 원하는 *연속체(continuation)*가 존재해요. 연속체는 계산의 (기본적인) 전체 미래를 나타내요. 예를 들어, 비공식적으로 표현식
(+ 1 3)
에서 3의 연속체는 그것에 1을 더해요. 보통 이러한 어디에나 있는 연속체들은 배후에 숨겨져 있어서 프로그래머가 크게 생각하지 않아요. 그러나 드물게 프로그래머가 연속체를 명시적으로 다뤄야 할 때가 있어요. call-with-current-continuation 프로시저(11.15절 참조)는 현재 연속체를 복원하는 프로시저를 만들어 Scheme 프로그래머가 그렇게 할 수 있게 해줘요. call-with-current-continuation 프로시저는 프로시저를 받아서, *탈출 프로시저(escape procedure)*인 인자로 즉시 호출해요. 이 탈출 프로시저는 나중에 인자로 호출될 수 있는데, 그 인자가 call-with-current-continuation 호출의 결과가 돼요. 즉, 탈출 프로시저는 자신의 연속체를 버리고, call-with-current-continuation 호출의 연속체를 복원해요.
다음 예에서, 인자에 1을 더하는 연속체를 나타내는 탈출 프로시저가 escape에 바인딩되고, 그런 다음 인자 3으로 호출돼요. escape 호출의 연속체는 버려지고, 대신 3이 1을 더하는 연속체로 전달돼요:
(+ 1 (call-with-current-continuation
(lambda (escape)
(+ 2 (escape 3))))) ⇒ 4
탈출 프로시저는 무한한 수명(extent)을 가져요: 그것이 포착한 연속체가 호출된 후에도 호출될 수 있고, 여러 번 호출될 수도 있어요. 이것은 call-with-current-continuation을 다른 언어의 예외와 같은 전형적인 비지역적 제어 구문보다 훨씬 강력하게 만들어요.