describe 方法的特殊行为,如 Sonya E. Keene 所解释

Specializing behavior of describe method, as explained by Sonya E. Keene

在 S. Keene 的 COMMON LISP 中的面向对象编程 一书中,她通过提供 :after 方法用于某些 classes,但这将导致 SBCL 和 Clozure 出错:

COMMON-LISP:DESCRIBE already names an ordinary function or a
macro. [Condition of type SB-INT:SIMPLE-PROGRAM-ERROR]

当我尝试为我的 class 修改 describe 的行为时会发生这种情况:

(defclass klasse ()
  ())

(defmethod describe :after ((obj klasse))
  (print "Klasse!"))

由于这本书是 1989 年的,这些锁定政策是在这本书发行后发生的,还是我遗漏了什么?

据我所知,这本书描述的是ANSI标准化之前的语言(标准化发生在1994年)。 在 ansi cl describe 确实是在普通函数上,而有一个通用函数,名为 describe-object

CLHS 在 this subject 上说了以下内容:

The actual act of describing the object is implemented by describe-object. describe exists as an interface primarily to manage argument defaulting (including conversion of arguments t and nil into stream objects) and to inhibit any return values from describe-object.

因此,您需要做的是指定

(defmethod describe-object :after ((obj klasse) stm) 
    (print "Klasse!" stm)) 

并用 describe 调用它:

CL-USER> (describe (make-instance 'klasse))
;;=> #<KLASSE {1001C3C1F3}>
;;     [standard-object]
;;   No slots.

;;   "Klasse!" 
;;   ; No values