-
-;;; Cache for procedures
-(define (use-cache-with proc)
- (let ((cache (make-weak-value-hash-table)))
- (lambda (. param)
- (let* ((key param)
- (res (hash-ref cache key)))
- (cond (res res)
- (else
- (set! res (apply proc param))
- (hash-set! cache key res)
- res))))))
-
-
-;;; Retrive header definition of a procedure
- (define (procedure-header proc)
- (let* ((args (procedure-arguments proc))
- (name (procedure-name proc))
- (required (cdar args)))
- (cons name required)))
+(define (make-producer body)
+ (define resume #f)
+ (lambda (real-send)
+ (define send-to real-send)
+ (define (send value-to-send)
+ (set! send-to
+ (call/cc
+ (lambda (k)
+ (set! resume k)
+ (send-to value-to-send)))))
+ (if resume
+ (resume real-send)
+ (body send))))