body, table{font-family: 微软雅黑; font-size: 13.5pt}
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;}

   代码指针域中包含有一个程序段的地址,每当一个定义被引用时该程序段就首先被执行。因此,又称该程序段为运行时间代码,不同类型的定义具有不同的运行时间代码。运行时间代码决定了一个词的类别,决定了该词的特性及如何对待和处理放在该词参数域中的数据。
   三种不同类型的定义,常数、变量和冒号定义。CONSTANT、VARIABLE 和 冒号定义 可以给词典增加新词,所以又把它们称为 定义词。   
  如果由代码指针域所指着的运行时间代码是由汇编代码来定义的,则定义一个新的定义词的格式是:
: 新定义词名 CREATE ... ;CODE 汇编代码
其中汇编代码是由汇编助记符编写的程序段。
  如果运行时间代码是由冒号定义规定的话:
: 新定义词名 CREATE ... DOES> ... ;
CREATE 使用输入流中下一个字符串作为名字在词典中建立一个入口,CREATE 后面的内容规定词典中如何编译一个新的定义,DOES> 后面的内容规定新定义的运行时间代码。
// 定义一个 双字长常数
: DCONSTANT   CREATE , , DOES> DUP 2 + @ SWAP @ ;
123.456 DCONSTANT CON1
CON1 D.    


运行时间行为:
      任何由 CREATE 所创立的词的“缺省”的运行时间代码行为是返回其词身的地址。而词身在词典中的大小,格式及最初的内容则是由定义词在编译阶段的行为决定的,也就是定义词中跟随在 CREATE 之后的词决定。
      CREATE  名称   生成<名称>的词典项目。在<名称>生成之后,下一个可利用的词典单元就是<名称>的参数域中的第一个字节,随后执行<名称>时,<名称>的参数域中的第一个字节的地址被留在堆栈中,CREATE并不给<名称>的参数域分配空间。
      CREATE  定义的词的代码指针CFA就是CREATE的运行时间代码,当定义的词被执行时,把潜在的参数域(PFA)地址压栈。
      DOES>  运行时间:标志它的编译部分的结束和运行时间的开始。运行时间的操作由高级形式 FORTH 编写。在运行时间,被定义的词的参数域地址压栈。

延迟词:
    当一个冒号定义被引用时,组成该冒号定义的各个词就被顺序执行。即词典中一个冒号定义的功能是固定不变的。
   定义这样的词,定义它的时候勿需确定它的功能;这种在编译时不规定功能,其功能延迟到以后再规定的词叫做延迟词。FORTH 中用 DEFER 来定义。
: DEFER  ( - )          (建立一个延迟词)  
              CREATE       (建立延迟词首部)
              2 ALLOT      (参数域为一个单元)
              DOES> @ EXECUTE ;      (运行时间代码)
