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. 三、latex源文件的基本结构

    在latex中如何使用中文 首先在选项->设置->构建中默认编译器是不是用的是xelatex 编辑器的默认字体编码是不是UTF-8 在导言区引入ctex宏包

  2. SystemParametersInfo调置壁纸、屏幕保护程序

    应用SystemParametersInfo函数可以获取和设置数量众多的windows系统参数.这个小程序就是运用了SystemParametersInfo函数来设置桌面的墙纸,而且程序可以让我们选择 ...

  3. How do you explain Machine Learning and Data Mining to non Computer Science people?

    How do you explain Machine Learning and Data Mining to non Computer Science people?   Pararth Shah, ...

  4. JS获取盒模型对应的宽高

    ## 获取内联样式宽高 只能获取内联设置的样式,在style或者.css文件中设置的无法获取 let div = document.querySelect('.test'); let width = ...

  5. sourcetree 免注册

    http://www.cnblogs.com/xiofee/p/sourcetree_pass_initialization_setup.htmlSourceTree 安装之后需要使用账号登陆以授权, ...

  6. [转载]Oracle Golden Gate - 概念和机制 (ogg)

    出处:https://www.cnblogs.com/qiumingcheng/p/5435907.html Golden Gate(简称OGG)提供异构环境下交易数据的实时捕捉.变换.投递. OGG ...

  7. 20190403vim编辑器week1_day3

    vi编辑器 作用:编辑文本文件中的内容的工具 命令历史 末行模式中,以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 v ...

  8. MySQL插入去重命令_INSERT IGNORE INTO

    之前在介绍INSERT INTO命令时,曾经提到,该命令在执行数据插入操作时,会在数据库中对元组的主键进行检测,若没有存在,则执行插入动作,若存在,则会报错. 而INSERT IGNORE INTO命 ...

  9. Docker Kubernetes hostPort 代理转发

    Docker Kubernetes  hostPort 代理转发 hostPort: 1. 类似docker -p 映射宿主级端口到容器. 2. 容器所在的主机暴露端口转发到指定容器中. 3. hos ...

  10. Mybaties 实现批量修改

    通常我们在做批量更新的时候都会用in 去操作,但in的数据量一上来,就变的缓慢了 修改方案: <update id="updateShufflingSeq" paramete ...