2016-08-29 5 views
0

システムAおよびシステムBは、ASDFを使用して作成されたシステムです。それらは両方とも.asdファイルにシステム定義を持ち、パッケージを定義するとそれぞれ:system-a:system-bです。方法:ASDFで作成したシステムを使用しますか?

私はSystem-Aのパッケージ定義にSystem-Bのパッケージを:useにします。 System-Bのパッケージを参照することなくSystem-AのSystem-Bのシンボルを使用できるようにしたい。具体的には、system-b:symbolではなくsymbolを使用します。

現在、システムAのパッケージ定義では、:use :system-bを試しています。これは、自分のシステムではなく、QuickLispを使ってインポートしたライブラリをインターンにするために働きます。

:use :system-b私はSystem-Aのパッケージ内のシンボルをインターンすることができますか?

+1

に相当したシステムは、シンボルを持っていません。シンボルはパッケージ内に格納されます。通常、シンボルをエクスポートするシステムと同じ名前のパッケージを定義します。 – jkiiski

+0

ありがとう、私は質問を明確にした。 – audrow

+0

独自のシステムとQuicklispでインストールされたシステムを使用する場合との違いはありません。あなたはどんなエラーを出していますか? 'SYSTEM-B' okを読み込めますか? – jkiiski

答えて

0

ここで私は私が見つけた解決策が表示されます:


最初はパッケージ定義でシンボルをエクスポートすることです。私の例を使用して、システム-Bのパッケージ定義で

(defpackage :system-b 
    (:use :cl) 
    (:export :symbol1 
      :symbol2 
      ...)) 

およびシステムAのパッケージ定義で

(defpackage :system-a 
    (:use :cl 
     :system-b)) 

次に、あなたが(in-package :system-a)ているときは、System-Bのエクスポートされたシンボルへのアクセス権を持っています。


第二に、あなたは(ユーティリティパッケージを作る)エクスポートするシンボルの多くを持っている場合は、以下を使用することができますが、hereを発見しました。

(let ((package (find-package :foo))) 
    (do-all-symbols (symbol package) 
    (when (eql (symbol-package symbol) package) 
     (export symbol)))) 

すべてのシンボルが作成された後にこのコードを入力してください。 ASDFを使用する場合は、システム定義で最後にロードされたファイルにこれらの行を含めて、手動で定義することなくすべてのシンボルをエクスポートすることができます。


シンボルをエクスポートする第三の選択肢は、他のもののうち、あなたがそれをエクスポートする@exportを関数の接頭辞として指定することを可能にする、cl-annotです。例えば、

@export 
(defun foobar() 
    ...) 

(progn 
    (export 'foobar) 
    (defun foobar() 
    ...)) 
+2

'system-a'はパッケージに混乱する名前です。パッケージはシステムではありません。 'cl-annot'は普通の醜いです。別のアイデアは、シンボルをエクスポートするdefunの変種を使用することです。しかし、それはs式のままであり、リーダー構文拡張を使用しません。また、パッケージのすべてのシンボルを反復処理することでエクスポートすることはまれです。パッケージには、エクスポートには役に立たないシンボルがたくさんある可能性があります。 (defun a() 'b) - > export bなぜですか? –

+1

私はdo-all-symbols(すべてのパッケージのすべてのシンボルを繰り返します)ではなく、do-symbols(パッケージ内でアクセス可能なシンボルを繰り返します)を使用します。 –

+2

'(export(defun foo()...))'も動作します(setf関数を除いて)。ほとんどの 'def-x'形式は、定義されているものの名​​前を返します。 – coredump

関連する問題