为什么 `class-name` 在这种情况下在 REPL 中不起作用?
Why does `class-name` does not work in the REPL for this case?
我正在阅读 Sonja Keene 的书 Common Lisp 中的面向对象编程。
在第7章中,作者提出:
(class-name class-object)
这样可以查询 class 对象的名称。
使用 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}>.
上面的代码returns下面的错误信息:
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]
如何正确使用class-name
?
谢谢。
class-name
的参数必须是 class 对象,而不是 class 的实例。
使用class-of
获取实例的class,然后可以调用class-name
(class-name (class-of test-one))
使用@Barmar 对评论的提示,这将是 class-name
:
的正确方法
CL-USER> (class-name (defclass stack-overflow ()
((slot-1 :initform 1 )
(slot-2 :initform 2))))
STACK-OVERFLOW
class-name
接收作为参数的 class。为了使用实例,正确的方法是使用 class-of
:
CL-USER> (class-of 'test-one)
#<BUILT-IN-CLASS COMMON-LISP:SYMBOL>
不过我不确定为什么 class-name
会有帮助。
我正在阅读 Sonja Keene 的书 Common Lisp 中的面向对象编程。
在第7章中,作者提出:
(class-name class-object)
这样可以查询 class 对象的名称。
使用 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}>.
上面的代码returns下面的错误信息:
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]
如何正确使用class-name
?
谢谢。
class-name
的参数必须是 class 对象,而不是 class 的实例。
使用class-of
获取实例的class,然后可以调用class-name
(class-name (class-of test-one))
使用@Barmar 对评论的提示,这将是 class-name
:
CL-USER> (class-name (defclass stack-overflow ()
((slot-1 :initform 1 )
(slot-2 :initform 2))))
STACK-OVERFLOW
class-name
接收作为参数的 class。为了使用实例,正确的方法是使用 class-of
:
CL-USER> (class-of 'test-one)
#<BUILT-IN-CLASS COMMON-LISP:SYMBOL>
不过我不确定为什么 class-name
会有帮助。