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;}

FORTH 程序员利用堆栈来保存数据,对于要保存的临时数据可以用返回栈来暂存。但是如果要长时间的保存某些数就要用变量和常数。

变量
VARIABLE  使用形式  VARIABLE  名称   执行VARIABLE时,它生成<名称>的定义并在它的参数域分配两个字节。应用程序负责对生成变量的内容初始化。当以后执行<名称>时,参数域地址留在堆栈。
VARIABLE   DATE      定义一个名为DATE的变量
12   DATE  !   12压入堆栈,然后给出变量名 !表示存储赋值;就是把12 存入变量DATE
DATE   @   @表示取出数据,这个短语表示取出DATE的值压入堆栈
:   ?    @   .   ;      定义一个词,每次直接取出数据

//这里一旦把12存入DATE中就会一直在DATE里面,如果要改变就要重新赋值。13  DATE  !  

我们可以用这个方法存年月日,然后再定义一个词组合这个年月日。
FORTH 系统中有已经被定义的变量 BASE 
所以系统中的HEX  DECIMAL  OCTAL的定义都是
: DECIMAL   10 BASE  !  ;   
: HEX   16 BASE  !  ;   
: OCTAL   8  BASE  !  ;   

变量详解
定义变量时,已经把一个称为DATE的新词编译进了词典,该词典条目的简化结构
①12 进栈;
②文本解释程序在词典中查找DATE,若找到,则把它指向 EXECUTE ;
③EXECUTE 把该变量的“空”单元(将存放实际值的单元)地址复制到栈顶;
④词!从栈顶取出该地址,从下一项取出数值存入相应的内存单元。在该单元中无论什么值都将被新的数值锁代替;
词 @ 只要一个自变量的地址,它拿到自变量的地址,取出里面的值压入栈顶。
!     ( n  addr  ---    ) 将16位的n存入地址。称为“存储”。
@  ( addr  ---  n    ) 留下addr中的16位数据内容。称为“读取(fetch)”
!@ ( n  addr ---     )  将n加到地址为addr中的数值上。称为"加-存储"



利用变量作为计数器
eg: 鸡蛋计数
//这里设置EGGS变量,EGG每次对值+1;可以计数,看出EGG执行了多少次;

常数
常数用来表示无须再变更的值,定义的时候就必须给他赋值,之后就不会再次改变它的值。和变量的区别是使用定义得到的不是它的存放数据的地址,而是它的值。
eg: 220   CONSTANT   LIMIT    //定义一个名叫LIMIT的常数,并且赋值为220。使用LIMIT得到220。
用途之一:给硬件地址命名。

双字长变量和常数
2VARIABLE       定义一个双字长度的变量
2CONSTANT    定义一个双字长常数
eg:定义一个词把 400000 和栈顶的双字长数相加。
*/   ( n1  n2  n3  ---  n4 )         n1 与 n2相乘产生32带符号的中间结果,在被n3除,得到下整商n4。如果除数为零或者商大于16位就存在错误。
可以用一个2CONSTANT 定义的词存储两个单字长度的数对。这样既方便又能节省词典空间。

数组
定义一个变量可以用 ALLOT 分配多个空间(默认是一个)
VARIABLE   DATE   
//ERASE 用来给变量数组各个元素置0,前面要给一个参数,表示要置0的范围。

FILL  ( addr  字节数  b  ---  )   从addr地址开始把字节数个b填入存储区;  LIMITS 8 0 FILL     ( 这里我把b写成其他的就显示不正常了 )
DUMP  ( addr  len  ---   )  以十六进制和ASCII码显示存储地址addr到addr+len中的内容

字节数组
FORTH能够让元素只存储在一个字节而不是一个单元两个字节。用8位二进制数表示的数据好处是能以一半的存贮空间取得同样多的数据。
C!  相对于 ! 把n的最低有效8位数据存入地址addr中。
C@ 相对于 @  在堆栈中留下存储地址addr中的8位数据内容,堆栈中的高8位为0。
(这里我没有往第五个空间里存放数值)

数组初始化
定义变量数组的时候可以直接给它们赋值;
CREATE  VAR  1 , 2 , 3 , 4  ,      //定义一个变量,这个变量存放的数据为1,2,3,4;后面可以用上面的定义给它修改
 
CREATE (——)  定义词汇使用形式,CREATE  名称   生成<名称>的词典项目。在<名称>生成之后,下一个可利用的词典单元就是<名称>的参数域中的第一个字节,随后执行<名称>时,<名称>的参数域中的第一个字节的地址被留在堆栈中,CREATE并不给<名称>的参数域分配空间。
,      将16位的n存入词典指针的当前位置,然后指针前移两个字节。(把一个单子长数值存入词典中下一个可利用单元)   //词的功能是从栈中取出一个数并把它存入数组,所以每写一个数并跟随一个 , 时,就给该数组增加一个单元。
C,  与上面的,对应,是用来初始化一个字节的数组
LEAVE ( —— )   执行转移至下一个LOOP或+LOOP外的代码。循环被终止而循环参数被舍弃;
DO  ...  LEAVE  ...  LOOP  或者 DO  ...  LEAVE  ...  +LOOP 

