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