;; hash tables ;; make a new table, using default type eq? (define h (make-hash-table)) ;; construct a table based on key/value pairs (define h1 (hash-table 'eq? '(a . 1) '(b . 2))) ;; populate the table (hash-table-put! h 'aap 1) (hash-table-put! h 'noot 2) (hash-table-put! h 'mies 3) (hash-table-put! h 'zus 4) ;; retrieve the value for an existing key (print (hash-table-get h 'aap)) ; 1 ;; retrieve a non-existent key with a default (print (hash-table-get h 'doh 'ping)) ; ping ;; retrieve without a default: raises error (with-error-handler (lambda (err) (print "error as expected: " err)) (lambda () (hash-table-get h 'wim))) ;; check for existence (hash-table-exists? h 'aap) ; #t ;; removal (hash-table-delete! h 'zus) ; #t (hash-table-delete! h 'foo) ; #f ;; push! pop! (hash-table-push! h 'aap 'foo) (print (hash-table-get h 'aap)) ; (foo . 1) (hash-table-push! h 'aap 'bar) (print (hash-table-get h 'aap)) ; (bar foo . 1) (print (hash-table-pop! h 'aap)) ; bar (print (hash-table-pop! h 'aap)) ; foo ;;(print (hash-table-pop! h 'aap)) ; error ;; for-each (hash-table-for-each h (lambda (key value) (print key " = " value))) ;; map (print (hash-table-map h (lambda (key value) (cons value key)))) ;; fold (print "sum: " (hash-table-fold h (lambda (key value previous) (+ value previous)) 0)) ;; keys values (print (hash-table-keys h)) (print (hash-table-values h)) ;; util.list defines hash-table->alist, alist->hash-table (use util.list) (print (hash-table->alist h)) ;; make hash-table applicable for get/put! (define-method object-apply ((h ) key) (hash-table-get h key)) (define-method object-apply ((h ) key value) (hash-table-put! h key value)) (h 'wim 42) (print (h 'wim))