جداول التجزئة في 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
سيؤدي هذا إلى تعديل القيمة المرتبطة بالمفتاح :foo في جدول التجزئة *hash-table* لتصبح :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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.