在哈希表中使用Common Lisp CLOS对象作为键?

10

我想将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测试相等性。

是否有其他方法可以做到这一点?还是这只是一种非常愚蠢的事情,因此标准不允许它?

1个回答

10

Common Lisp标准没有提供为哈希表(除了标准函数之外)提供额外测试功能的机制。你有两个选择:

  1. 使用genhash genhash,这是可移植的哈希表实现(与内置的不兼容)。
  2. 使用非标准扩展:
  3. SBCL有sb-ext:define-hash-table-test函数(文档)。
  4. Clisp有类似的函数ext:define-hash-table-test文档)。
  5. Allegro和Lispworks接受:test参数的非标准值,并且有:hash-function参数(AllegroLispworks)。

Genhash 是相当稳定的(受 CDR 管理)。 - Vatine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接