问题描述
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