Le tabelle hash in Common Lisp sono strutture dati per memorizzare dati associativi. Mappano chiavi (che possono essere qualsiasi oggetto) a valori (che possono essere qualsiasi oggetto).
Le tabelle hash si possono creare con la funzione make-hash-table.
La funzione make-hash-table accetta diversi parametri keyword per mettere a punto la dimensione iniziale della tabella hash e la sua soglia di ridimensionamento; fai riferimento alla documentazione per tutte le informazioni al riguardo.
Ancora più importante, accetta anche un parametro keyword test che definisce come vengono confrontate le chiavi durante l'inserimento, la ricerca e la rimozione di chiavi e valori.
I valori dell'argomento test possono essere uno tra 'eq, 'eql, 'equal o 'equalp, che corrispondono ai predicati di uguaglianza generici.
Il valore predefinito è 'eql.
Per ottenere un valore dalla sua chiave si usa gethash.
gethash accetta un [argomento opzionale][concept-defualt-arguments] che funge da valore da restituire se la chiave non è presente nella tabella hash.
gethash restituisce anche valori multipli (spiegati in un altro concetto).
Il primo valore è il valore di quella chiave nella tabella hash, il valore predefinito se fornito, oppure NIL.
Il secondo valore è un booleano che indica se la chiave era presente o meno nella tabella hash.
Per inserire una coppia chiave-valore si usa setf insieme a gethash.
Per rimuovere una chiave e il suo valore usa remhash.
Per rimuovere tutte le chiavi e i valori usa clrhash
Sebbene una tabella hash in Common Lisp, come in altri linguaggi, non abbia un ordinamento garantito, a volte può essere utile iterare su di essa elaborando ogni coppia chiave/valore.
Questo si può fare con maphash:
(maphash #'(lambda (key value) (print (cons key value))) *hash-table*)
(Questo stamperà ogni chiave e valore come coppia cons, uno per riga.)
(setf *hash-table* (make-hash-table)) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {100375FD23}>
(gethash :foo *hash-table*) ; => NIL
; NIL
(gethash :foo *hash-table*
:default-value) ; => :DEFAULT-VALUE
; NIL
(setf (gethash :foo *hash-table*) :bar) ; => :BAR
(gethash :foo *hash-table*) ; => :BAR
; T
(setf (gethash :key *hash-table*) :value) ; => :RIGHT
(gethash :key *hash-table*) ; => :VALUE
; T
(remhash :key *hash-table*) ; => T
(gethash :key *hash-table*) ; => NIL
; => NIL
(clrhash *hash-table*) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>
(gethash :foo *hash-table*) ; => NIL
; NIL