9

我想使用 Common Lisp CLOS 对象作为哈希表中的键。我认为它会像这样简单:

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

查看 Common Lisp Hyperspec,似乎我只能使用 eq、eql、equal 或 equalp 来测试相等性。

有什么办法可以做到这一点吗?或者这只是一件非常愚蠢的事情,这就是为什么标准不允许这样做?

4

1 回答 1

9

Common Lisp 标准不提供任何机制来提供额外的测试功能(除了标准功能)。您有 2 个选项:

  1. 使用可移植哈希表实现的 genhash genhash(与内置哈希表不兼容)
  2. 使用非标准扩展:
    1. SBCL 具有sb-ext:define-hash-table-test功能(文档
    2. Clisp 有类似的功能ext:define-hash-table-test文档
    3. Allegro ans Lispworks 接受参数的非标准值:test并具有:hash-function参数(AllegroLispworks)。
于 2011-07-07T03:15:02.043 回答