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
在 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