4

handler-case是处理 Common Lisp 条件的关键,但 Ubuntu 18.04 上的 GCL 2.6.12 认为它是一个未定义的函数:

>(handler-case (error "test") (error (condition) condition))                   
                                                                               
Error: UNDEFINED-FUNCTION :NAME HANDLER-CASE                                   
Fast links are on: do (si::use-fast-links nil) for debugging                   
Signalled by EVAL.                                                             
UNDEFINED-FUNCTION :NAME HANDLER-CASE                                          

Broken at EVAL.  Type :H for Help.                                             
    1  Return to top level.                                                    
>>

对于handler-bind.

GCL 手册中唯一明显的与处理条件或错误相关的功能是 GCL-specific universal-error-handler

在 GCL 中如何处理条件,最好以其他 Lisp 支持的方式?

4

1 回答 1

7

项目中解释了这种情况README.Debian

[...] GCL 首次发布时生效的 common lisp 标准被称为“Common Lisp, the Language”(CLtL1),来自 Steele 的同名书提供了该规范。随后,美国国家标准协会 (ANSI) 采用了一个扩展得多的标准,该标准至今仍被认为是最终的通用 lisp 语言规范。

[...]

要切换 ANSI 图像的使用,请将环境变量 GCL_ANSI 设置为任何非空字符串。

这个 Debian 错误有更多信息。)

handler-case需要ANSI支持,所以在基于Debian的系统上,GCL需要启动GCL_ANSI环境变量集;例如:

$ GCL_ANSI=1 gcl

为了反映更改,启动消息的第一行从以下位置更改:

GCL (GNU Common Lisp)  2.6.12 CLtL1    Fri Apr 22 15:51:11 UTC 2016

至:

GCL (GNU Common Lisp)  2.6.12 ANSI    Fri Apr 22 15:51:11 UTC 2016
于 2021-07-01T08:01:24.047 回答