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 是系统词典,表示换行;后面跟的是刚才定义的命令
: STARS 0 DO STAR LOOP ; return  定义单词STARS,表示做循环次STAR,次数会在命令开头给出
5 STARS return 执行5次STAR操作
: 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的每个词和它的定义都被登记在FORTH词典中。FORTH把自己定义翻译成词典形式写入词典条目。这个过程叫做  "编译"  终端键入命令词,会启动  INTERPRET  的词,叫做   “文本解释程序";
FORTH 程序中 : 也是一个词;


命名:

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



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


后缀表示法:

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

记住堆栈的踪迹:
"栈效应"踪迹就是指一个词在执行前栈中需要什么类型的数字,而执行后它又将是什么类型的数字反压回堆栈。
把自己定义的词连同它们的意义逐步汇集成表,那么其他人和自己以后都能容易的理解这些词的操作。  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

FORTH基础的更多相关文章

  1. java基础集合经典训练题

    第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...

  2. node-webkit 环境搭建与基础demo

    首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...

  3. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  4. Golang, 以17个简短代码片段,切底弄懂 channel 基础

    (原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...

  5. [C#] C# 基础回顾 - 匿名方法

    C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...

  6. HTTPS 互联网世界的安全基础

    近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是 ...

  7. Swift与C#的基础语法比较

    背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...

  8. .NetCore MVC中的路由(1)路由配置基础

    .NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...

  9. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  10. .NET 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]

    方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...

随机推荐

  1. Class StatusesTableSeeder does not exist 如何解决

    Class StatusesTableSeeder does not exist错误如何解决 Laravel 5.* 执行seeder命令出现错误的解决方法     最近在使用Laravel开发一个项 ...

  2. 深入理解ES6之—块级绑定

    var声明与变量提升 使用var关键字声明的变量,无论其实际声明位置在何处,都会被视为声明于所在函数的顶部(如果声明不在任意函数内,则视为在全局作用域的顶部).这就是所谓的变量提升. 块级声明 块级声 ...

  3. 【转载】linux挂载mount参数优化

    一. 1) 蓝色:表示经过优化的xfs mount时的参数defaults,noatime,nodiratime,nobarrier,discard,allocsize=256m,logbufs=8, ...

  4. jsp+servlet登录框架模板

    一.建立一个名叫jsp_servlet的工程 二.建立一个AcountBean类和CheckAccount类 1.AcountBean类包含登录名(username)和登录密码(password) p ...

  5. 数据挖掘之聚类算法Apriori总结

    项目中有时候需要用到对数据进行关联分析,比如分析一个小商店中顾客购买习惯. package com.data.algorithm; import com.google.common.base.Spli ...

  6. Machine Learning - week 4 - 习题

    1. 第一个.,是对的. 第二个.结果只会认出是一类,如图:.但这里是为了举例子,实际上不会恰好是 1.而是选择最大概率表示的类别.所以是错误的. 第三个:所有基于 0,1 的逻辑方程都可以使用神经网 ...

  7. python实现求最长子串长度

    给定一个字符串,求它最长的回文子串长度,例如输入字符串'35534321',它的最长回文子串是'3553',所以返回4. 最容易想到的办法是枚举出所有的子串,然后一一判断是否为回文串,返回最长的回文子 ...

  8. Java集合源码分析(四)HashMap

    一.HashMap简介 1.1.HashMap概述 HashMap是基于哈希表的Map接口实现的,它存储的是内容是键值对<key,value>映射.此类不保证映射的顺序,假定哈希函数将元素 ...

  9. [51nod1310]Chandrima and XOR

    有这样一个小到大排列的无穷序列S:1, 2, 4, 5, 8......,其中任何一个数转为2进制不包括2个连续的1.给出一个长度为N的正整数数组A,A1, A2......An记录的是下标(下标从1 ...

  10. HDU--1060

    Leftmost Digit Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...