hash-table.ss
(module hash-table mzscheme
  (require (lib "list.ss"))
  (provide (all-defined))
  
  (define (hash-table-append! h k v)
    (hash-table-put! h k (list* v (hash-table-get h k (lambda () empty)))))
  (define (hash-table-get/set-default! h k default)
    (hash-table-get h k 
                    (lambda () 
                      (hash-table-put! h k default)
                      default)))
  (define (hash-table-get* h . ks)
    (foldl
     (lambda (k h)
       (hash-table-get h k (lambda () #f)))
     h
     ks))
  (define (hash-table->key-list h)
    (hash-table-map h (lambda (k v) k)))
  (define (hash-table->value-list h)
    (hash-table-map h (lambda (k v) v))))