Какой смысл перезапускать обработчики?

Должен быть перезапущен обработчик signalиз другого обработчика, или это может быть signalнепосредственно код, где было обнаружено исключительное состояние?

Если это должно быть signalиз-за обработчика, почему это так? это кажется лишним лишним шагом.

Какова дополнительная ценность обработчика перезапуска по сравнению с обычным обработчиком; если мы вообще обойдемся без обработчиков перезапуска (но не с обычными обработчиками)? Будет ли это иметь какое-либо значение в отношении силы или выразительности языка?

1 ответ

Решение

Следующий ответ должен быть взят с зерном соли. Он основан на моем понимании раздела "Условия" в "Справочном руководстве Дилана", однако я никогда не писал ни одной строчки кода Дилана и даже не прочитал намного больше справочного руководства, чем указанный раздел.

Должен ли обработчик перезапуска сигнализироваться из другого обработчика, или он может сигнализироваться напрямую кодом, в котором было обнаружено исключительное состояние?

restart это condition, как показано на рисунке 11-6 справочного руководства. Может быть signal каждый раз, когда signal утверждение синтаксически допустимо. Специального механизма установки обработчиков для restart условия в отличие от обработчиков для restart условия (в отличие от таких языков, как Common Lisp и R).

Единственная разница в сигнализации restart в отличие от сигнализации не restart условие состоит в том, что если restart обработчик signal из другого обработчика, остальная часть кода обработчика, который лексически следует за signal не будет выполнен, даже если restart обработчик возвращает. В этом случае выполнение обработчика, который signal -ед restart, а также выполнение обработчиков, вызвавших этот обработчик, останавливается и значения, возвращаемые restart Обработчики становятся значениями, возвращаемыми каждым из этих обработчиков. ("Если обработчик перезапуска возвращает некоторые значения, сигнал возвращает эти значения, и обработчик, который вызвал сигнал, также возвращает их. Вызов сигнала от блока сигнализации, который сигнализировал исходное состояние, возвращает те же значения, и блок сигнализации восстанавливается в соответствии с указаниями эти значения." Перезагрузки / Справочное руководство Дилана).

Мне не ясно, что произойдет, если restart Обработчик выполняет нелокальный выход, ориентируясь на местоположение внутри блока, где restart обработчик был signal -ed.

Какова дополнительная ценность обработчика перезапуска по сравнению с обычным обработчиком; если мы вообще обойдемся без обработчиков перезапуска (но не с обычными обработчиками)? Будет ли это иметь какое-либо значение в отношении силы или выразительности языка?

restart механизм, по сути, switch операторы, условие выбора которых определяется динамически кодом, внешним по отношению к функции, где switch утверждение определено. restart сигнал может быть эмулирован не restart состояние, но restart Механизм предоставляет две формальные возможности, которые в противном случае должны были бы быть установлены конвенцией для достижения аналогичной функциональности:

  1. Когда restart обработчик возвращается после того, как signal из другого обработчика, остальная часть кода в другом обработчике автоматически пропускается, и обработчик возвращает значения, возвращаемые restart обработчик.
  2. restart условие может быть формально идентифицировано его типом. Если бы не было restart типа, некоторые другие соглашения должны соблюдаться, если это было бы желательно для restart условия, которые можно идентифицировать, например, для целей перечисления их в меню "Восстановление " отладчика ("Интерактивный отладчик должен предлагать пользователю возможность сообщать о любом перезапуске, для которого применяется обработчик перезапуска, и возвращаться, если протокол восстановления условия позволяет ему" Это можно сделать, например, с помощью меню "Восстановление" (" Протоколы восстановления" / "Справочное руководство Дилана").
Другие вопросы по тегам