2016-10-02 7 views
1

パッケージをたくさん使用し、エクスポートされたシンボルが名前を変更することがよくあります。私はパッケージを再コンパイルしようとすると、私はこのような警告が表示されます:名前が変更されたエクスポートシンボルの一括「unintern」

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)が自動的にunintern古い/以前にエクスポートされたシンボルにsbclまたはemacsに知らせることが可能であるされていますか?

2)そうでない場合、すべての「古い」シンボルを変数に入れることは可能ですか?

2のための私の計画は)私はあなたがシンボルをuniternしたくないと思う(apply #'unintern *old-symbols*)

+3

'* on-package-variance *'に '(list:warn nil:error t)'(変数の説明を参照)のようなものを設定すると、シンボルをドロップするオプションが得られます。 – jkiiski

+0

これは正しい方法だと思われますが、それでも動作させることはできません。私は ':warn'を' nil'に、 ':error'を' nil'に設定しようとしました...どんな提案も大歓迎です... – tsikov

+0

':error t'を設定する必要があります。それ以外の場合は再起動しません。 – jkiiski

答えて

4

ことを行うことができます。エラーはシンボルをアンエクスポートするために再起動DROP-THEMを持っています。

あなたはSBCLの起動時には、必ず設定しているためにあなたの~/.sbclrc

(setf *on-package-variance* '(:error t)) 

を追加することができます。

3

まず何かに結合するキーを作ることです。 Uninternはそれらをパッケージから削除します。私はあなたが警告を避けるためにそれらをunexportしたいと思う。あなたは、パッケージを再定義する場合、リスト(:error t)に変数*on-package-variance*を設定すると、あなたの代わりに、警告のエラーを与える、以下の機能を備えた

(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") 
+2

正しいパッケージからアンエクスポートすることを確認してください。パッケージ引数を指定する必要があります。さもなければあなたは '現在の'パッケージからアンエクスポートします。 FIND-PACKAGEと同じです。それ以外の場合は、現在のパッケージからSTATUSを取得します。 –

+0

@RainerJoswig良いキャッチ、私はコードを変更しました – PuercoPop

+1

FIND-PACKAGEではなく、FIND-SYMBOLと言いたいと思います。コード内のFIND-SYMBOLも変更する必要があります。 –

関連する問題