协鑫如何处理条件?

tan*_*gle 3 lisp common-lisp gnu-common-lisp condition-system ansi-common-lisp

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.                                                    
>>
Run Code Online (Sandbox Code Playgroud)

对于 也是如此handler-bind

GCL 手册中唯一与处理条件或错误相关的函数是 GCL 特定的universal-error-handler.

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

tan*_*gle 6

这种情况在项目的README.Debian:

[...] 在第一次发布 GCL 时生效的通用 lisp 标准被称为“通用 Lisp,语言”(CLtL1),这是根据 Steele 的一本同名提供此规范的书。随后,美国国家标准协会 (ANSI) 采用了一个大大扩展的标准,该标准至今仍被认为是权威的通用 lisp 语言规范。

[...]

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

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

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

$ GCL_ANSI=1 gcl
Run Code Online (Sandbox Code Playgroud)

为了反映更改,启动消息的第一行更改为:

GCL (GNU Common Lisp)  2.6.12 CLtL1    Fri Apr 22 15:51:11 UTC 2016
Run Code Online (Sandbox Code Playgroud)

到:

GCL (GNU Common Lisp)  2.6.12 ANSI    Fri Apr 22 15:51:11 UTC 2016
Run Code Online (Sandbox Code Playgroud)