Ped*_*ino 1 oop common-lisp class-names
我正在阅读Sonja Keene 的《Common Lisp 中的面向对象编程》一书。
在第七章中,作者提出:
(class-name class-object)
Run Code Online (Sandbox Code Playgroud)
这使得查询类对象的名称成为可能。
使用 SBCL 和 SLIME 的 REPL,我尝试了:
; SLIME 2.26.1
CL-USER> (defclass stack-overflow ()
((slot-1 :initform 1 )
(slot-2 :initform 2)))
#<STANDARD-CLASS COMMON-LISP-USER::STACK-OVERFLOW>
CL-USER> (make-instance 'stack-overflow)
#<STACK-OVERFLOW {1002D188E3}>
CL-USER> (defvar test-one (make-instance 'stack-overflow))
TEST-ONE
CL-USER> (slot-value test-one 'slot-1)
1
CL-USER> (class-name test-one)
; Evaluation aborted on #<SB-PCL::NO-APPLICABLE-METHOD-ERROR {10032322E3}>.
Run Code Online (Sandbox Code Playgroud)
上面的代码返回以下错误消息:
There is no applicable method for the generic function
#<STANDARD-GENERIC-FUNCTION COMMON-LISP:CLASS-NAME (1)>
when called with arguments
(#<STACK-OVERFLOW {1003037173}>).
[Condition of type SB-PCL::NO-APPLICABLE-METHOD-ERROR]
Run Code Online (Sandbox Code Playgroud)
该如何正确使用呢class-name?
谢谢。
的参数class-name必须是类对象,而不是类的实例。
用于class-of获取实例的类,然后可以调用class-name
(class-name (class-of test-one))
Run Code Online (Sandbox Code Playgroud)