Ho la seguente classe:Utilizzo delle istanze di classe CLOS come chiavi della tabella hash?
(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"))
Ora, vorrei usare questa classe come una chiave per una hash-table. Gli indirizzi delle istanze possono essere facilmente confrontati con eq
. Il problema è, tuttavia, potrebbero esserci più istanze identiche di questa classe e vorrei che anche la tabella hash riconosca questo come una chiave.
Così, stavo cercando di sovrascrivere il :test
argomento della funzione make-hash-table
in questo modo:
(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)))
Purtroppo, questo non è permesso. :test
deve essere un designatore per una delle funzioni eq, eql, uguale o uguale.
Un modo per risolvere questo sarebbe trasformare la classe category
in una struttura, ma ho bisogno che sia una classe. C'è un modo per risolvere questo?
Perché hai bisogno che sia una lezione? – coredump
Vuoi usare * instance * come chiavi, o la classe stessa? –