«جدول هش» در 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 در مفهوم دیگری توضیح داده میشود.
Lamont یک موجود فضایی اهل 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 تمرین و مربیگری انسانی واقعی یاد بگیرید و در آن استاد شوید، همهی اینها رایگان.