Mam następujące klasy:Używanie wystąpień klasy CLOS jako kluczy tabeli mieszającej?
(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"))
Teraz chciałbym użyć tej klasy jako klucz dla hash-table. Adresy instancji można łatwo porównać z eq
. Problem jednak może być związany z wieloma identycznymi instancjami klasy category
i chciałbym, aby tablica mieszająca również rozpoznała to jako klucz.
Tak, starałem się zastąpić :test
argument funkcji make-hash-table
tak:
(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)))
Niestety, nie jest to dozwolone. :test
musi być oznacznikiem jednej z funkcji: eq, eql, equal lub equalp.
Jednym ze sposobów rozwiązania tego problemu byłoby przekształcenie klasy category
w strukturę, ale potrzebuję tego, aby była klasą. Czy istnieje sposób, w jaki mogę to rozwiązać?
Dlaczego jest to klasa? – coredump
Czy chcesz użyć * wystąpień * jako kluczy lub samej klasy? –