我已经阴影了'和符号做了一些实验:
MATCHERS> (package-shadowing-symbols *package*)
(AND)
Run Code Online (Sandbox Code Playgroud)
既不(setf (package-shadowing-symbols *package*) nil)是斯莱姆也不行.
唉,没有非破坏性的方法来解决你的问题:"阴影"意味着你temp-pack::and在"光源"(cl:and)和你正在看的地点之间有"东西"(("AND"下面的字符串):
(let ((*package* (find-package '#:temp-pack)))
(read-from-string "AND"))
=> TEMP-PACK::AND, 3
Run Code Online (Sandbox Code Playgroud)
唯一的出路是移除阻挡光线的障碍物.
修改后的例子shadow
应该具有指导意义:
(package-shadowing-symbols (make-package '#:temp-pack))
=> NIL
(find-symbol "AND" '#:temp-pack)
=> AND, :INHERITED
(shadow "AND" '#:temp-pack)
=> T
(find-symbol "AND" '#:temp-pack)
=> TEMP-PACK::AND, :INTERNAL
(package-shadowing-symbols '#:temp-pack)
=> (TEMP-PACK::AND)
(find-all-symbols "AND")
=> (:AND AND TEMP-PACK::AND)
(unintern 'temp-pack::and '#:temp-pack)
=> T
(find-all-symbols "AND")
=> (:AND AND)
(package-shadowing-symbols '#:temp-pack)
=> NIL
Run Code Online (Sandbox Code Playgroud)
你必须实际上是因为只要它被实习,它就会被遮蔽.unintern ANDTEMP-PACKCL:AND
此外,保存它象征的把戏不工作:
(shadow "AND" '#:temp-pack)
=> T
(defparameter temp-pack-and 'temp-pack::and)
=> TEMP-PACK-AND
(unintern 'temp-pack::and '#:temp-pack)
=> T
(shadow "AND" '#:temp-pack)
=> T
temp-pack-and
=> #:AND
(eq temp-pack-and 'temp-pack::and)
=> NIL
Run Code Online (Sandbox Code Playgroud)
这是因为intern创建了一个新符号:
如果名称与字符串相同的符号已在包中访问,则返回该符号.如果包中不能访问此类符号,则会创建具有给定名称的新符号,并将其作为内部符号输入包中