刚刚注册这个空间的时候,看到了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 大大能给一点意见~~~
Dec 17, 2010 05:49:27 PM
Jan 01, 2011 11:36:29 PM
@Lispor: 哈哈,不管怎么说,还是要谢谢你呢。没想到你也在cu混迹。我的邮箱weasley.wx@gmail.com,你喜欢加入哪些scheme邮件列表呢?也许可以一起在社区交流~
Aug 26, 2013 06:04:14 PM
function step2generator(start, finish)
return coroutine.wrap(function()
for i=start, finish do
coroutine.yield(i)
end
while true do
coroutine.yield("()")
end
end)
end
local g = step2generator(1, 3)
for i=1, 5 do
print(g())
end
这个好像用 Lua 也很容易实现。。。