一个Scheme中的Yield语句实现
ee.zsy
posted @ 2011年4月17日 21:38
in 未分类
, 1278 阅读
在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语句,也有别的办法,这里就不再写了。
2024年1月14日 02:46
I really loved reading your blog. It was very well authored and easy to understand