PC/FORTH 变量|常数|数组的更多相关文章

  1. php变量与数组相互转换的方法(extract与compact

    #php变量与数组相互转换的方法(extract与compact) #compact 多个变量转数组 $name = 'sui'; $email = 'sui@qq.com'; $arr = comp ...

  2. 如何判断一个变量是数组Array类型

    在很多时候,我们都需要对一个变量进行数组类型的判断.JavaScript中如何判断一个变量是数组Array类型呢?我最近研究了一下,并分享给大家,希望能对大家有所帮助. JavaScript中检测对象 ...

  3. java 数组变量与数组对象

    数组是否必须初始化 对于这个问题,关键在于要弄清楚数组变量和数组对象的差别.数组变量是存放在栈内存中的,数组对象是存放在堆内存中的.数组变量只是一个引用变量,他能够指向实际的数组对象. 所谓的数组初始 ...

  4. JavaScript用typeof判断变量是数组还是对象,都返回object

    在JavaScript中所有数据类型严格意义上都是对象,但实际使用中我们还是有类型之分,如果要判断一个变量是数组还是对象使用typeof搞不定,因为它全都返回object. 使用typeof加leng ...

  5. C++ 用变量定义数组

    较早的编译器是不同意这样做的,所以一些书籍比方以Tc解说的书本都说数组的下标不能是变量.在vc6.0下亦是如此. 只是在一些较新的编译器如dev c++已经支持了,例如以下代码不会报错 #includ ...

  6. js判断一个变量是数组还是对象

    判断变量是数组还是对象,使用Object.prototype.toString.call(),兼容性好,切勿使用typeof来判断对象或者数组,因为typeof得到的都是object: functio ...

  7. C++中变量做数组长度

    在Java中,这是完全可以的,比如我们运行如下程序: package cn.darrenchan.storm; import java.util.Arrays; public class Test { ...

  8. Perl 引用:引用就是指针,Perl 引用是一个标量类型可以指向变量、数组、哈希表(也叫关联数组)甚至子程序。

    Perl 引用引用就是指针,Perl 引用是一个标量类型可以指向变量.数组.哈希表(也叫关联数组)甚至子程序,可以应用在程序的任何地方. 1.创建引用1.使用斜线\定义变量的时候,在变量名前面加个\, ...

  9. Perl 变量:标量变量、数组变量、哈希变量和变量上下文

    一.Perl 变量变量是存储在内存中的数据,创建一个变量即会在内存上开辟一个空间.解释器会根据变量的类型来决定其在内存中的存储空间,因此你可以为变量分配不同的数据类型,如整型.浮点型.字符串等.上一章 ...

随机推荐

  1. php 实现简拼

    <blockquote>model::::::::::::::::::::::::::::: function getFirstCharter($str){if(empty($str)){ ...

  2. CentOS 7 源码搭建LNMP环境

    搭建 LNMP 环境 源码包版本 :  CentOS Linux  7 nginx-1.15.1.tar.gz  mysql-boost-5.7.21.tar.gz  php-7.2.7.tar.gz ...

  3. eclipse添加mybatis插件

    1,在 eclipse中选择 Help->eclipse marketplace 2, 搜索安装

  4. Spring Cloud配置中心(Config)

    Spring Cloud配置中心(Config) Spring Cloud是现在流行的分布式服务框架,它提供了很多有用的组件.比如:配置中心.Eureka服务发现. 消息总线.熔断机制等. 配置中心在 ...

  5. [openjudge-搜索]城堡问题(The Castle)

    题目描述 描述 图1是一个城堡的地形图.请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大.城堡被分割成mn(m≤50,n≤50)个方块,每个方块可以有0~4面墙. 输入 程序从标准输入设备 ...

  6. 记账本微信小程序开发七

    完成所有后续代码 主页代码 教程做的感觉很好,但是自己做出来感觉就low了很多,还是有很多需要改进的地方,这也是我下一步的改进点.

  7. springmvc+hibernate在实体类中设置外键

    1.表User id主键,username,password,dept... 表Attendence id主键,uid外键,time... @ManyToOne @JoinColumn(name = ...

  8. UI自动化(十一)selenium框架

    框架(提供一个好的解决方案给其他人用) webUi自动化框架 弊端:代码维护难,定位问题复杂,稳定性 PageObject分层:将一个页面抽象成一个类,将这个页面下的可操作性的功能点,当做这个类下的函 ...

  9. JS(JavaScript)的初了解4(更新中···)

    1.JS的本质就是处理数据.数据来自于后台的数据库. 所以变量就起到一个临时存储数据的作用. ECMAScript制定了JS的数据类型. 数据类型有哪些? 字符串   String 数字    Num ...

  10. RPM 包的构建 - SPEC 基础知识

    spec 文件 制作 rpm 软件包并不是一件复杂的工作,其中的关键在于编写软件包的 spec 描述文件. 要想制作一个 rpm 软件包就必须写一个软件包描述文件 spec.这个文件中包含了软件包的诸 ...