У вас могут быть хеш-таблицы в lisp? - PullRequest
6 голосов
/ 03 декабря 2009

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

Ответы [ 7 ]

11 голосов
/ 03 декабря 2009

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

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

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

9 голосов
/ 03 декабря 2009

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

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

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

7 голосов
/ 03 декабря 2009

Конечно - 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 голосов
/ 03 декабря 2009

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

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

См. http://clojure.org/data_structures

2 голосов
/ 03 декабря 2009

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

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

1 голос
/ 05 декабря 2009

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

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

0 голосов
/ 03 декабря 2009

В Лиспе он обычно называется списком свойств.

...