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吗?
有没有更好的办法?
方法不专注于类型,它们专注于类或EQL.部分情况是这样的,因为一个对象可能有很多种类(例如,整数1是FIXNUM,BIT,UNSIGNED-BYTE等),如何确定优先级并不明显.
如果您希望减少开销和用户定义的类型抽象,TYPECASE或ETYPECASE可能比通用函数和方法更好.