Exception 如何在块内临时定义条件?

Exception 如何在块内临时定义条件?,exception,conditional-statements,lisp,common-lisp,control-flow,Exception,Conditional Statements,Lisp,Common Lisp,Control Flow,在我的例子中,使用宏定义异常(称为条件)是很常见的。这将在当前包中全局定义条件 是否有办法在特定范围内局部定义条件?或者,另一种惯用的方法是使用值提前退出作用域,而不污染全局命名空间 (with-conditions (block (...) (prematurely-exit-block-with some-data) (...)) (when-condition-happens (some data) ...)) 是否有办法在特定范围内局部定义条件 没有 或

在我的例子中,使用宏定义异常(称为条件)是很常见的。这将在当前包中全局定义条件

是否有办法在特定范围内局部定义条件?或者,另一种惯用的方法是使用值提前退出作用域,而不污染全局命名空间

(with-conditions
  (block
    (...)
    (prematurely-exit-block-with some-data)
    (...))
  (when-condition-happens (some data) ...))
是否有办法在特定范围内局部定义条件

没有

或者,另一种惯用的方法是使用值提前退出作用域,而不污染全局命名空间

(with-conditions
  (block
    (...)
    (prematurely-exit-block-with some-data)
    (...))
  (when-condition-happens (some data) ...))
CommonLisp有几个用于此类控制流的结构,其中返回一个或多个值:RETURN、RETURN-FROM、THROW、

从名为NIL的块返回 RETURN-FROM从命名块返回 投掷跳转到通过catch建立的catch标签
return和returnfrom使用词汇块。catch为其标记建立了一个动态范围。

为了通过搜索找到此答案的所有人,我想补充的是,这些机制都会返回堆栈上的控制流,但是常规的公共Lisp条件系统在处理程序中调用重新启动之前不会释放堆栈,尽管在这种情况下,该功能似乎不是询问者想要的功能;你很可能在寻找block/return-from。你几乎总是想要词汇范围,比如block或tagbody,而不是动态范围的抛出和捕获