必须signal
从另一个处理程序中 -ed 重新启动处理程序,还是可以signal
直接由检测到异常情况的代码 -ed?
如果必须signal
从处理程序中 -ed,为什么会这样?这似乎是一个不必要的额外步骤。
与常规处理程序相比,重新启动处理程序的附加值是多少?如果我们完全放弃了重新启动处理程序(但没有使用常规处理程序)?它对语言的力量或可表达性有什么影响吗?
必须signal
从另一个处理程序中 -ed 重新启动处理程序,还是可以signal
直接由检测到异常情况的代码 -ed?
如果必须signal
从处理程序中 -ed,为什么会这样?这似乎是一个不必要的额外步骤。
与常规处理程序相比,重新启动处理程序的附加值是多少?如果我们完全放弃了重新启动处理程序(但没有使用常规处理程序)?它对语言的力量或可表达性有什么影响吗?
以下答案应该持保留态度。它基于我对“The Dylan Reference Manual”中“Conditions”部分的理解,但是我从未编写过任何 Dylan 代码,甚至没有阅读过比上述部分更多的参考手册。
重新启动处理程序必须从另一个处理程序中发出信号,还是可以直接由检测到异常情况的代码发出信号?
Arestart
为 a condition
,如参考手册的图 11-6所示。只要语句在语法上有效,就可以使用signal
-ed 。与非条件处理程序相比,signal
没有为条件安装处理程序的特殊机制(与 Common Lisp 和 R 等语言相反)。restart
restart
restart
发出 a信号与发出非条件信号的唯一区别restart
是,如果一个restart
处理程序是signal
从另一个处理程序中 -ed 的,那么signal
即使restart
处理程序返回,在词法上跟随 -ing 的其余处理程序代码也不会被执行。在这种情况下,signal
-ed 的处理程序restart
的执行以及调用此处理程序的处理程序的执行将停止,并且处理程序返回的restart
值成为每个处理程序返回的值。(“如果重启处理程序返回一些值,信号返回这些值,调用信号的处理程序也返回它们。从发出原始条件信号的信号单元调用信号返回相同的值,并且信号单元按照那些指示恢复价值观。” 重新启动/Dylan 参考手册)。
我不清楚如果处理程序执行针对处理程序restart
所在单元内的位置的非本地退出会发生什么。restart
signal
与常规处理程序相比,重新启动处理程序的附加值是多少?如果我们完全放弃了重新启动处理程序(但没有使用常规处理程序)?它对语言的力量或可表达性有什么影响吗?
该restart
机制实际上是一个switch
语句,其选择条件由switch
定义语句的函数外部的代码动态确定。一个restart
信号可以通过一个非restart
条件来模拟,但是该restart
机制提供了两个正式的设施,否则必须按照惯例建立这些设施才能实现类似的功能:
restart
处理程序在从另一个处理程序中被signal
-ed 后返回时,另一个处理程序中的其余代码将自动跳过并且该处理程序返回该处理程序返回的值restart
。restart
条件可以通过其类型正式标识。如果没有restart
类型,则需要遵循一些其他约定,如果restart
条件是可识别的,例如为了在调试器的恢复菜单中列出它们(“交互式调试器应该为用户提供能力指示任何重启处理程序适用的重启,并在条件的恢复协议允许时返回。例如,这可以通过标题为“恢复”的菜单完成。“ 恢复协议/迪伦参考手册)