刚刚注册这个空间的时候,看到了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 大大能给一点意见~~~