本章將介紹如何組織成為根據(jù)特定條件執(zhí)行脓钾。語句的執(zhí)行不僅僅再是順序執(zhí)行地回,而且可以根據(jù)條件跳過內(nèi)容執(zhí)行
1 條件語句
Forth中一個簡單的條件語句舉例如下向拆。想象我們在創(chuàng)建一個撿雞蛋程序讯沈,棧中可以獲取當(dāng)前雞蛋個數(shù) 那么條件語句可以組織為
12 = IF FILL-CARTON THEN
這里的 =
檢查棧中數(shù)字是都等于12
=
從stack中獲取兩個數(shù)字载弄,然后進(jìn)行比較是否相等
IF
表示前面為真時的執(zhí)行語句入口FILL-CARTON
.
THEN
表示前面為假時的執(zhí)行語句入口
測試如下
: ?FULL 12 = IF ." It's full " THEN ; return-key
11 ?FULL return-key
輸出ok
12 ?FULL return-key
輸出It's full
IF...TEHN
必須是一個整體出現(xiàn)。
另一個例子
: ?TOO-HOT 220 > IF ." Danger -- reduce heat " THEN ;
測試如下
290 ?TOO-HOT return-key
輸出Danger--reduce heat ok
130 ?TOO-HOT return-key
輸出ok
常用的比較運算符如下
= < >
0= 0< 0>
還有一個word INVERT
并不進(jìn)行任何檢測
2 分支語句
在IF語句中可以使用ELSE提供其他假值語句
: ?DAY 32 < IF ." Looks good " ELSE ." no way " THEN ;
IF ELSE可以看做兩條并列鐵軌姐军,根據(jù)不同條件執(zhí)行
檢測除數(shù)是否為0的定義如下
: /CHECK
DUP 0= IF ." invalid " DROP
ELSE /
THEN ;
0= 會移除當(dāng)前棧頂數(shù)字铁材,因此需要DUP復(fù)制
如果等于0 無效數(shù)字 刪除數(shù)字0
如果不是0 然后調(diào)用/ 進(jìn)行除法
3 嵌套條件語句
在IF...THEN中還可以嵌套定義IF...THEN語句。事實上可以無限嵌套
舉例如下
: EGGSIZE
DUP 18 < IF ." reject " ELSE
DUP 21 < IF ." sm all " ELSE
DUP 24 < IF ." medium " ELSE
DUP 27 < IF ." large " ELSE
DUP 30 < IF ." extra large " ELSE
." error "
THEN THEN THEN THEN THEN THEN DROP ;
其中的THEN與IF個數(shù)對應(yīng)
DROP也是用來清除原始的值
這種換行組織的方式為了友好閱讀奕锌,
4 IF機制
那么這些比較運算符word(= < > )返回到真與假是如何與IF進(jìn)行交互的著觉。
答案是僅僅簡單的將TRUE或者FALSE存儲到stack。IF然后獲取stack頂部的值進(jìn)行判斷惊暴。
通常這種結(jié)果叫做flag饼丘。flag存儲到stack的機制測試如下
5 4 > . return-key (-1 ok)
5 4 < . return-key (0 ok)
那么INVET存儲的值
FALSE INVERT . return-key (-1 ok)
TRUE INVET . return-key (0 ok)
IF會將任何非0值看做TRUE,測試如下
: TEST IF ." non - " THEN . " zero " ;
0 TEST return-key (zero ok)
1 TEST return-key (non-zero ok)
-400 TEST return-key (non-zero ok)
其他的自定義比較運算符有/CHECK
或者 10 MOD 0=
或者 - 0=
比較相等
5 邏輯組織
在IF語句中也可以將多個flags組織為一個flag辽话。
DUP 0< SWAO 10 MOD 0= +
flags相加的結(jié)果如下
另外還可以使用word or
and
進(jìn)行flags組織
6 內(nèi)置IF words
word?DUP
對非0值進(jìn)行復(fù)制
因此
: /CHECK DUP IF / ELSE DROP THEN ;
簡化如下
: /CHECK ?DUP IF /THEN ;
word ABORT"
對于應(yīng)用運行過程中出現(xiàn)錯誤肄鸽,或許不想繼續(xù)運行下去卫病,也不想在stack返回任何值 可以是ABORT"
。 ABORT"
期待棧頂一個flag典徘。
如果flag是TRUE 蟀苛,那么會執(zhí)行后面語句,然后等待輸入內(nèi)容逮诲。
也會輸出最后一個解釋的word
例如
: /CHECK DUP 0= ABOT" zero denominator " / ;
測試
8 0 /CHECK
ERROR-2
zero denominator ?
常用的提示語有棧溢出報錯
?STACK ABORT" stack empty