«جدول هش» در Common Lisp یک ساختار داده است که برای ذخیرهی دادههای کلید-مقدار به کار میرود. این جدولها کلیدها را به مقدارها نگاشت میکنند؛ کلید و مقدار هر یک میتوانند هر شیئی باشند.
جدول هش را میتوان با تابع make-hash-table ساخت.
تابع make-hash-table چندین پارامتر کلیدواژه میگیرد تا اندازهی اولیهی جدول هش و همچنین آستانهی تغییر اندازهی آن را دقیق تنظیم کنید؛ برای اطلاعات کامل دربارهی آنها به مستندات مراجعه کنید.
مهمتر اینکه یک پارامتر کلیدواژهی test هم میگیرد که تعیین میکند هنگام درج، جستوجو و حذف کلیدها و مقدارها، کلیدها چگونه با هم مقایسه میشوند.
مقدار آرگومان test میتواند یکی از 'eq، 'eql، 'equal یا 'equalp باشد که متناظر با محمولهای تساوی عمومی هستند.
مقدار پیشفرض 'eql است.
برای گرفتن یک مقدار از روی کلیدش، از gethash استفاده میشود.
gethash یک [آرگومان اختیاری][concept-defualt-arguments] میگیرد که اگر کلید در جدول هش موجود نباشد، بهعنوان مقدار بازگشتی عمل میکند.
gethash همچنین چندین مقدار برمیگرداند (که در مفهوم دیگری توضیح داده شده است).
مقدار اول، مقدار آن کلید در جدول هش است؛ اگر مقدار پیشفرضی داده شده باشد همان، وگرنه NIL.
مقدار دوم یک مقدار «منطقی» است که نشان میدهد کلید در جدول هش موجود بوده است یا نه.
برای درج یک جفت کلید-مقدار، از setf همراه با gethash استفاده میشود.
برای حذف یک کلید و مقدارش از 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