Common Lisp-এ হ্যাশ টেবিল হলো অ্যাসোসিয়েটিভ ডেটা সংরক্ষণের ডেটা স্ট্রাকচার। এগুলো কী (key)-কে মানে ম্যাপ করে; কী (key) এবং মান, দুটোই যেকোনো অবজেক্ট হতে পারে।
make-hash-table ফাংশন দিয়ে হ্যাশ টেবিল তৈরি করা যায়।
make-hash-table ফাংশনটি হ্যাশ টেবিলের শুরুর আকার এবং এর রিসাইজিং থ্রেশহোল্ড সূক্ষ্মভাবে ঠিক করার জন্য কয়েকটি কিওয়ার্ড প্যারামিটার নেয়; এগুলোর পুরো তথ্যের জন্য ডকুমেন্টেশন দেখুন।
আরও গুরুত্বপূর্ণ হলো, এছাড়াও এটি একটি test কিওয়ার্ড প্যারামিটার নেয়, যা ঠিক করে যে কী (key) ও মান ইনসার্ট, লুকআপ এবং রিমুভ করার সময় কী (key)গুলো কীভাবে তুলনা করা হবে।
test আর্গুমেন্টের মান হতে পারে 'eq, 'eql, 'equal বা 'equalp; এগুলো জেনেরিক সমতা প্রেডিকেটের সাথে মিলে যায়।
ডিফল্ট মানটি হলো 'eql।
কী (key) দিয়ে মান বের করতে gethash ব্যবহার করা হয়।
gethash একটি [অপশনাল আর্গুমেন্ট][concept-defualt-arguments] নেয়, যা হ্যাশ টেবিলে কী (key) না থাকলে রিটার্ন করার মান হিসেবে কাজ করে।
এছাড়াও gethash মাল্টিপল ভ্যালু রিটার্ন করে (যা অন্য একটি কনসেপ্টে ব্যাখ্যা করা হয়েছে)।
প্রথম মানটি হলো হ্যাশ টেবিলে ওই কী (key)-এর মান; ডিফল্ট মান দেওয়া থাকলে সেটি, নাহলে NIL।
দ্বিতীয় মানটি একটি বুলিয়ান, যা নির্দেশ করে কী (key)টি হ্যাশ টেবিলে ছিল কি না।
কী (key) ও মানের একটি জোড়া ইনসার্ট করতে gethash-এর সাথে setf ব্যবহার করা হয়।
কী (key) ও তার মান রিমুভ করতে remhash ব্যবহার করুন।
সব কী (key) ও মান রিমুভ করতে clrhash ব্যবহার করুন।
অন্য ভাষার মতো Common Lisp-এর হ্যাশ টেবিলেও কোনো নিশ্চিত ক্রম নেই; তবে অনেক সময় প্রতিটি কী (key)/মান জোড়া প্রসেস করার জন্য হ্যাশ টেবিলের উপর দিয়ে ইটারেট করা কাজে আসতে পারে।
এটি maphash দিয়ে করা যায়:
(maphash #'(lambda (key value) (print (cons key value))) *hash-table*)
(এটি প্রতিটি কী (key) ও মান একটি কনস-পেয়ার হিসেবে প্রিন্ট করবে, প্রতি লাইনে একটি।)
(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