;; Producer-Consumer-Problem mit asynchronem Message-Passing (define-record-type :buffer (really-make-buffer empty-channel insert-channel remove-channel remove-ack-channel) buffer? (empty-channel buffer-empty-channel) (insert-channel buffer-insert-channel) (remove-channel buffer-remove-channel) (remove-ack-channel buffer-remove-ack-channel)) (define (make-buffer) (let ((empty-channel (make-async-channel)) (insert-channel (make-async-channel)) (remove-channel (make-async-channel)) (remove-ack-channel (make-async-channel))) (spawn (lambda () (letrec ((empty (lambda () (send-async empty-channel #f) (full (receive-async insert-channel)))) (full (lambda (value) (send-async remove-channel value) (receive-async remove-ack-channel) (empty)))) (empty)))) (really-make-buffer empty-channel insert-channel remove-channel remove-ack-channel))) (define (insert buffer value) (receive-async (buffer-empty-channel buffer)) (send-async (buffer-insert-channel buffer) value)) (define (remove buffer) (let ((value (receive-async (buffer-remove-channel buffer)))) (send-async (buffer-remove-ack-channel buffer) #f) value))