Какой смысл перезапускать обработчики?
Должен быть перезапущен обработчик 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
Механизм предоставляет две формальные возможности, которые в противном случае должны были бы быть установлены конвенцией для достижения аналогичной функциональности:
- Когда
restart
обработчик возвращается после того, какsignal
из другого обработчика, остальная часть кода в другом обработчике автоматически пропускается, и обработчик возвращает значения, возвращаемыеrestart
обработчик. -
restart
условие может быть формально идентифицировано его типом. Если бы не былоrestart
типа, некоторые другие соглашения должны соблюдаться, если это было бы желательно дляrestart
условия, которые можно идентифицировать, например, для целей перечисления их в меню "Восстановление " отладчика ("Интерактивный отладчик должен предлагать пользователю возможность сообщать о любом перезапуске, для которого применяется обработчик перезапуска, и возвращаться, если протокол восстановления условия позволяет ему" Это можно сделать, например, с помощью меню "Восстановление" (" Протоколы восстановления" / "Справочное руководство Дилана").