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

发布于 2024-11-18 14:32:15 字数 413 浏览 2 评论 0原文

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

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

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 Lisp 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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夜声 2024-11-25 14:32:15

Common Lisp 标准没有提供任何机制来为哈希表提供额外的测试函数(超出标准)。您有 2 个选择:

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

Common Lisp standard does not provide any mechanism to provide additional test functions for hash-tables (beyond standard ones). You have 2 options:

  1. Use genhash genhash which is portable hash-table implementation (not compatible with built-in ones)
  2. Use non-standard extensions:
  3. SBCL has sb-ext:define-hash-table-test function (documentation)
  4. Clisp has a similar function ext:define-hash-table-test (documentation)
  5. Allegro and Lispworks accept non-standard values for :test argument and has :hash-function argument (Allegro, Lispworks).
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文