首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在这种情况下“类-名”在REPL中不起作用?

为什么在这种情况下“类-名”在REPL中不起作用?
EN

Stack Overflow用户
提问于 2021-09-30 18:48:47
回答 2查看 72关注 0票数 1

我正在阅读Sonja Keene的“公共Lisp中面向对象的编程”一书。

在第七章中,作者提出:

代码语言:javascript
复制
(class-name class-object)

这样就可以查询类对象的名称。

使用SBCL和黏液的REPL,我尝试:

代码语言:javascript
复制
; 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}>.

上面的代码返回下面的错误消息:

代码语言:javascript
复制
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

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-30 18:52:44

class-name的参数必须是类对象,而不是类的实例。

使用class-of获取实例的类,然后调用class-name

代码语言:javascript
复制
(class-name (class-of test-one))
票数 5
EN

Stack Overflow用户

发布于 2021-09-30 18:52:58

使用@Barmar对评论的提示,这将是使用class-name的正确方法

代码语言:javascript
复制
CL-USER> (class-name (defclass stack-overflow () 
                       ((slot-1 :initform 1 )
                        (slot-2 :initform 2))))
STACK-OVERFLOW

class-name接收一个类作为参数。为了处理实例,正确的方法是使用class-of

代码语言:javascript
复制
CL-USER> (class-of 'test-one)
#<BUILT-IN-CLASS COMMON-LISP:SYMBOL>

不过,我不知道为什么class-name会有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69397453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档