【发布时间】:2013-11-22 20:53:45
【问题描述】:
假设我定义了一个新类foo:
(defclass foo ()
((bar :initarg :bar ...)
(baz :initarg :baz ...)
...))
我想为foo创建一个自定义比较器,例如:
(defun foo-equalp (foo1 foo2)
(equalp (bar foo1)))
是否有更好、更明确的方法将此foo-equalp 函数与foo 类联系起来?
我在考虑不必将 #'foo-equalp 作为 :test 参数传递给像 REMOVE-DUPLICATES 这样的函数,但即使这不可能,我仍然想知道是否有更惯用的 Lisp 方式定义这个函数。
【问题讨论】:
-
听起来你想要一个等式谓词,它是一个通用函数,可以添加专门的方法(有点像你如何在 Java 中专门化
.equals())。不幸的是,“通用”谓词(eq、eql、equal、equalp)都不是泛型函数,因此虽然编写这样的泛型函数并不难,但您仍然需要通过它与remove等库函数进行比较,因为它不是这些库函数的默认比较。 -
@JoshuaTaylor:你知道cdr.eurolisp.org/document/8/cleqcmp.html 吗?我已经整理了一个 CDR8 的实现,但还没有发布(需要清理并提交)。
-
@PaulNathan 我知道 CDR 存储库,但我之前没有阅读过那个特定的存储库。这看起来是个好主意。我当然会赞成使用它的答案。 :) 我知道你说你还没有发布它,但是它在任何州的任何地方都可以在线获得吗?
-
@JoshuaTaylor: github.com/pnathan/generic-comparability(我也参与过 CDR 2 的实现,但不太成熟)。
标签: common-lisp