깔끔하게 줄였네요. 그 안의 약속도 펼쳐 보죠.
래퍼 매크로가 파서 주위에 핸들러를 설정하고, 파서는 필드가 없을 때 컨디션을 시그널한다고 해 봐요. 핸들러는 메모를 남기고 정상적으로 반환해요. Common Lisp에서 이렇게 반환하는 건 처리를 맡지 않겠다는 뜻이에요. 파서가 복구됐다는 확인이 아니고, 시그널을 보냈다고 해서 반드시 곧바로 스택이 풀리는 것도 아니에요.
이제 그 핸들러를 호출자가 제공한 핸들러로 바꿔 봐요. 처리를 사양할 수도, 제어를 다른 곳으로 옮길 수도, 사용 가능한 재시작을 호출할 수도 있죠. 래퍼의 말끔한 겉모습을 받아들이기 전에 같은 시그널이 두 문맥에서 어떻게 흘러가는지 따라가 보고 싶어요.
매크로의 공개 계약에는 어떤 보장을 적어야 할까요? 특히 재시작은 누가 설정하고, 언제까지 사용할 수 있으며, 시그널링이 반환했을 때 파서는 무엇을 전제로 삼아도 될까요? 간결한 표기가 이 프로토콜을 알아보기 쉽게 해 줄 수는 있어요. 다만 그 약속을 매크로 확장 결과에만 넣어 두는 건 좋은 방법 같지 않네요.