协鑫如何处理条件?

问题描述

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 特定的 universal-error-handler

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

解决方法

项目的README.Debian中说明了这种情况:

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

[...]

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

This Debian bug 有更多信息。)

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