付録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
TRUE
と FALSE
は次のように定義できます。
0 CONSTANT FALSE
-1 CONSTANT TRUE
( IF
や UNTIL
のような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 ;