首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于重命名的导出符号的大容量“`unintern`”

用于重命名的导出符号的大容量“`unintern`”
EN

Stack Overflow用户
提问于 2016-10-02 14:21:29
回答 2查看 218关注 0票数 3

我经常使用软件包,导出的符号经常更改名称。当我试图重新编译包时,会收到如下警告:

代码语言:javascript
复制
package.lisp:3:1:
warning: 
    MY-PROJECT also exports the following symbols:
  (OLD-SYMBOL1 OLD-SYMBOL2 OLD-SYMBOL3)

See also:
  Common Lisp Hyperspec, DEFPACKAGE [:macro]
  SBCL Manual, *ON-PACKAGE-VARIANCE* [:variable]
--> EVAL-WHEN 
==>
  (SB-IMPL::%DEFPACKAGE "MY-PACKAGE" '("KE") 'NIL 'NIL 'NIL '("CL") 'NIL
                        'NIL '("NEW-EXPORTED-SYMBOL1" "NEW-EXPORTED-SYMBOL2") '("MY-PROJECT") 'NIL
                        ...)

我知道我可以使用(unintern 'old-symbol1)来向系统发送信号,我不想再使用那个符号了。然而,当有大量的重命名时,这将变得非常乏味。

我的问题是:

可以向sbcl emacs emacs unintern 自动发送旧的/先前导出的符号?

( 2)如果不能--是否有可能在变量中获取所有“旧”符号?

我的计划是将一个键绑定到类似于(apply #'unintern *old-symbols*)的东西

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-03 07:38:13

当重新定义包时,将变量*on-package-variance*设置为list (:error t)将给出一个错误,而不是警告。该错误将重新启动DROP-THEM以取消导出符号。

你可以添加

代码语言:javascript
复制
(setf *on-package-variance* '(:error t))

在启动SBCL时始终将其设置为~/.sbclrc

票数 5
EN

Stack Overflow用户

发布于 2016-10-02 15:15:01

首先,我认为你不想把符号统一起来。Unintern将它们从包裹中移除。我想你想要取消出口以避免警告。您可以使用以下函数来完成这一任务

代码语言:javascript
复制
(defun unexport-package-symbols (package)
  (do-symbols (symbol package)
    (destructuring-bind (symbol status)
        (find-symbol (symbol-name symbol) package)
      (when (eq status :external)
        (cl:unexport symbol package)))))

;; It takes a package-designator as an argument.
(unexport-package-symbols "MY-PACKAGE")
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39817934

复制
相关文章

相似问题

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