Common Lisp 中的雜湊表是用來儲存關聯性資料的資料結構。 它們會把鍵(可以是任何物件)對應到值(可以是任何物件)。
雜湊表可以用make-hash-table函式建立。
make-hash-table函式接受數個關鍵字參數,用來微調雜湊表的初始大小以及重新調整大小的門檻;完整資訊請參閱文件。
更重要的是,它還接受一個test關鍵字參數,用來定義在插入、查詢與移除鍵和值時,鍵要如何比較。
test引數的值可以是'eq、'eql、'equal或'equalp其中一個,它們分別對應到通用相等述詞。
預設值是'eql。
要用鍵取得值,可以使用gethash。
gethash接受一個[選用引數][concept-defualt-arguments],當雜湊表中沒有這個鍵時,就會回傳這個引數的值。
gethash也會回傳多重值(另一個概念會說明這部分)。
第一個值是該鍵在雜湊表中的值、有提供時的預設值,或是NIL。
第二個值是布林值,指出該鍵是否存在於雜湊表中。
要插入一組鍵值配對,可以搭配gethash使用setf。
要移除某個鍵和它的值,請使用remhash。
要移除所有的鍵和值,請使用clrhash。
雖然 Common Lisp 的雜湊表和其他語言一樣不保證順序,但有時候逐一處理每一組鍵值還是很有用。
這件事可以用maphash做到:
(maphash #'(lambda (key value) (print (cons key value))) *hash-table*)
(這會把每個鍵和值以 cons 配對的形式印出,一行一組。)
(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