在defmethod

时间:2015-04-26 12:08:04

标签: methods common-lisp dispatch clos deftype

我希望能够将定义的类型用作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}这样简单的事情来说,这不是一个不可接受的开销。 }}?

有更好的方法吗?

2 个答案:

答案 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的建议。