(define-record-type :get-request (make-get-request) get-request?) (define-record-type :put-request (make-put-request value) put-request? (value put-request-value)) (define-record-type :cell (really-make-cell request-channel reply-channel) cell? (request-channel cell-request-channel) (reply-channel cell-reply-channel)) (define (make-cell value) (let ((request-channel (make-sync-channel)) (reply-channel (make-sync-channel))) (spawn (lambda () (let loop ((value value)) (let ((request (receive-sync request-channel))) (cond ((get-request? request) (send-sync reply-channel value) (loop value)) ((put-request? request) (loop (put-request-value request)))))))) (really-make-cell request-channel reply-channel))) (define (cell-ref cell) (send-sync (cell-request-channel cell) (make-get-request)) (receive-sync (cell-reply-channel cell))) (define (cell-set! cell value) (send-sync (cell-request-channel cell) (make-put-request value)))