首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Common Lisp中取消符号阴影

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

Stack Overflow用户
提问于 2017-01-04 15:44:38
回答 1查看 122关注 0票数 1

我对‘和symbol做了一些实验:

代码语言:javascript
复制
MATCHERS> (package-shadowing-symbols *package*)
(AND)

无论是(setf (package-shadowing-symbols *package*) nil)还是Slime都不能工作。

EN

回答 1

Stack Overflow用户

发布于 2017-01-04 22:16:50

遗憾的是,没有非破坏性的方法来解决你的问题:“阴影”意味着你在“光源”(cl:and)和你正在观察的光斑(下面的字符串"AND" )之间有“一些东西”(temp-pack::and):

代码语言:javascript
复制
(let ((*package* (find-package '#:temp-pack)))
  (read-from-string "AND"))
=> TEMP-PACK::AND, 3

唯一的出路就是清除阻挡光线的障碍物。

来自shadow的修改后的示例应该具有指导性:

代码语言:javascript
复制
(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

你必须从TEMP-PACK unintern AND,因为只要它驻留在那里,它就会隐藏CL:AND

此外,保存符号的技巧不起作用:

代码语言:javascript
复制
(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创建了一个新元件:

如果在包中已经可以访问与字符串同名的符号,则返回该符号。如果包中没有这样的符号可访问,则会创建一个具有给定名称的新符号,并将其作为内部符号

输入到包中

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41458643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档