石原 博の覚書

電子工作に関する日々の覚書を記載します

Forthの制御構造(IF ELSE THENの場合)

2021-05-02 20:44:40 | 日記
IF THEN の例
: TEST 1 0 > IF TRUE . THEN ;

SEE TEST
: TEST 1 0 > ?BRANCH 6 TRUE . ;

BEGIN AGAINと違い、前方への分岐になる

VIEWで確認すると

12 : IF COMPILE ?BRANCH ?>MARK ; IMMEDIATE
2 : THEN ?>RESOLVE ; IMMEDIATE

BEGINは後方参照なので <MARK, <RESOLVEだったが、今回は前方参照なので >MARK, >RESOLVE になる。

8 : ?>MARK (S -- f addr ) TRUE >MARK ;
9 : ?>RESOLVE (S f addr -- ) SWAP ?CONDITION >RESOLVE ;
3 : >MARK (S -- addr ) HERE 0 , ;
4 : >RESOLVE (S addr -- ) HERE SWAP ! ;

>MARKは、現在のアドレスをスタックに積み、ダミーのアドレス0を書き込んでおく
>RESOLVEは、現在のアドレスを、積んでいたアドレスの場所に書き込む


IF ELSE THEN の例
: TEST 0= IF ." ZERO" ELSE ." NOT ZERO" THEN ;

SEE TEST
: TEST 0= ?BRANCH 13 (.") ZERO BRANCH 13 (.") NOT ZERO ;

VIEWで確認すると

13 : ELSE COMPILE BRANCH ?>MARK 2SWAP ?>RESOLVE ; IMMEDIATE



最新の画像もっと見る

コメントを投稿