在GCL中如何处理条件?

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

在GCL中如何处理条件,最好能够得到其他Lisp支持的方式呢?

1个回答

8
这种情况在项目的README.Debian中有解释:
[...] GCL 首次发布时生效的 Common Lisp 标准被称为《Common Lisp, the Language》(CLtL1),该标准由 Steele 撰写同名规范书提供。随后,美国国家标准学会(ANSI)采用了一个大大扩展的标准,至今仍被视为权威的 Common Lisp 语言规范。

[...]

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

(这个 Debian bug 提供了更多信息。)

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

$ GCL_ANSI=1 gcl

为了反映这个变化,启动消息的第一行将改变为:
GCL (GNU Common Lisp)  2.6.12 CLtL1    Fri Apr 22 15:51:11 UTC 2016

To:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接