body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;} th{border: 1px solid gray; padding: 4px; background-color: #DDD;} td{border: 1px solid gray; padding: 4px;} tr:nth-child(2n){background-color: #f8f8f8;}

 每次运行DOSBox 0.74   都要执行一遍  Z:\>mount k d:\forth   , 然后
        Z:\>K:(回车)
        K:\>cd pcforth(回车)
        K:\PCFORTH>forth(回车)
//笔记里面的return都表示输入命令时候的换行
// '词 '和 '数' 必须要用空格隔开,这样FORTH才能识别,空格可以多个,但是必须有
15 SPACES return  打印15个空格
42 EMIT return  打印*,43是+;44,;45 -;
15 SPACES 42 EMIT 42 EMIT return  组合命令,先打印15空格,然后再连续打印两个*
: STAR 42 EMIT ; return 自己定义词组; : 表示定义,后面跟的是一个自己要定义的词组的名称;再后面的就是这个词组要实现的功能;eg: STAR 命令实现输出一个*号
CR STAR CR STAR CR STAR return CR 是系统词典,表示换行;后面跟的是刚才定义的命令
FORTH基础-LMLPHP
: STARS 0 DO STAR LOOP ; return  定义单词STARS,表示做循环次STAR,次数会在命令开头给出
5 STARS return 执行5次STAR操作
FORTH基础-LMLPHP
: MARGIN CR 30 SPACES ; return  定义,换行输出30个空格
: BLIP MARGIN STAR ; return  定义,换行输出30个空格和一个* 
: BAR MARGIN 5 STARS ; return 定义,换行输出30个空格和5个* 
BAR BLIP BAR BLIP BLIP CR return 输出个F形状
: F BAR BLIP BAR BLIP BLIP CR ; return 定义,输出F
FORTH基础-LMLPHP


词典:FORTH的每个词和它的定义都被登记在FORTH词典中。FORTH把自己定义翻译成词典形式写入词典条目。这个过程叫做  "编译"  终端键入命令词,会启动  INTERPRET  的词,叫做   “文本解释程序";
FORTH基础-LMLPHP
FORTH 程序中 : 也是一个词;
FORTH基础-LMLPHP


命名:

少数不能用来命名的词:
return:回车符,表示完成输入;
backspace:删除符,表示要修改;
space:空格,作为一个词的结束;注意: n SPACE 用完会在栈中插入好多1,所以不要用SPACE,要就使用 SPACES 用完还会把事先压入栈中要求显示的空格数弹出来
."  :表示后面跟的是一个字符串;
eg:  : GREET  ."  HELLO , I SPEAK FORTH "  ;   //这个标记要组合出现,不能空格隔开
FORTH基础-LMLPHP



堆栈:FORTH 运算符的操作场所

FORTH基础-LMLPHP
FORTH基础-LMLPHP

后缀表示法:

FORTH 语言采用的是后缀表示法,不是中缀表示法;目的是便于使所有需要数字的词能从堆栈中取得他们。
eg:    +              从栈中弹出两个数字并把他们相加;
          .               从栈中弹出一个数字并打印它尾随一个空格;
          SPACES   从栈中弹出一个数字并打印相应个数的空格;
          EMIT        从栈中弹出一个表示字符的数字并打印该字符;
 
定义一个总是把4和堆栈中的任意数相加的词 : FOUR-MORE 4 + ; return
3 FOUR-MORE . return 
-10 FOUR-MORE . return
FORTH基础-LMLPHP
在这种情况下,定义内部的“4”就仿佛它在定义外边一样被压栈。然后 + 将栈中的两个数字相加。 因为 + 总是对栈中的数字进行操作,所以它并不关心 “4” 是来自定义内部的 3 还是来自定义外部的。

记住堆栈的踪迹:
FORTH基础-LMLPHP
"栈效应"踪迹就是指一个词在执行前栈中需要什么类型的数字,而执行后它又将是什么类型的数字反压回堆栈。
把自己定义的词连同它们的意义逐步汇集成表,那么其他人和自己以后都能容易的理解这些词的操作。  FORTH 中这种表称为"词汇表";  大家习惯在词汇表中使用特定的 栈标志法
(执行前-执行后) : 破折号是分隔符,前面的内容表示执行前当处于栈顶的内容,后面是执行后压入栈顶的内容。
eg:   .    (n--)                     n表示一个数,表示执行前栈中要有一个数,执行后没有数据要存入堆栈。
        + (n1 n2 - sum)   表示 + 执行前栈中要有两个数,执行完后还有一个数压入栈中。

一些术语:
编译(compile):由源文本生成计算机内存中的词典条目。
词典(Dictionary): 在FORTH中,包括"系统"定义(预定义)和"用户"定义(自己定义)的各种词的一个表。词典以编译形式固存在计算机内存。
执行(Execute):运行。所谓执行一个词就是完成该词已编译定义所指定的所有操作。
扩展性(Extensibity):允许程序设计员加进新的特性,或者对已具有特性的计算机语言的特点进行修改。
词汇表(Glossary):FORTH中已定义过的词的表,标明它们的栈功能和功能解释,以供程序设计员参考。
输入流(Input stream):由文本解释程序读入文本。它可以是你在终端刚刚键入的文本,也可以是存贮在磁盘上的文本。
解释(Interpret):(当相当于FORTH的文本解释程序时)读输入流,然后到词典中查对没一个词,若失败,则转换成数字。
后缀表示法(Postfix notation):把操作符书写在他们的操作数字后边的表示方法,如“2+5”写成 “2 5 +”。也叫做 逆波兰表示法(Reverse Polish Notation)。
堆栈(Stack):在FORTH中,数据按后进先出方式能被存贮或移走的内存区域。
堆栈上溢(Stack overflow):当作为堆栈的内存区域完全被数据充满时所发生的错误。
堆栈下溢(Stack underflow):当操作符要求堆栈中数据但栈中已无合适的数据时所发生的错误。
(Word):在FORTH中一个定义的名字。

以后的笔记中不再在要输入回车符的地方打 return
04-13 17:54