条件短语
IF THEN | 满足条件就执行 IF 后面的语句 不满足就执行 THEN 后面的语句;不管 IF 成功不成功,THEN 后面的语句都会执行到。
IF 只能编译,只能用于定义中
// 定义 YIDA(n - result) 如果 n 等于12 就执行 IF 后面的语句 STAR, 否则就执行 THEN 后面的语句;
// 每个 IF 后面都要有 THEN 对应以便回复到原程序。
词 < 和 > 要求的栈顶顺序和算术运算符一直,即: 2 < 10 相当于 2 10 < ;17 > -39 相当于 17 -39 > ;
词 0= ,0< 和 0> 只要求栈顶上的一个值 ,把该值与 0 比较。
词 NOT ,把测试值的条件值求反; = NOT IF 表示栈顶两个值不相等时便执行 IF 后面的词;
选择短语
IF ELSE THEN
定义词, /CHECK ,从栈中弹出一个数查看是否 =0 ,如果相等就显示 INVALID 并且 运行 DROP 命令清除栈顶的数据;否则,就执行 / 操作。
嵌套的 IF …… THEN 语句
** 每个 IF 必须保证有一个 THEN 语句对应
//最后的 ; 应该加一个 DROP 来清除栈中的原始值
FORTH 中的比较运算符最后会在栈顶放一个 “1”或 “0” ,1 表示真,0 表示假。
我这里显示 “-1” 表示真 , “0” 表示假;因为 IF 把任何非零值表示为真,“0”作为假
NOT 把一个数的逐位二进制反码 : 0 NOT . -1 | 1 NOT . -2 | -2 NOT . 1
逻辑操作词
OR 或操作,对栈中前两个数进行或操作, 1 OR -1 = -1
ANT 与操作,对栈中前两个数进行与操作
两个本身包含 IF 的词
?DUP 表示当栈顶项为非零值时才复制栈顶元素。
: /CHECK ?DUP IF / ELSE DROP THEN ; : /CHECK ?DUP IF / THEN ;
ABOUT" :如果程序在运行中可能某处会出错,则可在该处使用词 ABOUT" 。这个词把栈顶值作为标志,若标志为真则使执行异常终止并清除堆栈,返回到终端等待输入信息。同时也可以打印出最后被解释的名词,以及我们想附加的任何信息。
: /CHECK DUP 0= ABORT" ZERO DENOMINATOR" / ;
4 0 的时候堆栈中的数据都会被清除
改进:
: ENVELOPE /CHECK ." THE ANSWER IS" . ;
当分母为 0 的时候,程序中止;后面的输出 THE ANSWER IS 就不会执行到,打印到的也是 ENVELOPE的名字;
验证堆栈是否下溢,?STACK eg: : ?STACK ABORT" STACK EMPTY" ;