6.17 Environmental Queries

Forth-94 は、システム上で実行されているプログラムがシステムの特定の特性を判断する方法として「環境問い合わせ」(“environmental query”)という概念を導入しました。 標準では、 システムが認識できるたくさんの文字列と、 それらを問い合わせする方法が指定されています。

environment? ( c-addr u – false / ... true  ) core “environment-query”

文字列 c-addr, u を指定します。 文字列が認識されない場合は、 false フラグを返します。 それ以外の場合は、true フラグと、 問い合わせした文字列に関する(それ固有の)情報を返します。

注意: 例えば ADDRESS-UNIT-BITS のドキュメントではスタック上に 1 つのセルを返すことが示されていますが、 environment? を使用して問い合わせすると、 文字列が認識されたことを示す true フラグという追加の項目が返されることに注意してください。 ADDRESS-UNIT-BITS を問い合わせた場合、 environment? のスタック効果は ( c-addr u -- n true ) です。

いくつかの環境問い合わせ(environmental query)はシステムの制限を取り扱います:

ADDRESS-UNIT-BITS ( – n  ) environment “ADDRESS-UNIT-BITS”

1 つのアドレス単位のサイズ(ビット単位)。

MAX-CHAR ( – u  ) environment “MAX-CHAR”

文字セット内の任意の文字の最大値

/COUNTED-STRING ( – n  ) environment “slash-counted-string”

カウンタ付き文字列の最大サイズ(文字単位)。

/HOLD ( – n  ) environment “slash-hold”

表示数値文字列の出力バッファーのサイズ(文字単位)。

/PAD ( – n  ) environment “slash-pad”

PAD が指すスクラッチ領域のサイズ(文字数)。

CORE ( – f  ) environment “CORE”

完全なコア・ワード・セットが存在する場合は true。 Gforth では常に当てはまります。

CORE-EXT ( – f  ) environment “CORE-EXT”

完全なコア拡張ワード・セットが存在する場合は true。 Gforth では常に当てはまります。

FLOORED ( – f  ) environment “FLOORED”

true ならば、 / などで、 フロア除算(floored division)を実行します。

MAX-N ( – n  ) environment “MAX-N”

使用可能な符号付き整数の最大値。

MAX-U ( – u  ) environment “MAX-U”

使用可能な符号なし整数の最大値。

MAX-D ( – d  ) environment “MAX-D”

使用可能な符号付き2倍長整数の最大値。

MAX-UD ( – ud  ) environment “MAX-UD”

使用可能な符号なし2倍長整数の最大値。

return-stack-cells ( – n  ) environment “return-stack-cells”

リターン・スタックの最大サイズ(セル単位)。

stack-cells ( – n  ) environment “stack-cells”

データ・スタックの最大サイズ(セル単位)。

floating-stack ( – n  ) environment “floating-stack”

n はゼロ以外で、 Gforth が深さ n の別個の浮動小数点スタックを維持していることを示しています。

#locals ( – n  ) environment “number-locals”

定義内のローカル変数の最大数

wordlists ( – n  ) environment “wordlists”

検索順序スタック(the search order)で使用できるワード・リストの最大数

max-float ( – r  ) environment “max-float”

使用可能な浮動小数点数の最大値(Gforth では最大の有限数(finite number)として実装)

XCHAR-ENCODING ( – addr u  ) environment “XCHAR-ENCODING”

エンコーディングを表す印刷可能なASCII文字列を返し、 (あれば)、 優先されるMIME名、 または “ISO-LATIN-1” や “UTF-8” のような http://www.iana.org/assignments/character-sets の名前を使用します。 ただし、“ASCII” の場合は、 エイリアスの “ASCII” を優先します。

MAX-XCHAR ( – xchar  ) environment “MAX-XCHAR”

xchar の最大値。 これはエンコーディングによって異なります。

XCHAR-MAXMEM ( – u  ) environment “XCHAR-MAXMEM”

1 つの xchar によって消費される最大メモリーをアドレス単位で返します。

Forth-94 バージョンのワードセットの存在を確認するための環境問い合わせ(environemtal query)がいくつかあります。 当該文字列が存在する場合、 それらはすべて ( -- f ) のスタック効果を持ちます(つまり、 これらの問い合わせの environment? のスタック効果は ( c-addr u -- false / f true ) です)。

block block-ext double double-ext exception exception-ext facility facility-ext file file-ext floating floating-ext locals locals-ext memory-alloc memory-alloc-ext tools tools-ext search-order search-order-ext string string-ext

上記ワードセットの問い合わせは、 ほとんど使用および実装されなかったため、 Forth-2012 ではこれらのワードセットの Forth-2012 バリエーションを問い合わせする方法が導入されませんでした。 代わりに、 [defined] (see Interpreter Directives) を使用するというアイディアです。

