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. Qt 拷贝内容到粘贴板 || 获取粘贴板内容

    QString source = ui->textEdit_code->toPlainText(); QClipboard *clipboard = QApplication::clipb ...

  2. 蓝桥杯近三年初赛题之二(16年b组)

    1. 煤球数目 有一堆煤球,堆成三角棱锥形.具体:第一层放1个,第二层3个(排列成三角形),第三层6个(排列成三角形),第四层10个(排列成三角形),....如果一共有100层,共有多少个煤球? 请填 ...

  3. java.lang.ClassNotFoundException: com.sun.xml.ws.spi.ProviderImpl解决办法

    问题现象: 这种很可能出现在独立一个简单示例项目中可以用,但是在把webService模块加入系统后,报出这类错误. Exception in thread "main" java ...

  4. 通用订单搜索的API设计得失录

    先把 Joshua Bloch 大神的 API PDF 放在这里膜拜下:"How to Design a Good API and Why it Matters.pdf" 总述 在 ...

  5. 时间序列预测——Tensorflow.Keras.LSTM

    1.测试数据下载 https://datamarket.com/data/set/22w6/portland-oregon-average-monthly-bus-ridership-100-janu ...

  6. 自动生成简单四则运算的C语言程序

    该程序是在博客园里面找的,具体是谁的找了半天没找到,无法提供它原本的链接.由于自己写的过于简单,且有一些功能暂时无法实现,所以就找了一个来应付作业,望原谅.在这个程序的源码中我改了一个错误的地方,源码 ...

  7. JS用斜率判断鼠标进入DIV四个方向的方法 判断鼠标移入方向

    本文要介绍的是一种鼠标从一个元素移入移出时,获取鼠标移动方向的思路.这个方法可以帮助你判断鼠标在移入移出时,是从上下左右的哪个方向发生的.这个思路,是我自己琢磨出来,利用了一点曾经高中学过的数学知识, ...

  8. 文件上传中UUID的解读

    UUID简介如下:1.简介UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software F ...

  9. Eclipse中XML文件自定义格式化配置

    1,编码格式:UTF-8 2,Line Width:90,Indent using spaces:2 3,默认编辑器 当添加Spket插件后,xml文件默认编辑器将被修改为Spket,要求恢复默认,则 ...

  10. Python3 tkinter基础 OptionMenu 点击按钮,出现单选的下拉列表

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...