Вопрос по hash, dictionary, data-structures, lisp – У вас могут быть хеш-таблицы в lisp?

6

Можете ли вы иметь хэш-таблицы или dicts в Лиспе? Я имею в виду структуру данных, которая представляет собой набор пар (ключ, значение), где значения могут быть добавлены с помощью ключей.

Ваш Ответ

7   ответов
1

Там'с встроеннымхеш-таблицы, которые используют системную хеш-функцию (обычно SXHASH), и где у вас может быть несколько разных контролеров равенства (EQ, EQL, EQUAL или EQUALP в зависимости от того, что вы считаете "тот же самый" ключ).

Если встроенные хеш-таблицы недостаточно хороши,такжеуниверсальная хеш-таблица библиотека. Он примет любую парухеш-генератор "/"ключевой компаратор " и создать вам хэш-таблицу. Тем не менее, он опирается на наличие хорошей хэш-функции, чтобы работать хорошо, и это не обязательно тривиально писать.

9

Если ты'ссылаясь на Common Lisp,хеш-таблицы предоставляются с именем типа.hash-table

Используя эти таблицы включает в себя создание одного с функциейmake-hash-table, чтение значений сgethash, установив их с помощьюgethash какместо совместно сsetfи удаление записей с помощью.remhash

Отображение значения ключа в хеш-код доступно с помощью функции вне хеш-таблиц.sxhash

11

Common Lisp имеет как минимум четыре различных способа сделать это (хранение значения ключа):

списки свойств (: foo 1: bar 2)связанные списки ((: foo. 1) (: bar. 2))хеш-таблицыОбъекты CLOS (значение слота foo 'bar), чтобы получить и (setf (slot-value foo 'бар) 42) установить. Имя слота может быть сохранено в переменной: (let ((name 'bar)) (имя слота foo name)).

Для простого использования списки ассоциаций или списки свойств хороши. С большим количеством элементов они стремятся получитьмедленный', Хеш-таблицыБыстрее' но есть свои компромиссы. Объекты CLOS используются, как и во многих других объектных системах. Ключи - это имена слотов, определенные в классе CLOS. Хотя можно программировать варианты, которые могут добавлять и удалять слоты при доступе.

0

В лиспеs обычно называют списком свойств.

Нет, списки свойств - это что-то другое. Смотрите глоссарий CLHS:lispworks.com/documentation/HyperSpec/Body/... Eli Barzilay
Да и нет - список свойств нехэш-таблица, но она предоставляет словарь-интерфейс (и его вопрос определяет "... структура данных, представляющая собой набор пар (ключ, значение), к которым значения могут быть добавлены с помощью ключей. " Список свойств, безусловно, обеспечивает именно это, хотя и без хеширования (или чего-то, приближающегося к той же производительности ...) Jerry Coffin
2

Конечно. Вот's SRFI, определяющий стандартные библиотеки хеш-таблиц в схеме:

http://srfi.schemers.org/srfi-69/srfi-69.html

7

Конечно - Common Lisp имеетхеш-таблицы

(setq a (make-hash-table)) 
(setf (gethash 'color a) 'brown) 
(setf (gethash 'name a) 'fred) 
(gethash 'color a) => brown 
(gethash 'name a) => fred 
(gethash 'pointy a) => nil

Списки свойств хороши для очень маленьких примеров демонстрационных целей, но для любой реальной необходимости их производительность ужасна, поэтому используйте хеш-таблицы.

5

Clojure имеет встроенный тип карты:

user=> (def m {:foo "bar" :baz "bla"})
#'user/m
user=> (m :foo)
"bar"

Увидетьhttp://clojure.org/data_structures

Похожие вопросы