一例scheme中的Recursion消除
一个Scheme中Data和Code的统一的例子

一个Scheme中的Yield语句实现

ee.zsy posted @ 2011年4月17日 21:38 in 未分类 , 1245 阅读

 

在Python中,Yield是创建Generator的语法,这里给出Scheme的实现。
 
对于以下代码
(define (range low high)
    (let loop ((i low))
      (if (<= i high)
          (begin
            (display i)
            (loop (+ i 1)))
          '())))
执行
(range 1 3)
将会打印出
123
 
现在定义如下工厂函数
(define (make-generator factory)
  (define produce '())
  (define continue '())
  (define (yield value) 
    (call-with-current-continuation
     (lambda (here)
       (set! continue here) (produce value))))
  (set! continue (lambda () (factory yield)))
  (lambda ()
    (call-with-current-continuation
     (lambda (here) 
       (set! produce here) (continue)))))
 
于是range函数可以重新写为
(define (xrange low high)
  (lambda (yield)
    (let loop ((i low))
      (if (<= i high)
          (begin
            (yield i)
            (loop (+ i 1)))
          '()))))
 
使用方法如下
(define g (make-generator (xrange 1 3)))
(g) ;=>1
(g) ;=>2
(g) ;=>3
(g) ;=>'()
(g) ;=>'()
 
想一次打印全部的话定义如下的for-each
(define (generator-for-each proc gen)
  (let loop ()
    (let ((value (gen)))
      (if (null? value)
          '()
          (begin
            (proc value)
            (loop))))))
 
现在执行
(generator-for-each display (make-generator (xrange 1 4)))
 
得到输出
1234
 
实现Generator不一定要通过Yield语句,也有别的办法,这里就不再写了。
Avatar_small
seo service london 说:
2024年1月14日 02:46

I really loved reading your blog. It was very well authored and easy to understand


登录 *


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