Hash-Tabellen in Common Lisp sind Datenstrukturen zum Speichern assoziativer Daten. Sie bilden Schlüssel (die beliebige Objekte sein können) auf Werte (die beliebige Objekte sein können) ab.
Hash-Tabellen kannst du mit der Funktion make-hash-table erstellen.
Die Funktion make-hash-table akzeptiert mehrere Schlüsselwortparameter, mit denen du die Anfangsgröße der Hash-Tabelle sowie ihre Schwelle für Größenänderungen genau einstellen kannst; vollständige Informationen dazu findest du in der Dokumentation.
Noch wichtiger ist, dass es auch einen test-Schlüsselwortparameter akzeptiert, der festlegt, wie Schlüssel beim Einfügen, Nachschlagen und Entfernen von Schlüsseln und Werten verglichen werden.
Als Wert für das test-Argument kannst du einen von 'eq, 'eql, 'equal oder 'equalp angeben; diese entsprechen den generischen Gleichheitsprädikaten.
Der Standardwert ist 'eql.
Um einen Wert über seinen Schlüssel zu erhalten, verwendest du gethash.
gethash akzeptiert ein [optionales Argument][concept-defualt-arguments], das als Wert zurückgegeben wird, wenn der Schlüssel nicht in der Hash-Tabelle vorhanden ist.
gethash gibt außerdem mehrere Werte zurück (in einem anderen Konzept erklärt).
Der erste Wert ist der Wert dieses Schlüssels in der Hash-Tabelle, der Standardwert, falls angegeben, oder NIL.
Der zweite Wert ist ein boolescher Wert, der angibt, ob der Schlüssel in der Hash-Tabelle vorhanden war oder nicht.
Um ein Schlüssel-Wert-Paar einzufügen, verwendest du setf zusammen mit gethash.
Um einen Schlüssel und seinen Wert zu entfernen, verwendest du remhash.
Um alle Schlüssel und Werte zu entfernen, verwendest du clrhash
Obwohl eine Hash-Tabelle in Common Lisp, wie in anderen Sprachen, keine garantierte Reihenfolge hat, kann es manchmal nützlich sein, über sie zu iterieren und dabei jedes Schlüssel-Wert-Paar zu verarbeiten.
Das kannst du mit maphash machen:
(maphash #'(lambda (key value) (print (cons key value))) *hash-table*)
(Dies gibt jedes Schlüssel-Wert-Paar als Cons-Paar aus, eines pro Zeile.)
(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