gpt4 book ai didi

namespaces - 使用错误意外继承插槽(值)

转载 作者:行者123 更新时间:2023-12-03 12:45:15 26 4
gpt4 key购买 nike

(defpackage :winner
(:use :cl)
(:export e1))

(in-package :winner)

(define-condition e1 ()
((name
:initform "e1"
:reader name)
(package
:initform "winner"
:reader related-package)))

(defmethod print-object ((err e1) stream)
(FORMAT stream "~a~%~a~%" (name err) (related-package err)))


(defpackage :loser
(:use :cl :winner)
(:export e2))

(in-package :loser)

(define-condition e2 (e1)
((name
:initform "e2")
(package
:initform "loser")))

我现在期望:
(make-instance 'e1)
e1
winner

(make-instance 'e2)
e2
loser

但相反我得到
(make-instance 'winner:e1)
e1
winner

(make-instance 'loser:e2)
e1
loser

这是非常出乎意料的。
我犯了什么错误?

最佳答案

如果您使用 DESCRIBE,这相对容易看出。 .

? (make-instance 'loser:e2)
e1
loser

? (describe *)
e1
loser

Class: #<STANDARD-CLASS LOSER:E2>
Wrapper: #<CCL::CLASS-WRAPPER LOSER:E2 #x302000ECE15D>
Instance slots
WINNER::NAME: "e1"
PACKAGE: "loser"
LOSER::NAME: "e2"

您看到的是该对象具有三个 (!) 插槽: WINNER::NAME , PACKAGELOSER::NAME .

这是为什么? PACKAGE是包中的符号 CL ( PACKAGE 是 Common Lisp 中的系统类,类型)。由于您的两个包都使用 CL,因此两者都具有相同的符号 PACKAGE因此只有一个名称 CL:PACKAGE 的插槽.
NAME是每个包的本地符号。每个包都有自己的符号名称。因此每个对象有两个不同的槽 WINNER::NAMELOSER::NAME .

由于您的打印机功能仅读取插槽 WINNER::NAME ,你只能得到它的内容。

你需要记住什么?
  • 有一个定制打印机很好,但使用 DESCRIBE用于调试
  • 包是符号的命名空间。它们不是类、槽、函数等概念的模块。
  • CL带有许多符号。如果你的包使用包CL , 那么它就有了所有这些符号。是否将它们用于函数名、变量、类名、槽名……都没有关系。
  • 关于namespaces - 使用错误意外继承插槽(值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16067514/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com