A Common Lispben a hashtáblák asszociatív adatok tárolására szolgáló adatszerkezetek. A kulcsokat (amelyek bármilyen objektumok lehetnek) értékekhez (amelyek szintén bármilyen objektumok lehetnek) rendelik.
Hashtáblákat a make-hash-table függvénnyel hozhatsz létre.
A make-hash-table függvény több kulcsparamétert is fogad, amelyekkel a hashtábla kezdeti méretét és az átméretezési küszöbét hangolhatod finomra; ezekről a teljes leírást a dokumentációban találod.
Ennél is fontosabb, hogy fogad egy test kulcsparamétert is, amely meghatározza, hogyan hasonlítódnak össze a kulcsok a kulcsok és értékek beszúrása, keresése és eltávolítása során.
A test argumentum értéke 'eq, 'eql, 'equal vagy 'equalp lehet; ezek az általános egyenlőség-predikátumoknak felelnek meg.
Az alapértelmezett érték 'eql.
A kulcsához tartozó értéket a gethash függvénnyel kérheted le.
A gethash fogad egy [opcionális argumentumot][concept-defualt-arguments], amely azt az értéket adja meg, amelyet a függvény visszaad, ha a kulcs nem szerepel a hashtáblában.
A gethash emellett több értéket is visszaad (erről egy másik fogalomnál lesz szó).
Az első érték a kulcshoz tartozó érték a hashtáblában, a megadott alapértelmezett érték, vagy NIL.
A második érték egy Boolean, amely megmutatja, hogy a kulcs szerepelt-e a hashtáblában vagy sem.
Egy kulcs-érték páros beszúrásához a setf-et használhatod a gethash-sel.
Egy kulcs és a hozzá tartozó érték eltávolításához a remhash-et használd.
Az összes kulcs és érték eltávolításához a clrhash-et használd.
Bár a Common Lispben a hashtábláknak, akárcsak más nyelvekben, nincs garantált sorrendjük, néha hasznos lehet végigiterálni rajtuk, és feldolgozni az egyes kulcs-érték párokat.
Erre a maphash használható:
(maphash #'(lambda (key value) (print (cons key value))) *hash-table*)
(Ez minden kulcsot és értéket cons-párként ír ki, soronként egyet.)
(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