; Producer consumer - functional programming variant. (define (stop-value? x) (and (boolean? x) x)) (define STOP-VALUE #t) (define NO-CONTINUATION #f) (define (producer initial-consumer-continuation) (call-with-current-continuation (lambda (exit) (let ((producer-values (list 2 3 4 5 6))) (letrec ((producer-iter (lambda (values consumer-continuation) (cond ((null? values) (consumer-continuation (cons STOP-VALUE NO-CONTINUATION))) (else (let* ((new-consumer-continuation (call-with-current-continuation (lambda (here) (if consumer-continuation (consumer-continuation (cons (car values) here)) (exit here)))))) (producer-iter (cdr values) new-consumer-continuation))))))) (producer-iter (cons 'no-value producer-values) initial-consumer-continuation)))))) (define (consumer initial-producer-continuation) (letrec ((consumer-processor (lambda (x) (* x x)))) (call-with-current-continuation (lambda (exit) (letrec ((consumer-iter (lambda (producer-continutation) (let* ((from-producer (call-with-current-continuation (lambda (here) (producer-continutation here)))) (value-from-producer (car from-producer)) ) (if (stop-value? value-from-producer) '() (let ((processed-value (consumer-processor value-from-producer)) (new-producer-continuation (cdr from-producer)) ) (cons processed-value (consumer-iter new-producer-continuation)))))))) (consumer-iter initial-producer-continuation)))))) ; Setup: Start producer first. Pass initial-producer-cont to consumer. (let ((initial-producer-cont (producer NO-CONTINUATION))) (consumer initial-producer-cont) ) ; => (4 9 16 25 36)