12
15
2010
90

continuations初练:序列生成器

刚刚注册这个空间的时候,看到了lispor的博客,感叹终于找到一个lisp的同好了,于是拿出当初翻看 Elisp 的 Info 的劲头,看完了他的 Scheme 笔记。实在是很不错呀!

不过,看到 continuation 就卡住了,当初就是因为这个原因没有继续学习 Scheme 的,觉得什么 tail position 什么的太晦涩了……不过顺次看到 lispor 指出的教程《Teach Yourself Scheme in Fixnum Days》,发现这个教程实在是很不错——这不,才一会儿时间基本上懂得了 call/cc 的原理了。

作为练习,我自己写了一个 range->generator 函数,调用函数得到一个生成器。首先给出源代码:

 

; range->generator 函数,生成一个生成器,每次调用生成器,给出从 i 开始
; 直到 j 的一个数字。
;
; 测试样例:
; > (define gen (step->generator 1 3))
; > (gen)
; 1
; > (gen)
; 2
; > (gen)
; 3
; > (gen)
; ()
; > (gen)
; ()
; 

(define (step->generator i j)
  (letrec ((caller '())
           (steper
             (lambda ()
               (let loop ()
                 (cond ((= i j)
                        (set! steper
                          (lambda () '()))
                        '())
                       (else
                         (call/cc
                           (lambda (k)
                             (set! steper k)
                             (caller i)))
                         (set! i (add1 i))
                         (loop)))))))
    (lambda ()
      (call/cc
        (lambda (k)
          (set! caller k)
          (steper))))))

详细的解释嘛……我还是有点懒,下次再说吧~~

这个代码有没有什么需要改进的地方呢?希望 lispor 大大能给一点意见~~~

Category: Scheme | Tags:

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com