Using Common Lisp CLOS objects as keys in a hashtable?
I'd like to use Common Lisp CLOS objects as keys in a hashtable. I thought it would be as simple as this:
(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=))
Checking out the Common Lis开发者_如何学编程p Hyperspec, it seems I can only use eq, eql, equal, or equalp to test equality.
Is there any way I can do this? Or is this just a really stoopid thing to do, and that's why the standard doesn't allow it?
Common Lisp standard does not provide any mechanism to provide additional test functions for hash-tables (beyond standard ones). You have 2 options:
- Use genhash genhash which is portable hash-table implementation (not compatible with built-in ones)
- Use non-standard extensions:
- SBCL has
sb-ext:define-hash-table-test
function (documentation) - Clisp has a similar function
ext:define-hash-table-test
(documentation) - Allegro and Lispworks accept non-standard values for
:test
argument and has:hash-function
argument (Allegro, Lispworks).
精彩评论