表达式依序求值,就像它们是在 progn
里一样。在这段代码里的任何地方,一个带有特定标签的 throw
会导致 表达式直接返回:
调用 error
同时中断了执行,本来会将控制权转移到调用树(calling tree)的更高点,取而代之的是,它将控制权转移给 Lisp 错误处理器(error handler)。通常会导致调用一个中断循环(break loop)。以下是一个假定的 Common Lisp 实现可能会发生的事情:
关于错误与状态的更多讯息,参见 14.6 小节以及附录 A。
在这里,即便 throw
将控制权交回监测的 catch
, 确保控制权移交时,第二个表达式有被求值。无论何时,一个确切的动作要伴随着某种清理或重置时, unwind-protect
可能会派上用场。在 121 页提到了一个例子。