12
15
2010
3

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: | Read Count: 2655
Avatar_small
Lispor 说:
Dec 17, 2010 05:49:27 PM

 

blush
我也是刚学习scheme的,也是一个菜鸟
 
BTW
序列生成器有一种很经典的写法,简单易懂:
 
(define (step->generator i j)
  (let ((x (- i 1)))
    (lambda ()
      (if (<= x j)
 (begin (set! x (+ x 1))
x)
 #f))))
Avatar_small
亚弥 说:
Jan 01, 2011 11:36:29 PM

@Lispor: 哈哈,不管怎么说,还是要谢谢你呢。没想到你也在cu混迹。我的邮箱weasley.wx@gmail.com,你喜欢加入哪些scheme邮件列表呢?也许可以一起在社区交流~

Avatar_small
太阳神上 说:
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 也很容易实现。。。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

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