6 控制结构
6.3 延续
6.4 引擎
引擎是一个支持定时抢占[15,24]的高级过程抽象。引擎可能被用来模拟多任务处理,实现操作系统内核,并执行非确定性的计算。
过程:(make-engine thunk)
返回:一个引擎
库:(chezscheme)
引擎是通过传递一个thunk(无参数过程)来制作引擎而创建的。thunk的主体是由引擎执行的计算。引擎本身是一个三参数的过程:
ticks:一个正整数,指定引擎的运行时间,一个引擎会执行直到ticks用完,或计算完成。
complete:一个或多个参数的过程,指定在计算完成时要执行的操作。它的参数是剩余ticks和计算产生的数值。
expire:一个参数的过程,指定在计算完成前如果ticks耗尽该怎么做。它的参数是能够从中断处重新开始计算的新引擎。
当一个引擎应用于它的参数时,它被设定了一个以ticks的计时器。(参见320页 set-timer)如果在ticks耗尽之前引擎计算完成,系统将调用complete,并将剩余的ticks和计算结果生成的值传递给它。如果在计算完成之前ticks耗尽,则系统将从中断计算的继续中创建新的引擎,并使当前的引擎expire。complete和expire将在引擎调用的延续中调用。
Scheme编程语言第12.11节给出了引擎的实现
请勿使用定时器(见 set-timer)中断引擎,因为引擎是定时器实现的。
下面这个例子是一个10ticks的引擎。
(define (make-engine (lambda()3)))
(eng 10 (lambda(ticks value)value) (lambda(x)x)) => 3 (define eng (make-engine (lambda () 3)))
(eng 10 list (lambda (x) x)) => (9 3) (define fibonacci (lambda (n) (let fib ([i n]) (cond [(= i 0) 0] [(= i 1) 1] [else (+ (fib (- i 1)) (fib (- i 2)))]))))
(define eng (make-engine (lambda () (fibonacci 10))))
(eng 50 list (lambda (new-eng) (set! eng new-eng) "expired")) => "expired"
(eng 50 list (lambda (new-eng) (set! eng new-eng) "expired")) => "expired"
(eng 50 list (lambda (new-eng) (set! eng new-eng) "expired")) => "expired"
(eng 50 list (lambda (new-eng) (set! eng new-eng) "expired")) => (21 55)