【问题标题】:Using a Common Lisp user-defined type in defmethod在 defmethod 中使用 Common Lisp 用户定义类型
【发布时间】:2015-04-26 12:08:03
【问题描述】:

我希望能够将定义的类型用作defmethod 的参数专用器。动机是在后期更改的可读性和灵活性。有点像这样:

(deftype foo () 'fixnum)

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

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

但是这不起作用。 CLtL2 说 “表单 deftype 不创建任何类。”

所以我必须写:

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

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

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

有没有更好的办法?

【问题讨论】:

  • CLtL2 已过时。请使用基于 ANSI Common Lisp 标准的 Common Lisp HyperSpec CLHS
  • CLHS 谈到defmethodparamet-specializer-names如果 parameter-specializer-name 是一个符号,它会命名一个类
  • 其实CLHS也说操作符deftype不会创建任何类。

标签: methods common-lisp dispatch clos deftype


【解决方案1】:

方法不专注于类型,它们专注于类或 EQL。部分原因是因为一个对象可能有多种类型(例如,整数 1 是一个 FIXNUM、一个 BIT、一个 UNSIGNED-BYTE 等)并且如何决定优先级并不明显。

如果您想要更少的开销和用户定义的类型抽象,TYPECASE 或 ETYPECASE 可能比泛型函数和方法更有效。

【讨论】:

    【解决方案2】:

    我能找到的最佳解决方案是使用filtered dispatch

    类似这样的:

    (define-filtered-function bar (x)
      (:filters (:foo (typep x 'foo))))
    
    (defmethod bar :filter :foo (x) ...)
    

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

    【讨论】:

      猜你喜欢
      • 2011-01-10
      • 2011-12-24
      • 2012-07-12
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      • 2015-05-10
      • 1970-01-01
      相关资源
      最近更新 更多