如何在Guile中定义两个R7RS库并解决相关报错问题
问题原因
Guile 3.0.x的R7RS实现有两个核心特性导致该问题:
- 默认启动的Guile环境未加载R7RS支持,无法识别
define-library语法,所以直接执行sld文件会报错。 - 开启R7RS支持的REPL环境,在完成第一个自定义库的定义后,会自动将当前活动环境切换为该自定义库的导入环境(也就是你库内声明的
(import (scheme base))对应的环境)。而R7RS标准中define-library属于顶层宿主语法,并不包含在(scheme base)模块内,所以第二个define-library会被识别为普通的过程调用表达式,其内部的define语句就出现在了非法的表达式上下文,触发语法错误。
解决方法
REPL中定义多个R7RS库
- 启动Guile时指定R7RS模式:
guile --r7rs
- 定义完任意一个库后,手动切回带有
define-library支持的Guile顶层环境:
(import (guile))
- 再执行下一个库的定义即可,全部定义完成后可正常导入使用:
(import (example one) (example two))
从文件加载多个R7RS库
两种方式可选:
- 启动时指定R7RS模式加载文件:
guile --r7rs mylibs.sld
- 若要兼容默认启动的Guile,在
sld文件的最开头添加如下兼容代码:
(cond-expand (guile (import (ice-9 r7rs))))
该行会在Guile环境下自动导入R7RS支持模块,可正确识别后续所有define-library定义。
内容的提问来源于stack exchange,提问作者Flux
相关产品推荐
相关产品推荐

