Хеш-таблиці в 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 буде пояснено в іншій концепції.
Ламонт - прибулець із Ліспу, який хоче написати власну відеогру. Одне із завдань, у якому знадобиться наша допомога, - ведення списку рекордів.
Визначте функцію 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 вправи та справжнє наставництво від людей, і все це безкоштовно.