Common Lisp में हैश टेबल एसोसिएटिव डेटा संग्रहीत करने वाली डेटा संरचनाएँ हैं। ये की (जो कोई भी ऑब्जेक्ट हो सकती हैं) को वैल्यू (जो कोई भी ऑब्जेक्ट हो सकती हैं) से जोड़ती हैं। अन्य भाषाएँ इस कॉन्सेप्ट को मैप, डिक्शनरी या हैश कह सकती हैं।
हैश टेबल बनाने के लिए आप make-hash-table फंक्शन इस्तेमाल कर सकते हैं।
(make-hash-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {10024AD2B3}>
(ध्यान दीजिए कि हैश टेबल का छपा हुआ रूप इम्प्लीमेंटेशन पर निर्भर करता है, इसलिए आपके REPL में यह अलग दिख सकता है।)
हैश टेबल से किसी की के ज़रिए वैल्यू निकालने के लिए आप gethash फंक्शन इस्तेमाल करते हैं:
*h* ; => #<HASH-TABLE :TEST EQL :COUNT 3 {10024AD2B3}>`
(gethash :foo *h*) ; => :bar
; T
gethash एक से अधिक वैल्यू लौटाता है, जिन्हें किसी अन्य कॉन्सेप्ट में समझाया जाएगा।
हैश टेबल में वैल्यू डालने के लिए आप setf का gethash के साथ इस तरह इस्तेमाल करते हैं:
(setf (gethash :foo *hash-table*) :bar) : => :bar
यह हैश टेबल *hash-table* में की :foo से जुड़ी वैल्यू को :bar में बदल देगा।
यह वैल्यू लौटाता है।
setf का उपयोग किसी अन्य कॉन्सेप्ट में समझाया जाएगा।
लैमॉन्ट एक Lisp एलियन है जो अपना खुद का वीडियो गेम बनाना चाहता है। उसने आपसे जिस एक काम में मदद माँगी है, वह है हाई स्कोर की सूची का हिसाब रखना।
एक फंक्शन make-high-score-table बनाइए जो कोई आर्गुमेंट नहीं लेता और एक नई खाली हैश टेबल देता है:
(make-high-score-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>
टेबल में एक खिलाड़ी जोड़ने के लिए एक फंक्शन add-player बनाइए जो दो आर्गुमेंट लेता है:
खिलाड़ी का शुरुआती स्कोर शून्य रखिए।
(add-player hash-table :louis) ; => 0
(add-player hash-table :lilly) ; => 0
किसी खिलाड़ी का स्कोर सेट करने के लिए एक फंक्शन set-score बनाइए जो तीन आर्गुमेंट लेता है:
(set-score hash-table :louis 1234) ; => 1234
टेबल से किसी खिलाड़ी का स्कोर पाने के लिए एक फंक्शन get-score बनाइए जो दो आर्गुमेंट लेता है:
इस फंक्शन को खिलाड़ी के लिए संग्रहीत स्कोर देना चाहिए।
अगर उस खिलाड़ी के लिए कोई स्कोर संग्रहीत नहीं है, या वह खिलाड़ी अभी टेबल में नहीं है, तो इसका मान 0 होना चाहिए।
(get-score hash-table :louis) ; => 1234
(get-score hash-table :lilly) ; => 0
(get-score hash-table :not-a-character-in-this-story) ; => 0
हाई स्कोर टेबल से किसी खिलाड़ी को हटाने के लिए एक फंक्शन remove-player बनाइए जो दो आर्गुमेंट लेता है:
इस फंक्शन को ऐसे मामले भी ठीक से संभालने चाहिए जिनमें खिलाड़ी को अभी टेबल में जोड़ा ही नहीं गया हो। स्वाभाविक है कि किसी खिलाड़ी को हटाने के बाद अगर टेबल से उसका स्कोर लिया जाए, तो वह शून्य होगा।
(set-score hash-table :louis 1234) ; => 1234
(remove-player hash-table :louis) ; => T
(get-score hash-table :louis) ; => 0
(remove-player hash-table :not-in-the-table) ; => NIL
Exercism पर साइन अप कीजिए और Common Lisp को 27 कॉन्सेप्ट92 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।