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. 我的Python学习笔记(四):动态添加属性和方法

    一.动态语言与静态语言 1.1 动态语言 在运行时代码可以根据某些条件改变自身结构 可以在运行时引进新的函数.对象.甚至代码,可以删除已有的函数等其他结构上的变化 常见的动态语言:Object-C.C ...

  2. [Spark内核] 第37课:Task执行内幕与结果处理解密

    本课主题 Task执行内幕与结果处理解密 引言 这一章我们主要关心的是 Task 是怎样被计算的以及结果是怎么被处理的 了解 Task 是怎样被计算的以及结果是怎么被处理的 Task 执行原理流程图 ...

  3. Pyqt4的对话框 -- 预定义对话框

    QinputDialog提供了一种获取用户单值数据的简介形式. 它接受的数据有字符串.数字.列表中的一项数据 # QInputDialog 输入对话框 # 本示例包含一个按钮和一个行编辑部件.单击按钮 ...

  4. 【Tarjan缩点】POJ2186 Popular Cows

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 35644   Accepted: 14532 De ...

  5. CMDB运维开发项目

    ITIL:Information Technology Infrastructure Library 信息技术基础架构库,主要适用于IT服务管理(ITSM).ITIL为企业的IT服务管理实践提供了一个 ...

  6. Java分布式应用技术架构

    分布式架构的演进 系统架构演化历程-初始阶段架构初始阶段 的小型系统 应用程序.数据库.文件等所有的资源都在一台服务器上通俗称为LAMP特征:应用程序.数据库.文件等所有的资源都在一台服务器上.描述: ...

  7. 第一次写博客,就写如何向外行介绍自己做的是什么,那个我是做web的

    如果想外行问你是做什么的,改如何回答.和内行说java后台就可以了,但外行听不懂,我们该如何描述呢? 我的方法是:我做的是java web开发,不是内外的外,是个英文单词web,全名叫world wi ...

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

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

  9. Flask-SQLAlchemy.........>model创建表

    import datetime from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarat ...

  10. cobaltstrike安装加破解教程+使用教程

    1.先安装java环境= = 1. 下载1.8u121的JAVA JDK (新的java JDK不稳定)!!原因:https://blog.cobaltstrike.com/2017/04/26/ja ...