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. Elasticsearch强制重置未分配的分片(unassigned)

    强制重置未分片的分片,这个问题源自于Elasticsearch维护中,Node意外退出的场景. 意外退出后Elasticsearch由于网络原因或者jvm性能压力,未能短时间内分配分片. 看一下分片的 ...

  2. Python 的编码格式

    [前言] Python的编码格式对于初学者来说是很头疼的一件事,不过如果接触的多了,就会发现,只要在恰当的时候使用了恰好的编码,就不会出现太多的问题. [编码介绍] python 的编码格式2.x 和 ...

  3. 对《cookie之困》的一些总结与思考

    0x00 前言 早些时候在gayhub翻安全大会的paper,翻到了kcon的一些paper. https://github.com/knownsec/KCon 从前辈们的paper中学到了不少,也产 ...

  4. Java学习笔记23(Calendar类)

    Calendar意味日历,对Date类中的很多方法做了改进 Calendar类是一个抽象类,不可以见对象,需要子类完成实现 不过这个类有特殊之处,不需要创建子类对象,而是使用它的静态方法直接获取: 示 ...

  5. python3之正则表达式

    1.正则表达式基础 正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不然str自带方法,但功能十分强大. 正则表达式的大致匹配流程:依次拿出表达式和文本中的字 ...

  6. 前端工程化webpack(一)

    webpack 的基本用法   1.app.js 引入模块 import moduleLog from './module.js' //引入moduleLog从./module.js 2.module ...

  7. 前端学习:html基础学习四

    7.HTML表格(主要内容<table><caption><tr><th><td>标记) <table>标记 基本格式 < ...

  8. Friday for Oldboy

    计算机的硬件介绍 1.  CPU的工作流程:取指令->解码->执行 .  程序状态字寄存器(Program Status Word,PSW)中有一个二进制位控制这两种模式. 内核态:当cp ...

  9. CSS文本超出2行就隐藏并且显示省略号

    今天做东西,遇到了这个问题,百度后总结得到了这个结果. 首先,要知道css的三条属性. overflow:hidden; //超出的文本隐藏 text-overflow:ellipsis; //溢出用 ...

  10. position:absolute 的深入探讨

    position:absolute 参考谁进行定位的问题.之前大家可能会认为如果absolute元素的父级(祖父)元素没有设置position属性的时候,该元素的position:absolute会参 ...