Forth環境に対して質問するワードについていくつか説明する。

ENVIRONMENT?


Forth標準規格でCOREワード規定されているENVIRONMENT?は、当のForth環境で扱える整数の最大値や文字列の長さの制限などについての特性を返す。ただし、何でも分るというわけではなく、規定された事項について回答するのみであり、さらに、回答不能の場合(未定義も含む)はfalseを返すだけの場合もある。回答可能な質問にはtrueとともに該当する値を返す。

質問事項は決まった文字列を用いなければならず、それをENVIRONMENT?の入力として実行する。

ENVIRONMENT? ( c-addr u -- false | i×x true )

規定されている可能な質問事項は次の通りである。
文字列 定数かどうか 意味
/CONUNTED-STRING n yes countされる文字列の最大値を文字数で返す
/HOLD n yes 数字の文字列を格納するバッファのサイズを文字数で返す
/PAD n yes ワードPADでポイントされるバッファのサイズ
ADDRESS-UNIT-BITS n yes アドレスの1単位のビット数
FLOORED flag yes デフォルトの割り算がフロアードであればtrue
MAX-CHAR u yes その環境で文字として定義されている値の最大値
MAX-D d yes 符号付きダブル整数の最大値
MAX-N n yes 符号付きシングル整数の最大値
MAX-U u yes 符号なしシングル整数の最大値
MAX-UD ud yes 符号なしダブル整数の最大値
RETURN-STACK-CELLS n yes リターンスタックの最大セル数
STACK-CELLS n yes データスタックの最大セル数
FLOATING-STACK n yes 独立の浮動小数点数スタックの最大深度(データスタックを用いる場合は0)
MAX-FLOAT r yes 浮動小数点数の最大値
#LOCALS n yes ひとつの定義における局所変数の最大個数
WORDLISTS n yes 検索順序指定のために利用できるワードリストの最大個数
XCHAR-ENCODING c-addr u no 拡張文字のエンコード名をASCII文字列で返す
MAX-XCHAR u no xcharの最大値
XCHAR-MAXMEM u no ひとつのxcharに費やされるメモリーをアドレス単位の値で
浮動小数点数関連のもの以下はオプションである。"アドレス単位"というのは、PCでは通常はバイトである。
使い方は要するに、
S" MAX-UD" ENVIRONMENT?
とやると、値とフラグが返されるということである。
通常は各環境のドキュメントがあると思われるが、それが無くなってしまったような状況で保守担当にされてしまったような人のためにあるのであろう。
iMopsでは、オプションの部分はfalseを返すだけになっている。

WORDS


当環境中で現在ワードリストに属する全ワード名を印字するのがWORDSである。入出力はとらない。
WORDS ( -- )
複数のワードリストを持っている環境の場合は、第一に検索されるリストに関して表示する。表示順序は、検索でヒットする順、つまり、新しく定義されたものから順に表示する。
複数ワードリストについては、他のページでも説明すると思うが、要するに、モジュール毎に名前空間を切り離して、検索の順を入れ替える機能である。
Mopsにはワードリスト切り替え機能はないが、適切にオブジェクト指向でプログラムすれば必要性は感じられないだろう、というのがMichael Hore氏
の見解である。同意である。

Mopsではパブリックなワードリストは1つしかないので、定義されている全ワードが表示される。メソッドとインスタンス変数は別リストであってパブリックではないので、ここには含まれない。iMopsではWORDSはオプションになっており、inspectorsというソースコードファイルをロードすることで初めて利用可能となる。

表示の形式は、表示順序以外は環境毎に適当に決めれば良いことになっている。ワード名には変数名や定数名も含まれる。Mopsでは、ワードのxt情報などとともに表示されるが、ワード数は極めて多く(3000程度)、あまり役に立つとはいえない。小さい環境では規格の一部しか定義されていないことも多いため有用だったらしい。PowerMopsまではコンソールウィンドウに印字されるが、iMopsでは別ウィンドウを開いて表示するようになっている。

CLASSES OBJECTS

Mopsには、既定義のクラスのリスト、既定義のオブジェクト(クラスインスタンス)のリストを、それぞれ表示する、CLASSESOBJECTSも定義されている(iMopsではinspectorsオプション)。PowerMopsではListメニューの項目(ワードとしては、doCListとdoOlist)として提供されているが、iMopsでは、inspectorsにおいてワードとして定義されている。クラス名とオブジェクト名は、定義上ワード名に含まれるので、WORDSのリストの中にも表示されているが、埋もれてしまうので、対応する情報とともに別リストで表示させることになったのである。

CLASSES ( -- )  doCList ( -- )
OBJECTS ( -- )  doOList ( -- )
CLASSESは、既定義クラス名と、その直近上位クラス名の情報を表示する。
OBJECTSは、既定義オブジェクトと、それが属するクラス名の情報を表示する。
どちらもWORDSの場合と同じウィンドウに表示される。

SEE


SEEは、ワードの定義内容を知るためのforth標準ワードである。SEEの後に、内容を知りたいワード名を書く。
SEE ( "<spaces>name" -- )
内容コード表示の様式は環境によって異なる。
実際のソースコードを表示するものもあるようであるし、コンパイルされたコードから内容を再構成して表示するものもあるようである。スレッディング方式を採用していれば再構成も容易である。ネイティブコード型だと難しいが、マシンインストラクションから推測して表示するという実装のものもあるようである。また、人間が認識できるコード内容ということであるから、アセンブリのニーモニックでもよいことになるだろう。もっとも、ディスアセンブルするためのワードは、別途定義されている環境も多い。

LOCATE

MopsではSEEは定義されていない。しかし代わりにLOCATEというワードが定義されている。これは、ソースコードファイル内の、当のワードが定義されている場所を開くものである。Mopsはオープンソースで、開発環境を構築する全てのソースコードが付属しているので、実際のソースを見る方が正確である。他の環境でもLOCATEが定義されているものはあるようである。

PowerMopsまでは、付属のソーステキストエディターであるQuickEditが起動されていることが条件で、エディターのウィンドウ上に表示される(QuickEditが起動されていないとエラーになる)。
iMopsでは、WORDSの場合と同じ特別ウィンドウで表示する。

次は、スタックの話題へ



最終更新:2019年03月27日 23:16