为什么Common Lisp的class-name函数在SBCL REPL传入实例时报错?正确用法是什么?
class-name的入参要求为类对象,你报错是因为直接传入了stack-overflow类的实例,类型不匹配导致泛函数找不到可用方法。
正确用法分为两种常见场景:
- 已知类名的情况下,先通过
find-class获取对应类对象,再传入class-name - 仅持有类实例的情况下,先通过
class-of获取该实例对应的类对象,再传入class-name
对应你的测试场景,完整可运行的示例如下:
CL-USER> (defclass stack-overflow () ((slot-1 :initform 1 ) (slot-2 :initform 2))) #<STANDARD-CLASS COMMON-LISP-USER::STACK-OVERFLOW> CL-USER> (defvar test-one (make-instance 'stack-overflow)) TEST-ONE ; 场景1:已知类名时的调用 CL-USER> (class-name (find-class 'stack-overflow)) STACK-OVERFLOW ; 场景2:仅持有实例时的调用 CL-USER> (class-name (class-of test-one)) STACK-OVERFLOW
内容的提问来源于stack exchange,提问作者Pedro Delfino
相关产品推荐
相关产品推荐

