在defmethod中使用Common Lisp用户定义的类型

use*_*663 3 methods common-lisp clos dispatch deftype

我希望能够使用已定义的类型作为参数特化器defmethod.动机是可读性和在后期更改的灵活性.像这样:

(deftype foo () 'fixnum)

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

(defmethod baz ((x foo)) ...)
Run Code Online (Sandbox Code Playgroud)

但这不起作用.CLtL2说"表单deftype不会创建任何类."

所以我要写:

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

(defmethod baz ((x fixnum)) ...)
Run Code Online (Sandbox Code Playgroud)

另一种方法是定义一个被调用的类foo,它只不过是一个包装器,fixnum但对于像这样简单的东西来说,这不是一个不可接受的开销fixnum吗?

有没有更好的办法?

Xac*_*ach 8

方法不专注于类型,它们专注于类或EQL.部分情况是这样的,因为一个对象可能有很多种类(例如,整数1是FIXNUM,BIT,UNSIGNED-BYTE等),如何确定优先级并不明显.

如果您希望减少开销和用户定义的类型抽象,TYPECASE或ETYPECASE可能比通用函数和方法更好.