4

我希望能够将定义的类型用作defmethod. 动机是在后期更改的可读性和灵活性。像这样的东西:

(deftype foo () 'fixnum)

(defmethod bar ((x foo)) ...)

(defmethod baz ((x foo)) ...)

但是,这不起作用。CLtL2 说“表单 deftype 不创建任何类”。

所以我必须写:

(defmethod bar ((x fixnum)) ...)

(defmethod baz ((x fixnum)) ...)

另一种方法是定义一个名为的类foo,它只不过是一个包装器,fixnum但对于像fixnum?

有没有更好的办法?

4

2 回答 2

9

方法不专注于类型,它们专注于类或 EQL。部分原因是因为一个对象可能有多种类型(例如,整数 1 是一个 FIXNUM、一个 BIT、一个 UNSIGNED-BYTE 等)并且如何决定优先级并不明显。

如果您想要更少的开销和用户定义的类型抽象,TYPECASE 或 ETYPECASE 可能比泛型函数和方法工作得更好。

于 2015-04-26T12:48:22.950 回答
2

我能找到的最佳解决方案是使用过滤调度

像这样的东西:

(define-filtered-function bar (x)
  (:filters (:foo (typep x 'foo))))

(defmethod bar :filter :foo (x) ...)

但是,如果使用它的开销太高,我可能会求助于 Xach 的建议。

于 2015-07-22T12:50:25.487 回答