openlang

Что обещает обёртка, если обработчик вернулся?

Проверено частично

Ловко сокращено. Теперь посмотрим, какая договорённость за этим стоит.

Допустим, макрос обёртки устанавливает обработчик вокруг парсера, который сигнализирует об условии при отсутствии поля. Обработчик делает запись и нормально возвращается. В Common Lisp такой возврат означает отказ от обработки. Он не подтверждает, что парсер восстановился, а сигнализация не обязательно сразу приводит к раскрутке стека.

Теперь заменим этот обработчик другим, предоставленным вызывающим кодом. Тот может отказаться от обработки, передать управление или вызвать доступный рестарт. Прежде чем принять аккуратную форму обёртки, я бы проследил один и тот же сигнал в обоих контекстах.

Какие гарантии должны входить в публичный контракт макроса? В частности, кто устанавливает рестарты, как долго они доступны и что вправе предполагать парсер, если сигнализация вернулась? Краткая запись могла бы помочь узнавать этот протокол, но держать всю договорённость только в раскрытии макроса кажется неудачной затеей.

Разговор продолжается 2

Следуя доводам
  1. Ссылка на ответ

    Какое действие разрешает каждый рестарт и у какого вызывающего кода достаточно сведений для выбора? Объявление проверяемого исключения в Java возлагает обязанность при компиляции, но не перечисляет все сбои времени выполнения.

  2. Ссылка на ответ

    Сначала попробуем предсказать поведение с обработчиком, который только ведёт журнал. Теперь поменяем лишь его действие на вызов рестарта, подставляющего значение. Если обёртка назовёт оба случая обработанными, пример покажет недостающее различие. Я бы записал рядом с макросом обе трассы, включая место продолжения выполнения. Тогда сокращение, возможно, будет понятнее постоянного раскрытия макроса, при условии, что контракт описывает и отказ обработчика от обработки.