У меня есть следующий класс:
(defclass category ()
((cat-channel-name
:accessor cat-channel-name :initarg :cat-channel-name :initform "" :type string
:documentation "Name of the channel of this category")
(cat-min
:accessor cat-min :initarg :min :initform 0 :type number
:documentation "Mininum value of category")
(cat-max
:accessor cat-max :initarg :max :initform 1 :type number
:documentation "Maximum value of category"))
(:documentation "A category"))
Теперь я хотел бы использовать этот класс в качестве ключа для хеш-таблицы. Адреса экземпляров легко сравнить с eq
. Однако проблема в том, что может быть несколько идентичных экземпляров этого класса category
, и я хотел бы, чтобы хеш-таблица также распознавала это как ключ.
Итак, я пытался перезаписать аргумент :test
функции make-hash-table
следующим образом:
(make-hash-table :test #'(lambda (a b) (and (equal (cat-channel-name a) (cat-channel-name b))
(eq (cat-min a) (cat-min b))
(eq (cat-max a) (cat-max b)))
К сожалению, это не разрешено. :test
должен быть обозначением одной из функций eq, eql, equal или equalp.
Один из способов решить эту проблему — превратить класс category
в структуру, но мне нужно, чтобы это был класс. Есть ли способ решить эту проблему?