12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- ; Part of Scheme 48 1.9. See file COPYING for notices and license.
- ; Authors: Richard Kelsey, Jonathan Rees
- ; Christopher P. Haynes and Daniel P. Friedman.
- ; Engines build process abstractions.
- ; 1984 ACM Symposium on Lisp and Functional Programming, pages 18-24.
- ; This is incompatible with the threads package.
- ; ,open primitives interrupts
- (define interrupt/alarm (enum interrupt alarm))
- (define (run thunk interval when-done when-timeout)
- (let ((save (vector-ref interrupt-handlers interrupt/alarm)))
- (let ((finish
- (call-with-current-continuation
- (lambda (k)
- (vector-set! interrupt-handlers
- interrupt/alarm
- (lambda (tem ei)
- (set-enabled-interrupts! ei)
- (call-with-current-continuation
- (lambda (resume)
- (k (lambda ()
- (when-timeout (lambda ()
- (resume #f)))))))))
- (schedule-interrupt interval *exponent* #f)
- (call-with-values thunk
- (lambda vals
- (let ((time-remaining (schedule-interrupt 0 0 #f)))
- (lambda ()
- (apply when-done time-remaining vals)))))))))
- (vector-set! interrupt-handlers
- interrupt/alarm
- save)
- (finish))))
- (define *exponent* -3)
- (define-syntax engine
- (syntax-rules ()
- ((engine ?E) (%engine (lambda () ?E)))))
- (define (%engine thunk)
- (lambda (ticks done out)
- (run thunk
- ticks
- (lambda (ticks val)
- (done val ticks))
- (lambda (new-thunk)
- (out (%engine new-thunk))))))
- ; Example from the LFP '84 paper (verbatim)
- ;(define-syntax rec
- ; (syntax-rules () ((rec ?X ?E) (letrec ((?X ?E)) ?X))))
- ;
- ;(define complete
- ; (lambda (eng)
- ; ((rec loop
- ; (lambda (eng count)
- ; (eng 1000
- ; (lambda (val ticks-left)
- ; (cons val
- ; (+ (- 1000 ticks-left)
- ; count)))
- ; (lambda (eng)
- ; (loop eng (+ count 1000))))))
- ; eng 0)))
|