Использование Common Lisp CLOS объектов в качестве ключей в хеш-таблице? - PullRequest
9 голосов
/ 07 июля 2011

Я бы хотел использовать объекты Common Lisp CLOS в качестве ключей в хеш-таблице. Я думал, что это будет так просто:

(defclass my-class () ((a :accessor a :initarg a)))

(defun my-class= (my-instance-1 my-instance-2)
(equal (a my-instance-1) (a my-instance-2)))

(defparameter my-hash-table (make-hash-table :test #'my-class=))

Проверяя Hyperpec от Common Lisp, кажется, я могу использовать только eq, eql, equal или equalp для проверки равенства.

Есть ли способ, которым я могу это сделать? Или это действительно глупая вещь, и поэтому стандарт не позволяет этого?

1 Ответ

9 голосов
/ 07 июля 2011

Стандарт Common Lisp не предоставляет какого-либо механизма для предоставления дополнительных функций тестирования (помимо стандартных). У вас есть 2 варианта:

  1. Используйте genhash genhash , который является переносимой реализацией хеш-таблицы (не совместимой со встроенными)
  2. Используйте нестандартные расширения:
    1. SBCL имеет функцию sb-ext:define-hash-table-test ( документация )
    2. Clisp имеет аналогичную функцию ext:define-hash-table-test ( документация )
    3. Allegro и Lispworks принимают нестандартные значения для аргумента :test и имеют :hash-function аргумент ( Allegro , Lispworks ).
...