Forth-200x (次の標準に取り組むグループ。 このグループが作成するドキュメントも Forth-200x と呼ばれます)は、 提案された拡張機能(extension proposals)の変更が完了すると(CfV 段階)、 提案された拡張機能に対する拡張機能問い合わせ(extension query)を定義します。 そのため、 これらの提案を採用するプログラムは、 提案された拡張機能が適切かどうかを確認できます。 システムにはそれらがあり、 おそらくリファレンス実装(存在する場合)をロードします。 environment? がそのような問い合わせを見つけた場合、 www.forth200x.org 上の対応する提案がシステムに実装されます(ただし、 environment? の場合と同様、 存在しないモノは何も分かりません)。 これらの問い合わせにはスタック効果 ( -- ) があります。 つまり、 問い合わせに対して environment? ではスタック効果 ( c-addr u -- false / true ) があり、 これはワードセット問い合わせよりも便利です。。 これらの提案の多くは Forth-2012 に組み込まれています。 拡張機能問い合わせも Forth システム実装者の間で特に人気があるわけではないため、 [define] を使用する方が良いアプローチである可能性があります。 とにもかくにも、 Gforth は以下の拡張機能問い合わせ(extension query)を実装します:

X:2value X:buffer X:deferred X:defined X:ekeys X:escaped-strings X:extension-query X:fp-stack X:ftrunc X:fvalue X:locals X:n-to-r X:number-prefixes X:parse-name X:required X:s-escape-quote X:s-to-f X:structures X:synonym X:text-substitution X:throw-iors X:traverse-wordlist X:xchar

さらに、 Gforth は以下の Gforth 固有の問い合わせを実装します:

gforth ( – c-addr u  ) gforth-environment “gforth”

Gforth のこのバージョン(バージョン > 0.3.0)のバージョン文字列を表す文字列。 さまざまなバージョンのバージョン文字列は、 辞書順(lexicographically)に並べることができることが保証されています。

os-class ( – c-addr u  ) gforth-environment “os-class”

ホスト・オペレーティング・システムを説明する文字列。

os-type ( – c-addr u  ) gforth-environment “os-type”

$host_os に等しい文字列

標準の問い合わせでは、 環境問い合わせ(environmental query)に使用されるヘッダー・スペース(header space)が、 定義に使用されるヘッダー・スペースとは異なることが要求されます。

通常、 Forth システムは、 環境問い合わせ(environmental query)「だけ」に使用されるワードリスト内に定義を作成することにより、 環境問い合わせをサポートします。 それが Gforth のやっていることです。 認知されている環境問い合わせのセットに定義を追加する標準的な方法はありませんが、 Gforth や、 ワードリスト・メカニズムを使用するその他のシステムでは、 環境問い合わせを受け入れるために使用されるワードリストは、 他のワードリストと同様に操作できます。

environment-wordlist ( – wid  ) gforth-0.2 “environment-wordlist”

wid は、 環境問い合わせ(environmental query)によって検索されるワードリストを識別します(SwiftForth および VFX に存在)。

environment ( ) gforth-0.6 “environment”

environment-wordlist のボキャブラリー (Win32Forth および VFX に存在)。

以下に、 環境問い合わせ(environmental query)の使用例をいくつか示します:

s" address-unit-bits" environment? 0=
[IF]
     cr .( environmental attribute address-units-bits unknown... ) cr
[ELSE]
     drop \ ensure balanced stack effect
[THEN]

\ 標準で throw を使うときにプログラムの冒頭でありそうなコード断片
\ 訳注: throw をサポートしていなければ abort" に置き換え
s" exception" environment? [IF]
   0= [IF]
      : throw abort" exception thrown" ;
   [THEN]
[ELSE] \ we don't know, so make sure
   : throw abort" exception thrown" ;
[THEN]

s" gforth" environment? [IF] .( Gforth version ) TYPE
                        [ELSE] .( Not Gforth..) [THEN]

\ a program using v*
s" gforth" environment? [IF]
  s" 0.5.0" compare 0< [IF] \ v* is a primitive since 0.5.0
   : v* ( f_addr1 nstride1 f_addr2 nstride2 ucount -- r )
     >r swap 2swap swap 0e r> 0 ?DO
       dup f@ over + 2swap dup f@ f* f+ over + 2swap
     LOOP
     2drop 2drop ; 
  [THEN]
[ELSE] \ 
  : v* ( f_addr1 nstride1 f_addr2 nstride2 ucount -- r )
  ...
[THEN]

以下は、 environment ワードリストに定義を追加する例です:

get-current environment-wordlist set-current
true constant block
true constant block-ext
set-current

以下のようにして、 environment ワードリストどのような定義があるかを確認できます:

environment-wordlist wordlist-words