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. Eureka服务注册与发现

    一.服务注册 注册Eureka的服务非常的简单,只需要引入spring-cloud-starter-netflix-eureka-client的jar包即可. <dependency> & ...

  2. Maven pom.xml详解(转)

    pom文件总体结构 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...

  3. vue不通过路由直接获取url中参数的方法示例

    vue不通过路由直接获取url中参数的方法示例 vuejs取得URL中参数的值地址:http://localhost:3333/#/index?id=128console.log(this.$rout ...

  4. Python+OpenCV图像处理(十六)—— 轮廓发现

    简介:轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果. 代码如下: import cv2 as cv import numpy as np def c ...

  5. 1005 继续(3n+1)猜想 (25 分)

    1005 继续(3n+1)猜想 (25 分)   卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推 ...

  6. vue.js中的computed和watch的区别

    1.computed在调用时不需要加(),watch是不需要调用的2.computed如果属性没有发生改变时会从缓存中读取值,watch当属性发生改变时会接收到2个值:一个为新值,一个为旧值3.com ...

  7. Gpload安装手册(Linux版本)

    Gpload安装手册(Linux版本) 一.python 2.7版本 Linux系统默认是安装python2.7的,如果没有需要手动安装(python版本要求2.4.4以上): 通过命令:python ...

  8. 使用Angular2的Http发送AJAX请求

    使用Angular2的Http发送AJAX请求 Angular的文档并不详细,甚至API文档也有一些错误.经过查阅资料并经大量实验,终于明确了Angular的Http发送Ajax请求的方式方法.本文描 ...

  9. [c/c++] programming之路(12)、循环结构

    一.求2n #include<stdio.h> void main(){ ; ; while(n--){ s*=; printf("%d,%d\n",s,n); } g ...

  10. websocket是如何进行建立连接与通信的?(简单理解)

    握手过程: websocket-client端通过ws协议向websocket-server端发起连接请求前,首先在自己的请求头中添加Sec-Websocket-Key键值对,值为根据自己账号通过一定 ...