You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
    

内容的提问来源于stack exchange,提问作者Danilo Piazzalunga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:06:00