2012-02-21 4 views
1

クラスが定義されているパッケージを調べたいとします。 say(defclass x()())はp1で定義されています。 1つの方法は、パッケージを(symbol-package 'x)経由で入手することです。この解決策の問題は、xが別のパッケージp2にエクスポートされることです。その他の提案はありますか?lispでクラスのパッケージを見つけるには?

+12

クラスは実際にパッケージで定義されていません。記号だけがあります。クラスの名前はシンボルですが、任意のシンボルにすることができます。このシンボルは、読み取り時にデフォルトのパッケージであったパッケージからのものである必要はありません。 –

+0

あなたは答えとして投稿したいかもしれません。 – Inaimathi

+0

私は、その問題がどのように病気になっているのか理解しています。どのようなパッケージ(defclass x ..)が出現したか(ロードされたかコンパイルされたか)を知るにはどうすればよいですか? – user1222310

答えて

1

Rainer Joswig氏によると、クラスはパッケージに定義されていません。シンボルはパッケージを持ち、クラスの名前はシンボルです。

クラス定義の読み込み、コンパイル、ロード時に(おそらく3つの異なる値かもしれない)*PACKAGE*の値を知りたければ、コードを書かないとそれを取得する方法はないと思いますその時にそれを保存する。

さらに、意味のある情報のようには見えません。パッケージは単なるシンボルの名前空間であり、クラス定義の読み込み、コンパイル、ロード時に現在のパッケージは、クラスそのものとは何の関係もないはずです。

しかし、クラスxの名前がパッケージp1に存在するが、p2がそれをエクスポートする場合は、defpackageフォームのshadowのリストにxを追加することができます。後)。

+0

私はクラス図を構築し、スロット、メソッド、およびメソッドのスペシャライザをサブクラスとスーパークラスだけでなくクラスから抽出します。コンパイルされたパッケージに従ってクラスをグループ化すると良いでしょう。各クラスは、プロジェクトのパッケージ構造を反映するために開発者が選択した適切なパッケージ内のファイルで定義されていることが前提です。私はこれが必ずしも正しいとは限りませんが、依然として有用であることを理解しています。人々がコンパイルされたのとまったく同じファイルでクラス定義を変更すると仮定すると、その情報は意味を持ちます。 – user1222310

+0

クラスの名前のパッケージは、プロジェクトの構造を反映していると思います。とにかくほとんど同じ時間帯になるでしょう。 –

+0

ハッシュテーブルのように、 '* package *'の値をどこかに置くMOP関数 'ensure-class'にメソッドを定義することができます。パッケージを知りたいクラスをロードする前にこれを行う必要があります。 –

関連する問題