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
: 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
※コメント投稿者のブログIDはブログ作成者のみに通知されます