付録C この本で説明されているその他のユーティリティ

この付録は、本書に記載されているが、あなたのシステムに存在しない可能性があるいくつかのワードを定義するのに役立ちます。 定義はFORTH-83規格に準拠しています。

第4章より

FORTH-83規格で動作する ASCII の定義は次のとおりです。

: ASCII  ( -- c)  \  Compile:  c  ( -- )
\ Interpret:   c   ( -- c)
     BL WORD 1+ C@  STATE @
     IF [COMPILE] LITERAL  THEN ; IMMEDIATE

第5章より

\ というワードは次のように定義できます。

: \  ( skip rest of line)
     >IN @  64 / 1+  64 *  >IN ! ; IMMEDIATE

スクリーンを終了させるために EXIT を使わないことにした場合、 \S を次のように定義することができます。

: \S   1024 >IN ! ;

FH というワードは、単に次のように定義できます。

: FH   \   ( offset -- offset-block)   "from here"
    BLK @ + ;

このファクタリング(要素分解)では、 FH をいろいろな意味で使うことができます。例えば以下の通り。

: TEST   [ 1 FH ] LITERAL LOAD ;

または

: SEE   [ 2 FH ] LITERAL LIST ;

FH のもう少し複雑なバージョンでは、 (SCR) の直前のスクリーンに関連して、 14 FH LIST のようなフレーズでスクリーンを編集またはロードすることもできます。

: FH   \   ( offset -- offset-block)   "from here"
     BLK @  ?DUP 0= IF  SCR @  THEN  + ;

BL は単純な定数です。

32 CONSTANT BL

TRUEFALSE は次のように定義できます。

0 CONSTANT FALSE
-1 CONSTANT TRUE

( IFUNTIL のようなForthの制御ワードは、ゼロをfalse、ゼロ以外の値をtrueと解釈します。 FORTH-83以前では、値1がtrueを表すという慣例でした。 FORTH-83以降では、trueは16進数のFFFFで示されます。これは、符号付き数値-1(すべてのビットが設定されている)です。

WITHIN は次のように高レベルで定義することができます。

: WITHIN  ( n lo hi+1 -- ?)
     >R  1- OVER <  SWAP R>  < AND ;

または

: WITHIN ( n lo hi+1 -- ?)
   OVER -  >R - R> U< ;

第8章より

LEAP の実装はあなたのシステムが DO…LOOP をどのように実装しているかに依存します。 DO がリターンスタックに2つの項目(インデックスと制限)を保持している場合、 LEAP はそれら両方と1つのリターンスタック項目を削除する必要があります。

: LEAP   R> R> 2DROP  R> DROP ;

DO がリターンスタックに3項目を保持する場合、以下の通り定義しなければなりません。

: LEAP   R> R> 2DROP  R> R> 2DROP ;