当定义词 DEFER 运行时,在词典中建立一个词身位一个单元的延迟词,并规定延迟词的运行时间代码;当延迟词执行时,把其 pfa 单元内的地址交给 EXECUTE 执行。
: WARNING  ." Uninitialized" ;
: DEFER  CREATE ['] WARNING , DOES> @ EXECUTE ;
// 这样定义防止DEFER定义词未赋值么有执行代码无法继续执行下去
为了简化规定延迟词的功能的工作(即把某一个定义的编译地址填入延迟词的 pfa 单元)所用到的定义是 IS :
:  IS  ( cfa - )   '  >BODY  !  ;  把跟着的词的 pfa 单元置为参数栈顶的地址。
上面的操作可以这样写
//为了能在冒号定义内部也能使用 IS ,把 IS 的定义改进如下:
STATE  ( - addr)  具有编译状态的变量。STATE 之值非 0 ,表明系统处于编译状态;为零,则表明系统处于解释(执行)状态。  
:  (IS)   ( cfa -  )   ( IS的执行时间行为)   R@  @  >BODY  !  (得到目标地址) R>  2+  >R  ;  ( 调整 IP )
:   IS   ( cfa -  )             把跟着的词身(pfa)置为参数栈顶的数值。若在冒号定义内使用,则IS作用于在冒号定义中跟着它的词。
      STATE  @       
      IF  COMPILE  (IS)   系统处于编译状态则做此工作。
      ELSE '  >BODY  !      系统处于解释状态做此工作。
      THEN 
      ;   IMMEDIATE   由于 IS 在冒号定义内部也要能使用,所以它必须是立即词。

Forth 采用Create,Does>定义新的词(word)& 延迟词技术的更多相关文章

  1. CREATE RULE - 定义一个新的重写规则

    SYNOPSIS CREATE [ OR REPLACE ] RULE name AS ON event TO table [ WHERE condition ] DO [ INSTEAD ] { N ...

  2. CREATE OPERATOR - 定义一个新的操作符

    SYNOPSIS CREATE OPERATOR name ( PROCEDURE = funcname [, LEFTARG = lefttype ] [, RIGHTARG = righttype ...

  3. CREATE FUNCTION - 定义一个新函数

    SYNOPSIS CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] ) RETURNS rettype { LANGUAGE lang ...

  4. CREATE AGGREGATE - 定义一个新的聚集函数

    SYNOPSIS CREATE AGGREGATE name ( BASETYPE = input_data_type, SFUNC = sfunc, STYPE = state_data_type ...

  5. CREATE VIEW - 定义一个视图

    SYNOPSIS CREATE [ OR REPLACE ] VIEW name [ ( column_name [, ...] ) ] AS query DESCRIPTION 描述 CREATE ...

  6. CREATE CONVERSION - 定义一个用户定义的码制转换

    SYNOPSIS CREATE [DEFAULT] CONVERSION name FOR source_encoding TO dest_encoding FROM funcname DESCRIP ...

  7. CREATE CAST - 定义一个用户定义的转换

    SYNOPSIS CREATE CAST (sourcetype AS targettype) WITH FUNCTION funcname (argtype) [ AS ASSIGNMENT | A ...

  8. php大力力 [023节]CREATE TABLE创建新表sql写字段备注(2015-08-27)

    2015-08-27 php大力力023.CREATE TABLE创建新表sql写字段备注 http://www.cnblogs.com/dalitongxue/p/4762182.html 参考: ...

  9. Vue Create 创建一个新项目 命令行创建和视图创建

    Vue Create 创建一个新项目 命令行创建和视图创建 开始之前 你可以先 >>:cd desktop[将安装目录切换到桌面] >>:vue -V :Vue CLI 3.0 ...

随机推荐

  1. Java基础(认识Java)

    我们要学习Java那么就要首先认识一下Java: Java是什么 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James ...

  2. 关于easy ui 的combobox遍历选中

    $.post("fleetAction!queryAllCompanyByCompanyID.do",{"truckCompany.id":companyId} ...

  3. RAMPS1.4 3d打印控制板接线与测试

    “工欲善其事,必先利其器”,在开始工作之前,你应该准备下面所说的工具(包括软件和硬件). 1.需要下载的软件 1.1 固件上传工具——Arduino IDE 这是上传固件的必备工具,有了这个软件让上传 ...

  4. MySQL 5.6 (Win7 64位)下载、安装与配置图文教程

    一. 工具 Win7 64位操作系统 二. 步骤 第一步:下载安装包 下载 地址:http://www.mysql.com/ 截止到目前(2016/7/24) ,官网的最新版本是5.7.13,不过自己 ...

  5. IDEA 自动重新载入

    IDEA 自动重新载入: Ctrl + F9

  6. Flask最强攻略 - 跟DragonFire学Flask - 第十六篇 Flask-Migrate

    终于到了Flask-Migrate,之前在学习Flask-SQLAlchemy的时候,有的同学就提过类似的问题,Flask支持 makemigration / migrate 吗? 答案在这里该诉你, ...

  7. 腾讯云服务器使用smtp发送邮件

    问题:在腾讯云服务器上使用自编写的邮件服务失败.查其原因,是该邮件服务调用smtpclient.Send(mailMessage)时,出现错误:由于连接方在一段时间后没有正确答复或连接的主机没有反应, ...

  8. Android添加百分比布局库时显示Failed to resolve: com.android.support.percent:问题

    这是看第一行代码中遇到的问题,要添加百分比布局库的依赖时要在app下的bulid.gradle添加以下代码 implementation fileTree(dir:'libs',include:['* ...

  9. servlet登录界面进行用户名和密码验证

    一.建立LoginServlet项目并建立如下目录 二.在Login.html中编写登录界面代码 三.在css文件中新建login.css文件 四.在src文件中添加LoginServlet.java ...

  10. Intellij IDEA的下载安装与破解

    一,下载与安装 1.官网下载:https://www.jetbrains.com/idea/ 2.选择Windows对应版本安装 二,破解 1.下载破解补丁:http://idea.lanyus.co ...