如何在Gambit Scheme中正确使用let-values?
Gambit中let-values使用问题及解决
我在测试Scheme的变量重定义功能,在Gambit中运行以下代码:
(let-values ((x (values 1 2 3)) (x (values 4 5 6))) (display x) (newline))
期望查看输出结果,但Gambit抛出错误:
Unbound variable: let-values
我确认let-values在Gambit中已实现,但不知道怎么启用这个特性,推测和库加载有关,但不了解Gambit的库使用方法。尝试执行:
(import gambit)
时也报错:
Unbound variable: import
我使用gsi file.scm命令执行Gambit代码。
解决方法
切换到R7RS模式
Gambit默认启动时采用R5RS兼容模式,而import和let-values是R7RS标准的特性,需要切换模式:- 启动时加参数:执行命令改为
gsi -r7rs file.scm - 或在代码开头添加声明:在文件第一行加上
#!r7rs,让Gambit自动以R7RS模式加载
- 启动时加参数:执行命令改为
正确导入库
在R7RS模式下,需要显式导入(gambit)库才能使用完整的Gambit特性:
#!r7rs (import (gambit))
- 修正let-values的语法错误
原代码存在语法问题:let-values的每个绑定项必须是((变量列表) 表达式)的形式,因为values返回多个值,需要对应多个变量来接收。如果想测试变量覆盖,正确写法示例:
#!r7rs (import (gambit)) (let-values (((x1 x2 x3) (values 1 2 3)) ((x1 x2 x3) (values 4 5 6))) (display (list x1 x2 x3)) (newline))
运行后会输出 (4 5 6),后一个绑定会覆盖前一个。
如果尝试用单个变量接收多个值,Gambit会抛出too many values to unpack的错误,这是Scheme标准的行为。
内容的提问来源于stack exchange,提问作者jcubic
相关产品推荐
相关产品推荐

