我希望能够使用定义的类型作为defmethod的参数指定器。其动机是可读性和灵活性,以便在稍后阶段作出改变。像这样的事:
(deftype foo () 'fixnum)
(defmethod bar ((x foo)) ...)
(defmethod baz ((x foo)) ...)不过,这不管用。CLtL2说“不创建任何类”。
所以我不得不写:
(defmethod bar ((x fixnum)) ...)
(defmethod baz ((x fixnum)) ...)另一种方法是定义一个名为foo的类,它只不过是fixnum的包装器,但对于fixnum这样简单的东西来说,这不是一种不可接受的开销吗?
有更好的办法吗?
发布于 2015-04-26 12:48:22
方法不是专门处理类型,而是专门处理类或EQL。这部分是因为对象可能有多种类型(例如,整数1是FIXNUM、位、无符号字节等)。现在还不清楚如何确定优先级。
如果您希望减少类型的开销和用户定义的抽象,则TYPECASE或ETYPECASE可能比一般函数和方法工作得更好。
发布于 2015-07-22 12:50:25
我找到的最好的解决方案是使用过滤调度。
就像这样:
(define-filtered-function bar (x)
(:filters (:foo (typep x 'foo))))
(defmethod bar :filter :foo (x) ...)但是,如果使用Xach的开销太高,我可能会求助于Xach的建议。
https://stackoverflow.com/questions/29877416
复制相似问题