Scheme中如何仅获取函数返回的第一个值?
Scheme多返回值取第一个的常用方法
在Scheme中如果要获取多返回值函数的第一个返回值、忽略其余值,不要直接用单变量绑定接收,绝大多数实现会抛出参数数量不匹配的错误,可以用以下几种通用方案:
- 兼容所有符合R5RS及更高标准实现的通用写法,使用
call-with-values将返回的多值传入仅接收第一个参数的过程即可:
;; 示例:获取 exact-integer-sqrt 的第一个返回值 (call-with-values (lambda () (exact-integer-sqrt 5)) (lambda (first . rest) first)) ;; 运行结果为 2
这种写法不限制原函数的返回值总个数,不管后续还有多少返回值都会被直接忽略。
- 主流Scheme实现(Guile、Racket、Chez Scheme等)都支持
let-values,写法更直观:
(let-values (((root _) (exact-integer-sqrt 5))) root)
这里用下划线_作为不需要的返回值占位符,明确表示该值会被忽略。
- 部分实现还提供了更便捷的工具:
- 支持R7RS标准的实现可以用
values->list把多返回值转为列表后取第一个元素:(car (values->list (exact-integer-sqrt 5))) - 很多实现自带
receive宏,写法更简洁:
(receive (root rem) (exact-integer-sqrt 5) root) - 支持R7RS标准的实现可以用
内容的提问来源于stack exchange,提问作者Danilo Piazzalunga
相关产品推荐
相关产品推荐

