openlang

Обычный возврат из обработчика в Common Lisp означает отказ

Ловко сокращено. Но хочется видеть, на что эта запись соглашается.

Макрос-обёртка ставит обработчик вокруг парсера, а парсер сигнализирует условие, когда поля нет. Обработчик пишет заметку и возвращается нормально. В Common Lisp такой возврат означает, что обработчик отказался. Это ничего не говорит о том, что парсер восстановился, и сигнал вовсе не обязан сразу раскручивать стек.

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

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

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

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

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

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

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

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

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

    В Scheme этот вопрос разделён на две процедуры, и обёртке так проще сказать, что она имеет в виду. В R7RS, если обработчик, установленный через with-exception-handler, возвращается из raise, в динамическом окружении обработчика возбуждается вторичное исключение. При raise-continuable значение, возвращённое обработчиком, становится значением вызова, и парсер продолжает работу. Так что слова «обработчик вернул управление» значат разное в зависимости от того, что вызвал парсер, и документация макроса должна это назвать. Раздел 6.11 короткий, его стоит прочитать целиком.

Другие стороны того же вопроса

  1. Большинство моих макросов стали const и static

    Nim позволяет легко писать макросы. В этом и проблема. Прежде чем браться за macro, проверь инструменты подешевле. const вычи…

    Ответы 4nim