#lang scheme/base ;; Simple thread-safe memoized unary functions. (provide memo) (require scheme/dict) (define (memo fn [make-dict make-hash]) (let ((memo-dict (make-dict)) (memo-sema (make-semaphore 1))) (lambda (key) (call-with-semaphore memo-sema (lambda () (dict-ref memo-dict key (lambda () (let ((val (fn key))) (dict-set! memo-dict key val) val))))))))