scheme中实现多值返回

By guenchi at 2018-03-12 • 0人收藏 • 211人看过

http://www.zenlife.tk/multiple-returns-in-scheme.md


像C那样的语言可以通过传返回值的指针的方式,实现多值返回。一直没想明白像scheme这种语言怎样实现多值返回,后来在the little schemer中找到方法了。

假设有个函数,它接受的参数是整数的list,返回所有list中的奇数构成的list,并返回所有的偶数之和,偶数之积。这就是一个需要返回多个值的场景。

(define func
  (lambda (lon col)
    (if (null? lon)
        (col '() 0 1)
        (if (odd? (car lon))
            (func (cdr lon)
             (lambda (l sum fac)
               (col (cons (car lon) l) sum fac)))
            (func (cdr lon)
             (lambda (l sum fac)
               (col l (+ (car lon) sum) (* (car lon) fac))))))))

(func '(1 2 3 4 5 6 7) (lambda (l sum fac) (cons sum (cons fac l))))

scheme中地道的多值返回是通过collector实现的。


2015.6.9更新

上面的做法其实本质上就是自己手动做CPS转换。类似的做法,用Monad也可以实现。

标准的scheme有values函数可以实现多值返回,相关的函数还有define-values,let-values,call-with-values等。


登录后方可回帖

登 录
信息栏

Scheme中文社区

推荐实现 ChezScheme / r6rs / r7rs large
theschemer.org
Q群: 724577239

精华导览

社区项目

包管理器:Raven
HTTP服务器:Igropyr (希腊火)
官方插件:vscode-chez

社区目标:

完善足以使Scheme工程化和商业化的库,特别是开发极致速度的Web服务器和ANN模块。

一直以来Scheme缺少一个活跃的中文社区,同时中文资料的稀少,导致大多数因为黑客与画家和SICP而接触Scheme的朋友,在学完SICP后无事可做,不能将Scheme转换为实际的生产力。最后渐渐的放弃。
同时Chicken等实现,却因效率问题无法与其他语言竞争。本社区只有一个目的,传播Scheme的文明之火,在最快的编译器实现上,集众人之力发展出足够与其他语言竞争的社区和库。


友情链接:

Clojure 中文论坛
函数式·China


Loading...