我希望能够将定义的类型用作defmethod
的参数专精。动机是可读性和在后期更改的灵活性。有点像这样:
(deftype foo () 'fixnum)
(defmethod bar ((x foo)) ...)
(defmethod baz ((x foo)) ...)
然而,这不起作用。 CLtL2说"表单deftype不会创建任何类。"
所以我必须写:
(defmethod bar ((x fixnum)) ...)
(defmethod baz ((x fixnum)) ...)
另一种方法是定义一个名为foo
的类,它只不过是fixnum
的包装器,但对于像{{1}这样简单的事情来说,这不是一个不可接受的开销。 }}?
有更好的方法吗?
答案 0 :(得分:7)
方法不专注于类型,他们专注于类或EQL。部分情况是这样的,因为对象可能有多种类型(例如,整数1是FIXNUM,BIT,UNSIGNED-BYTE等),并且如何确定优先级并不明显。
如果您希望减少开销和用户定义的类型抽象,TYPECASE或ETYPECASE可能比通用函数和方法更好。
答案 1 :(得分:1)
我能找到的最佳解决方案是使用filtered dispatch。
这样的事情:
(define-filtered-function bar (x)
(:filters (:foo (typep x 'foo))))
(defmethod bar :filter :foo (x) ...)
但是,如果使用这个的开销太高,我可能会采用Xach的建议。