首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在defmethod中使用公共Lisp用户定义的类型

在defmethod中使用公共Lisp用户定义的类型
EN

Stack Overflow用户
提问于 2015-04-26 12:08:03
回答 2查看 1.1K关注 0票数 4

我希望能够使用定义的类型作为defmethod的参数指定器。其动机是可读性和灵活性,以便在稍后阶段作出改变。像这样的事:

代码语言:javascript
复制
(deftype foo () 'fixnum)

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

(defmethod baz ((x foo)) ...)

不过,这不管用。CLtL2说“不创建任何类”。

所以我不得不写:

代码语言:javascript
复制
(defmethod bar ((x fixnum)) ...)

(defmethod baz ((x fixnum)) ...)

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

有更好的办法吗?

EN

回答 2

Stack Overflow用户

发布于 2015-04-26 12:48:22

方法不是专门处理类型,而是专门处理类或EQL。这部分是因为对象可能有多种类型(例如,整数1是FIXNUM、位、无符号字节等)。现在还不清楚如何确定优先级。

如果您希望减少类型的开销和用户定义的抽象,则TYPECASE或ETYPECASE可能比一般函数和方法工作得更好。

票数 10
EN

Stack Overflow用户

发布于 2015-07-22 12:50:25

我找到的最好的解决方案是使用过滤调度

就像这样:

代码语言:javascript
复制
(define-filtered-function bar (x)
  (:filters (:foo (typep x 'foo))))

(defmethod bar :filter :foo (x) ...)

但是,如果使用Xach的开销太高,我可能会求助于Xach的建议。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29877416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档