RESTART-BIND — 리스타트를 직접 설치하는 매크로

RESTART-BIND — 리스타트를 직접 설치하는 매크로

조건 시스템에서 with-condition-restarts, restart-case 같은 매크로가 내부적으로 쓰는, 가장 저수준에 가까운 리스타트 설치 매크로예요. restart-bind는 리스타트에 이름과 처리 함수, 그리고 보고·테스트 방식을 한꺼번에 묶어서 동적 환경에 설치해요.

출처: CLHS: Macro RESTART-BIND

시그니처

restart-bind ((name function {key-val-pair}*) form*) => results*
key-val-pair::= :interactive-function interactive-function |
                :report-function report-function |
                :test-function test-function

본문

인자와 값 (Arguments and Values)

  • name — 심볼(symbol); 평가되지 않아요.
  • function — 폼(form); 평가돼요.
  • forms — 암묵적 progn(implicit progn).
  • interactive-function — 폼; 평가돼요.
  • report-function — 폼; 평가돼요.
  • test-function — 폼; 평가돼요.
  • resultsforms가 돌려준 값(values).

설명 (Description)

restart-bindforms의 본문을, 주어진 name을 가진 리스타트들이 유효한 **동적 환경(dynamic environment)**에서 실행해요.

namenil이면 익명 리스타트(anonymous restart)를 뜻하고, nil이 아닌 심볼이면 이름이 붙은 리스타트(named restart)를 나타내요.

function, interactive-function, report-function은 본문을 평가하기 전에 현재 어휘·동적 환경에서 무조건 평가되어요. 셋 다 함수로 평가돼야 해요.

그 리스타트에 invoke-restart가 호출되면, function을 평가해 얻은 함수가 invoke-restart가 받은 인자들로 그 invoke-restart의 동적 환경 안에서 호출돼요. 그 함수는 비지역 제어 이동을 하거나, 정상적으로 복귀할 수 있어요.

리스타트를 디버거에서 invoke-restart-interactively로 대화형 호출하면, interactive-function을 평가해 얻은 함수를 호출해 인자를 기본값으로 채워요. 그 함수는 필요하면 query I/O에서 대화형으로 프롬프트를 띄울 수 있고, invoke-restart-interactively가 리스타트를 호출할 때 쓸 인자 목록을 돌려줘야 해요.

대화형으로 호출되는데 interactive-function이 없으면 인자 목록으로 nil을 써요. 그 경우 function은 빈 인자 목록과 호환돼야 해요.

리스타트가 대화형으로 표시되면 report-function을 평가해 얻은 함수를 호출해 표현돼요. 이 함수는 인자를 하나(스트림) 받는 함수여야 하고, 그 스트림에 리스타트가 취할 동작 설명을 출력해야 해요. *print-escape*nil일 때 리스타트가 출력될 때마다 이 함수가 호출돼요.

옵션별 의미는 이래요.

  • :interactive-function — 현재 어휘 환경에서 평가돼, 인자 없는 함수를 돌려줘야 해요. 그 함수가 invoke-restart-interactively가 쓸 인자 목록을 만들어요. 필요한 경우 query I/O로 대화형 프롬프트를 띄울 수 있어요.
  • :report-function — 현재 어휘 환경에서 평가돼, 인자 하나(스트림)를 받아 그 스트림에 이 리스타트가 취할 동작 요약을 출력하는 함수를 돌려줘야 해요. *print-escape*nil일 때 리스타트가 보고될 때마다 호출돼요. 옵션이 없으면 리스타트가 어떻게 보고되는지는 **구현 의존적(implementation-dependent)**이에요.
  • :test-function — 현재 어휘 환경에서 평가돼, 인자 하나(조건)를 받아 그 리스타트가 보일지(visible) 여부를 true/false로 돌려주는 함수를 돌려줘야 해요.

부수 효과 (Side Effects)

없음.

영향 (Affected By)

*query-io*.

특이 상황 (Exceptional Situations)

없음.

참고 (Notes)

restart-bind는 주로 restart-case를 구현하기 위해 쓰이고, 다른 매크로를 구현할 때도 유용해요. restart-caserestart-bind 중 뭘 쓸지 망설여진다면, restart-case가 충분히 강력한 경우엔 그것을 우선하고, 진짜로 광범위한 일반성이 필요한 경우에만 restart-bind를 쓰는 걸 권해요.

더 알아보기

  • restart-case — 리스타트를 문법적으로 간결하게 선언하는 상위 매크로
  • with-simple-restart — 간단한 리스타트 설치 매크로