批量“unintern”用于重命名的导出符号

时间:2016-10-02 14:21:29

标签: common-lisp sbcl

我经常使用包,导出的符号经常更改其名称。当我尝试重新编译包时,我得到这样的警告:

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)来表示我不想再使用该符号的系统。然而,当有大量重命名时,这变得非常繁琐。

我的问题是:

1)是否可以自动向sbclemacs unintern发信号通知旧/先前导出的符号?

2)如果不是 - 是否可以获得所有" old"变量中的符号?

我的2)计划是将密钥绑定到(apply #'unintern *old-symbols*)

之类的内容

2 个答案:

答案 0 :(得分:4)

将变量(:error t)设置为列表DROP-THEM会在重新定义包时给出错误而不是警告。该错误将重新启动(setf *on-package-variance* '(:error t)) 以取消导出符号。

您可以添加

~/.sbclrc

到你的 new Thread() { override def run(): Unit = { processedDF.write.format("ORC").options(Map("path" -> integrationFullPath)).mode(SaveMode.Overwrite).saveAsTable(HIVE_SCHEMA + "." + hiveTableName + "_int") } }.start() new Thread() { override def run(): Unit = { errorDF.write.format("ORC").options(Map("path" -> errorFullPath)).mode(SaveMode.Overwrite).saveAsTable(HIVE_SCHEMA + "." + hiveTableName + "_error") } }.start() 以便在启动SBCL时始终设置它。

答案 1 :(得分:3)

首先,我不认为你想要单位符号。 Unintern将它们从包中删除。我想你想要取消它们以避免警告。您可以使用以下功能

执行此操作
(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")