如何在Common Lisp中取消阴影符号

时间:2017-01-04 07:44:38

标签: common-lisp

我已经阴影了'和符号做了一些实验:

MATCHERS> (package-shadowing-symbols *package*)
(AND)

(setf (package-shadowing-symbols *package*) nil)和Slime都不起作用。

1 个答案:

答案 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创建了符号:

  

如果包中已经可以访问名称与字符串相同的符号,则返回该符号。如果包中无法访问此类符号,则会创建具有给定名称的新符号,并将其作为内部符号输入包中