key - 使用Common Lisp CLOS对象作为哈希表中的键?

标签 key hashtable common-lisp clos

我想使用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或equip来测试相等性。

有什么办法可以做到吗?还是这只是一件愚蠢的事情,这就是为什么标准不允许这样做的原因?

最佳答案

通用Lisp标准不提供任何机制来提供其他测试功能(超越标准)。您有2个选择:

  • 使用genhash genhash,它是可移植的哈希表实现(与内置的不兼容)
  • 使用非标准扩展名:
  • SBCL具有sb-ext:define-hash-table-test函数(documentation)
  • Clisp具有类似的功能ext:define-hash-table-test(documentation)
  • Allegro ans Lispworks接受:test参数的非标准值,并具有:hash-function参数(AllegroLispworks)。
  • 关于key - 使用Common Lisp CLOS对象作为哈希表中的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6605077/

    相关文章:

    common-lisp - 在字符串比较函数中使用 NIL 作为参数是否有效?

    clojure:没有cons细胞

    python - 替换字典中所有字典中的冗余键名称

    sql - 慢查询怎么了?

    c++ - 多线程 unordered_map

    algorithm - 如果基数尝试(或者说 HAT 尝试)非常适合存储和管理字符串,为什么它们不能同样用于整数?

    lisp - 让 Lisp "hello world"Web 应用程序运行的最简单方法

    Ruby - 将两个散列与一些类似的键合并

    python 字典排序奇怪(想要非字母顺序)

    python - 哈希表,非空槽已包含键,奇数数据值被新数据值替换