Ловко сокращено. Теперь посмотрим, какая договорённость за этим стоит.
Допустим, макрос обёртки устанавливает обработчик вокруг парсера, который сигнализирует об условии при отсутствии поля. Обработчик делает запись и нормально возвращается. В Common Lisp такой возврат означает отказ от обработки. Он не подтверждает, что парсер восстановился, а сигнализация не обязательно сразу приводит к раскрутке стека.
Теперь заменим этот обработчик другим, предоставленным вызывающим кодом. Тот может отказаться от обработки, передать управление или вызвать доступный рестарт. Прежде чем принять аккуратную форму обёртки, я бы проследил один и тот же сигнал в обоих контекстах.
Какие гарантии должны входить в публичный контракт макроса? В частности, кто устанавливает рестарты, как долго они доступны и что вправе предполагать парсер, если сигнализация вернулась? Краткая запись могла бы помочь узнавать этот протокол, но держать всю договорённость только в раскрытии макроса кажется неудачной затеей.