(module string-intern mzscheme (require (lib "contract.ss") "weak-map.ss") (provide/contract [string-intern (string? . -> . string?)]) (define string-intern (let ([sema (make-semaphore 1)] [m (make-weak-map 'equal)]) (lambda (s) (semaphore-wait sema) (let ([result (weak-map-get m s (lambda () (let ([immutable-s (string->immutable-string s)]) (weak-map-put! m immutable-s immutable-s) immutable-s)))]) (semaphore-post sema) result)))))