GNU Smalltalk は初めてです。ほとんどのプログラミング言語には、あるソース ファイルに別のソース ファイルの内容へのアクセスを許可する // コマンドがあるimport
ことを私は知ってい#include
ます。require
私の質問は、GNU Smalltalk であるファイルを別のファイルにインポートするにはどうすればよいですか? どんな助けでも大歓迎です。ありがとう!
2 に答える
Smalltalk はレイト バウンドであるため、import/include/require/use なしで動作する可能性があります。
- クラス名は、クラス名 (キー) をクラス (値) に関連付ける SystemDictionary である (以前は) Smalltalk という名前のグローバル名前空間で解決されます。このキーと値のペアは、Smalltalk ブランドに応じたバインディング オブジェクトまたは関連付けオブジェクトです。コンパイラによって生成されたバイトコードは、コンパイルされたメソッドリテラルに格納されているバインディング (へのポインターを理解し、バインディングが共有されている) をプッシュし、その値を抽出します。
- クラスがまだ存在しない場合、バインディングは Undeclared という名前の特別なディクショナリに格納されます。この宣言されていない変数が後で定義されると、定義が変更され (つまり、値が変更され)、バインディングがシステム ディクショナリに移動されます。
- メソッド名 (いわゆるセレクター) については、実行時までまったく解決されません。コンパイラーによって生成されるバイトコードは、レシーバーをプッシュします。引数をプッシュします。セレクタを送ります。
遅延バインディングを可能にするのは、メッセージを送信することによってのみオブジェクトと対話できることです。また、受信者のクラス methodDictionary 内のセレクターに対応するキーを検索することにより、実行時にメッセージ ルックアップが実行されます。
ただし、クラス側の初期化を処理するときは、ロード順序が重要です。宣言されていないバインディングは nil で初期化されるため、メッセージを nil に送信することはおそらく不適切であり、MessageNotUnderstood 例外が発生する可能性があります。
そのため、gnu smalltalk はパッケージの概念を追加しました。これは、依存関係を記述し、ロード順序を指示し、最終的に定義を別の名前空間に配置する一種のメタデータです。
この回答のほとんどは、Smalltalk-80 の背後にある基本原則からのものです。
最新の gnu 実装では異なる場合があります。
見る
- https://www.gnu.org/software/smalltalk/manual/html_node/Namespaces.html
- https://www.gnu.org/software/smalltalk/manual/html_node/Packages.html#パッケージ
最後に: Smalltalk-80 では、ソース コードがファイルまたは別のファイルに保存されていたという事実は、実装の詳細がユーザーから隠されていました。
ブラウザで直接コーディングします。
最終的には、メソッド/クラス/カテゴリを fileOut にエクスポートしますが、このファイルを自分で書き込むことは決してありません。
GNU Smalltalk は、この点で少しハイブリッドです。