R7RS-small下单值参数接收多值返回的行为及Scheme实现差异
Scheme单值上下文传入多返回值的行为说明
R7RS-small标准规定
当表达式所处的上下文仅需要接收单个值时,如果该表达式返回了零个或超过一个的值,属于未定义行为。标准既没有强制要求实现自动丢弃多余返回值,也没有要求必须抛出错误,具体处理逻辑交由各实现自主决定。
具体示例行为解释
- 示例
(+ (values 1) (values 2))返回3是符合所有标准实现预期的:两个values调用都仅返回1个值,完全匹配+运算符每个参数位置的单值要求,不存在歧义。 - 示例
(+ 1 (values 2 3))的执行结果没有统一的标准要求,目前不同实现分为两类处理逻辑:- 以Guile 3.0.7为代表的实现会自动取多返回值的第一个值参与计算,自动忽略后续值,最终返回
3 - 以MIT Scheme 11.2、Chibi 0.10.0为代表的实现会做严格的参数校验,发现参数位置返回多值时直接抛出值数量不匹配的错误
- 以Guile 3.0.7为代表的实现会自动取多返回值的第一个值参与计算,自动忽略后续值,最终返回
注意:自动忽略多余返回值只是部分实现的扩展特性,不能在需要跨实现运行的可移植代码中依赖该行为。
内容的提问来源于stack exchange,提问作者Flux
相关产品推荐
相关产品推荐

