string-intern.ss
(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)))))