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