我已经阴影了'和符号做了一些实验:
MATCHERS> (package-shadowing-symbols *package*)
(AND)
(setf (package-shadowing-symbols *package*) nil)
和Slime都不起作用。
答案 0 :(得分:5)
唉,没有非破坏性的方法来解决你的问题:“阴影”意味着你在“光源”(temp-pack::and
)和现场之间有“东西”(cl:and
)你正在看(下面的字符串"AND"
):
(let ((*package* (find-package '#:temp-pack)))
(read-from-string "AND"))
=> TEMP-PACK::AND, 3
唯一的出路是移除挡住光线的障碍物。
来自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
您必须AND
实际unintern
TEMP-PACK
,因为只要它在那里实习,就会遮蔽CL: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
这是因为intern
创建了新符号:
如果包中已经可以访问名称与字符串相同的符号,则返回该符号。如果包中无法访问此类符号,则会创建具有给定名称的新符号,并将其作为内部符号输入包中