Sim*_*Sim 4 namespaces common-lisp package
(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")))
Run Code Online (Sandbox Code Playgroud)
我现在期待:
(make-instance 'e1)
e1
winner
(make-instance 'e2)
e2
loser
Run Code Online (Sandbox Code Playgroud)
但我得到了
(make-instance 'winner:e1)
e1
winner
(make-instance 'loser:e2)
e1
loser
Run Code Online (Sandbox Code Playgroud)
这是非常意外的.我犯了什么错误?
Rai*_*wig 10
如果你使用它,这是相对容易看到的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"
Run Code Online (Sandbox Code Playgroud)
你看到的是,该对象有三个槽(!) WINNER::NAME,PACKAGE和LOSER::NAME.
这是为什么?PACKAGE包中的符号CL(PACKAGE是一个系统类,一个类型,在Common Lisp中).由于您的包都使用CL,因此两者都具有相同的符号PACKAGE,因此只有一个名称的插槽CL:PACKAGE.
NAME是每个包装的本地符号.每个包都有自己的符号名称.因此每个对象有两个不同的插槽WINNER::NAME和LOSER::NAME.
由于您的打印机功能仅读取插槽WINNER::NAME,因此您只能获取其内容.
你需要记住什么?
DESCRIBE用于调试CL附带许多符号.如果您的包使用该包CL,则它具有所有这些符号.是否将它们用于函数名,变量,类名,插槽名,......无关紧要.| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |