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. Software Testing 3

    Questions: • 7. Use the following method printPrimes() for questions a–d. 基于Junit及Eclemma(jacoco)实现一 ...

  2. hive sql执行的job在map时报java.lang.OutOfMemoryError的错误

    较为详细且重要的一段报错信息是org.apache.hadoop.mapred.YarnChild: Error running child : java.lang.OutOfMemoryError: ...

  3. PyQt5学习笔记

    setMouseTracking bool mouseTracking这个属性保存的是窗口部件跟踪鼠标是否生效.如果鼠标跟踪失效(默认),当鼠标被移动的时候只有在至少一个鼠标按键被按下时,这个窗口部件 ...

  4. 调度器的实现、schedule、switch_context、switch_to

    根据<深入Linux内核架构>和Linux-3.10.1内核源码,记一些调度过程的主体工作. 调度器任务:CPU数目比要运行的进程数目少,需要程序之间共享CPU时间,创造并行执行的错觉.分 ...

  5. Appium+python自动化1-环境搭建(上)

    前言 appium可以说是做app最火的一个自动化框架,它的主要优势是支持android和ios,另外脚本语言也是支持java和Python.小编擅长Python,所以接下来的教程是appium+py ...

  6. 二进制包安装MYSQL——

    yum install libaio -y #安装mysql依赖包tar zxf mysql-5.5.59-linux-glibc2.12-x86_64.tar.gz mv mysql-5.5.59- ...

  7. C语言实例:数组与字符串

    数组: #include <stdio.h> #include <stdlib.h> #define ARRAY_SIZE(Array) (sizeof (Array) / s ...

  8. php 固定红包 + 随机红包算法

    <?php /** * 随机红包+固定红包算法[策略模式] * copyright (c) 2016 http://blog.csdn.net/CleverCode */ //配置传输数据DTO ...

  9. Docker Overlay 介绍

    Overlay Network Overlay Network:属于Docker网络驱动,基于VXLAN封装实现Docker原生Overlay网络. Overlay Network:覆盖网络,在基础网 ...

  10. Python 互斥锁

    互斥锁Mutex的使用 多个线程处理共享数据,数据会出现问题: 2.7之前每100指令切换一次GIL锁,线程就会sleep,线程会把前100条处理指令存放在CPU缓存内,切换GIL锁后放入另外一个线程 ...