2011-07-07 21 views
8

Me gustaría utilizar objetos CLOS de Common Lisp como claves en una tabla hash. Pensé que iba a ser tan simple como esto:Uso de objetos CLOS de Common Lisp como claves en una tabla hash?

(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=)) 

Comprobación de la Lisp hyperspec Común, parece que sólo puedo utilizar eq, eql, igual, o equalp para probar la igualdad.

¿Hay alguna manera de que pueda hacer esto? ¿O se trata de algo realmente stoopid, y es por eso que el estándar no lo permite?

Respuesta

8

estándar Common Lisp no proporciona ningún mecanismo para proporcionar funciones de prueba adicionales (beyound las estándar). Tienes 2 opciones:

  1. Uso genhash genhash que es la aplicación tabla hash portátil (no compatible con los incorporados) extensiones
  2. uso no estándar:
    1. SBCL tiene sb-ext:define-hash-table-test función (documentation)
    2. Clisp tiene una función similar ext:define-hash-table-test (documentation)
    3. LispWorks Allegro ans aceptan valores no estándar para :test argumento y tiene :hash-function argumento (Allegro, Lispworks).
+0

Genhash es, por lo menos, bastante estable (y goverened por un CDR). – Vatine