일회성 연속과 dynamic-wind

현재 `call/cc`는 명시적 평가기 신호로 구현한 위쪽 방향 탈출 전용 비재진입 일회성 연속입니다.

언제 필요한가요?

먼저 평범한 if, cond, 프로시저를 사용하세요. 깊이 중첩된 계산에서 위쪽으로 한 번 탈출해야 할 때만 call/cc를, 그 탈출 전후의 진입·정리를 묶어야 할 때 dynamic-wind를 선택합니다.

실행으로 확인하기

LISPEX
(call/cc (lambda (escape) (escape 'done) 'unreachable))

관측 결과

OUTPUT
done

예제 읽기

call/cc가 탈출 프로시저를 람다에 넘깁니다. 이를 done으로 호출하면 그 값이 감싸는 call/cc로 즉시 전달되어 뒤의 unreachable은 평가되지 않습니다. 이 전송으로 탈출 연속은 소비됩니다.

이 순서로 생각하세요

  • 첫 호출은 전이 전에 연속을 원자적으로 소비하며 이후 모든 호출은 E340입니다.
  • dynamic-windbefore, thunk, after 순서이며 unwind는 대기 중인 after를 안쪽부터 실행합니다.
  • after thunk의 새 오류·탈출은 진행 중이던 신호를 대체합니다.

빠르게 고르기

필요한 것우선 선택이유
일반적인 선택if 또는 cond로컬 제어 흐름이 눈에 보임
도우미 결과 반환평범한 프로시저 결과비로컬 전송이 없음
중첩 호출 여러 겹을 한 번 벗어나기call/cc 탈출명시적 위쪽 출구 하나
탈출 전후 정리dynamic-wind풀릴 때 after 실행
같은 지점을 여러 번 재개흐름 재설계연속은 일회용이며 재진입 불가

흔한 오해

다회 연속 재사용과 동적 컨텍스트 재진입은 보류되어 있습니다.

현재 경계

  • 호스트 예외와 호스트 연속은 게스트 전이를 구현하지 않습니다.

다음으로

일반 제어 흐름은 조건식에서, 오류와 명시적 평가기 신호의 관계는 진단에서 이어집니다.

조건식 · 진단