文章目录

  • 第十八章 Caché 命令大全 NEW 命令
  • 重点
  • 大纲
    • 参数
  • 描述
    • NEW的限制
  • 参数
    • pc
    • variable
  • 示例
  • 注意
    • 使用`NEW`功能的位置
    • `new`和`kill`
    • `Inclusive NEW` 包含`NEW`
    • `Exclusive NEW` 独占`NEW`
  • 无参`NEW`
  • 特殊变量:`$ESTACK、$ETRAP、$NAMESPACE`和`$ROLES`
  • 带参数传递的子例程

第十八章 Caché 命令大全 NEW 命令

创建空的局部变量环境。

重点

  1. 在程序中也就是类程序中,默认都是私有变量不能NEW
  2. 在mac或生命过程块为true时,可以使用NEW命令。
  3. n (a,b,c) 这种代表除了a,b,c都初始化
  4. 可以new的变量,不可以new的变量
  5. 尝试发出超过31个级别的独占NEW或无参数NEW会导致<MAXSCOPE>错误。

大纲

NEW:pc newargument,...
N:pc newargument,...

newargument可以是:

variable,...
or
(variable,...)

参数

  • pc 可选的后置表达式
  • variable 可选-要添加到现有局部变量环境的变量的名称。NEW对现有局部变量的影响取决于变量是括在括号中(排除NEW)还是没有括在括号中(包含NEW)。变量必须是有效的局部变量名,但不必是已定义的变量;指定未定义的变量既不会发出错误,也不会定义该变量。

描述

NEW命令有两种形式:

  • 无参数
  • 有参数
    不带参数的NEW为被调用子例程或用户定义函数创建一个空的局部变量环境。现有的本地变量值在此NEW的本地环境中不可用。它们可以通过返回到以前的当地环境来恢复。

使用参数执行的new操作取决于使用的参数形式。

  • new变量(包括new)保留现有的局部变量环境,并向其中添加指定的变量。如果任何指定的局部变量与现有局部变量同名,则在当前环境中无法再访问该命名变量的旧值。
  • new(变量)(独占new)替换本地变量环境中除指定变量之外的所有现有变量。

NEW的限制

NEW命令(包含或排除)不能用于以下内容:

  • Globals 全局变量
  • Process-Private Globals 私有进程全局变量
  • Local variable subscripts 局部变量下标
  • Private variables 私有变量
  • 特殊变量,$ESTACK$ETRAP$NAMESPACE$ROLES除外

尝试在这些上下文中的任何上下文中使用NEW都会导致<SYNTAX>错误。

参数

pc

可选的后置条件表达式。如果后置条件表达式为TRUE(计算结果为非零数值),则Caché执行NEW命令。如果后置条件表达式为假(计算结果为零),则Caché不执行该命令。

variable

单个变量的名称或逗号分隔的变量名列表。虽然可以新建整个数组(即不带下标的数组名称),但只能指定无下标的变量名。可以指定未定义的变量名称,也可以重用现有局部变量的名称。对于包含式NEW,当指定现有局部变量时,Caché会在本地环境中重新初始化该变量,但会将其当前值保存在程序堆栈上,并在子例程或函数终止后恢复该变量。

当变量名或以逗号分隔的变量名列表括在括号中(不包括new)时,Caché执行相反的操作。也就是说,所有局部变量都被重新初始化,但指定的变量名除外,它们保留了以前的值。Caché保存程序堆栈中所有变量的当前值,并在子例程或函数终止后恢复它们。

示例

下面的示例说明了一个包含性NEW,它保留现有的局部变量abc,并添加变量de(在本例中,覆盖先前的d值)。

Main1SET a=7,b=8,c=9,d=10WRITE !,"Before NEW:",!,"a=",a,!,"b=",b,!,"c=",c,!,"d=",dDO Sub1WRITE !,"返回到以前的上下文:"WRITE !,"a=",a,!,"b=",b,!,"c=",c,!,"d=",dQUIT
Sub1NEW d,eSET d="big number"WRITE !,"After NEW:",!,"a=",a,!,"b=",b,!,"c=",c,!,"d=",dQUIT
DHC-APP>d Main1^PHA.TEST.CommandBefore NEW:
a=7
b=8
c=9
d=10
After NEW:
a=7
b=8
c=9
d=big number
Returned to prior context:
a=7
b=8
c=9
d=10

下面的示例说明了独占NEW,它删除除指定变量ac之外的所有现有局部变量。

Sub2 SET a=7,b=8,c=9,d=10NEW (a,c)WRITE
DHC-APP>d Sub2^PHA.TEST.Commanda=7
c=9

注意

使用NEW功能的位置

New允许将当前进程的局部变量环境与子例程、用户定义函数或XECUTE字符串所做的更改隔离。NEW最常在do命令调用的子例程中使用。

NEW命令的基本目的是重新定义被调用子例程或用户定义函数内的局部变量环境。 未传递参数而被调用的子例程或用户定义函数从调用例程继承其局部变量环境。要重新定义子例程或函数的此环境,可以将new用于所有局部变量(无参数new)、命名局部变量(包含new)或除命名变量之外的所有局部变量(排除new)。

在过程(类程序中)中,变量可以是私有的,也可以是公共的:

  • 默认情况下,局部变量是该过程的私有变量。过程块使用私有变量,该私有变量不与过程块外部具有相同名称的变量交互。不能对私有变量执行NEW;尝试对过程块内的私有变量执行包含式或排他性NEW会导<SYNTAX>错误。
  • 声明过程时,可以将局部变量显式列为公共变量。可以对过程块内的公共变量执行NEW。此NEW功能仅影响该过程中的变量值。可以在过程中重复NEW建公共变量。

newkill

NEW创建的变量不需要显式且相应的KILL命令。当被调用的子例程或用户定义的函数终止时,Caché会对该子例程或函数中由NEW命令初始化的每个变量执行隐式KILL

Inclusive NEW 包含NEW

Inclusiv NEW-NEW变量-保留现有的局部变量环境,并将指定的变量添加到该环境中。如果现有变量已命名,则“new”变量将替换现有变量,该变量将保存在堆栈中,然后在子例程或函数终止时恢复。

Inclusive NEW不限制可以指定为逗号分隔列表的变量数量。Inclusive NEW也不限制本地变量环境级别的数量(发出NEW的次数)。

在下面的示例中,假设调用例程(Main)的局部变量环境由变量abc组成。当DO调用Subr1时,new命令将Subr1的局部变量环境重新定义为新变量c并添加变量d。在new之后,子例程的环境由现有变量ab加上新变量cd组成。变量ab被继承并保留其现有值。新变量cd被创建为未定义。因为c是现有局部变量的名称,所以Caché将现有值保存在堆栈上,并在Subr1退出时恢复它。请注意,Subr1中的第一个set命令引用abd赋值。请注意,此上下文中的变量c未定义。

Main3SET a=2,b=4,c=6WRITE !,"c in Main before DO: ",cDO Subr1(a,b,c)WRITE !,"c in Main after DO: ",cQUIT
Subr1(a,b,c)NEW c,dIF $DATA(c) {WRITE !,"c=",c}ELSE {WRITE !,"c in Subr1 is undefined"}SET d=a*bSET c=d*2WRITE !,"c in Subr1: ",cQUIT

执行此代码时,将生成以下结果:

DHC-APP>d Main3^PHA.TEST.Commandc in Main before DO: 6
c in Subr1 is undefined
c in Subr1: 16
c in Main after DO: 6

无论是按值传递参数(如上例所示),还是按引用传递参数,结果都是相同的:

Main4SET a=2,b=4,c=6WRITE !,"c in Main before DO: ",cDO Subr4(.a,.b,.c)WRITE !,"c in Main after DO: ",cQUIT
Subr4(&a,&b,&c)NEW c,dIF $DATA(c) {WRITE !,"c=",c}ELSE {WRITE !,"c in Subr1 is undefined"}SET d=a*bSET c=d*2WRITE !,"c in Subr1: ",cQUIT
DHC-APP>d Main4^PHA.TEST.Commandc in Main before DO: 6
c in Subr1 is undefined
c in Subr1: 16
c in Main after DO: 6

请注意,变量c被传递给Subr1,然后立即使用new重新定义。在这种情况下,不需要传递变量c;无论是否传递c,程序结果都是相同的。如果新建任何在子例程的形参列表中指定的变量,则会将它们呈现为未定义,并使其传递的值不可访问。

Exclusive NEW 独占NEW

exclusive new-new(var1,var2)-替换除指定变量之外的整个现有局部变量环境。如果现有变量已命名,则会保留该变量,并可在新环境中引用该变量。但是,当函数或子例程终止时,对此类变量所做的任何更改都会反映在现有变量中。

独占NEW最多可以指定255个变量作为逗号分隔的列表。 超过此数字会导致Caché发出<SYNTAX>错误。

XCLUSIVE NEW (NEW (x,y,z)) 临时从当前作用域中删除局部变量。这可能会影响Caché对象创建的局部变量。例如,Caché维护%objcn,它是用于Caché对象查询的游标指针。将其从当前作用域中删除可能会导致与其他内部结构发生冲突。因此,不要在任何可能影响系统结构的上下文中使用独占NEW

尝试发出超过31个级别的独占NEW或无参数NEW会导致<MAXSCOPE>错误。

FOR代码块中使用EXCLUSIVE NEW时,必须将FOR COUNT变量指定为排除变量。

在下面的示例中,假设调用例程(Start)的局部变量环境由变量abc组成。当DO调用Subr1时,NEW命令会重新定义Subr1的局部变量环境,以排除除cd之外的所有变量。

new之后,子例程的环境仅由new变量cd组成。NEW变量c从调用例程的环境中保留,并保持其现有值。创建未定义的新变量d

Subr1中的第一个set命令引用cd赋值。第二个set命令将新值(24)分配给c。当子例程退出时,c将在调用例程的环境中拥有这个更新值(而不是原始值6)。

Start    SET a=2,b=4,c=6DO Subr1WRITE !,"c in Start: ",cQUIT
Subr1    NEW (c,d)SET d=c+cSET c=d*2WRITE !,"c in Subr1: ",cQUIT

执行此代码时,将生成以下结果:

c in Subr1: 24
c in Start: 24

无参NEW

无参数NEW为被调用子例程或用户定义函数提供了一个空的局部变量环境。现有的局部变量环境(在调用例程中)被保存,然后在子例程或函数终止时恢复。当子例程或函数终止时,在NEW之后创建的任何变量都会被删除。

如果命令在同一行上跟在new之后,请确保将new命令与它后面的命令分隔(至少)两个空格。

不应在for循环体内或在可能影响Caché对象的上下文中使用无参数new

尝试发出超过31个级别的独占NEW或无参数NEW会导致<MAXSCOPE>错误。

特殊变量:$ESTACK、$ETRAP、$NAMESPACE$ROLES

不能对大多数特殊变量使用NEW;尝试这样做会导致<SYNTAX>错误。有四个例外:ESTACK、$ETRAP、$NAMESPACE$ROLES

  • $ETRAP:当发出命令new $ETRAP时Caché会为错误捕获创建一个新的上下文。然后,可以使用所需的错误捕获命令在此新上下文中设置$ETRAP。保留前一个上下文中的$ETRAP值。如果在没有首先发出NEW $ETRAP命令的情况下设置$ETRAP,则Caché会在所有上下文中将$ETRAP设置为此值。因此,建议在设置$ETRAP特殊变量之前始终使用NEW变量。
  • $NAMESPACE:当发出命令new $NAMESPACE时,Caché会创建一个新的名称空间上下文。在此上下文中,可以更改名称空间。当退出此上下文时(例如,使用QUIT),Cché将恢复到以前的名称空间。

带参数传递的子例程

如果调用带有参数传递的子例程,则Caché会为该子例程的形参列表中指定的每个变量发出一个隐式new命令。然后,它将DO命令的实际参数列表中传递的值(按值或按引用)赋给这些变量。

如果do命令使用按值传递的参数,并且如果正式列表命名了任何现有的局部变量,则Caché会将现有变量及其值放入堆栈。当子例程终止(显式或隐式退出)时,Caché会为每个正式列表变量发出隐式kill命令,以便从堆栈恢复它们。

第十八章 Caché 命令大全 NEW 命令相关推荐

  1. 第六十八章 Caché 函数大全 $WASCII 函数

    文章目录 第六十八章 Caché 函数大全 $WASCII 函数 大纲 参数 描述 示例 第六十八章 Caché 函数大全 $WASCII 函数 返回识别代理项对的字符对应的数字代码. 大纲 $WAS ...

  2. 第二十八章 Caché 命令大全 TSTART 命令

    文章目录 第二十八章 Caché 命令大全 TSTART 命令 重点 大纲 参数 描述 嵌套事务 SQL Transactions 参数 pc 示例 第二十八章 Caché 命令大全 TSTART 命 ...

  3. 类 workbooks 的 open 方法无效_第十九章 Cach 命令大全 OPEN 命令

    第十九章 Caché 命令大全 OPEN 命令 获取输入/输出操作的设备或文件的所有权. 重点 打开设备要指定延迟秒,否则将无限等待. 大纲 OPEN:pc device:(parameters):t ...

  4. 第二十章 Caché 命令大全 QUIT 命令

    文章目录 第二十章 Caché 命令大全 QUIT 命令 重点 大纲 参数 描述 在程序代码中 无参数`QUIT` 带参数QUIT 在终端提示下 参数 pc expression 示例 注意 `QUI ...

  5. 第三十七章 Caché 命令大全 ZWRITE 命令

    文章目录 第三十七章 Caché 命令大全 ZWRITE命令 重点 大纲 参数 描述 `ZWRITE`不带参数 `ZWRITE`带参数 Variables Non-Display Characters ...

  6. 第二十三章 Caché 命令大全 SET 命令

    文章目录 第二十三章 Caché 命令大全 SET 命令 重点 大纲 参数 描述 将多个变量设置为相同的值 设置多个变量的限制 参数 pc variable value JSON值 JSON对象 JS ...

  7. eNSP命令大全(所有命令)

    eNSP命令大全(所有命令) 命令符 从用户视图切换到系统视图 system–view 从系统视图切换到用户视图 quit 连入接口命令 interface IP地址.子网掩码配置命令 ip addr ...

  8. 计算机的网络命令大全,计算机网络命令大全.doc

    计算机网络命令大全 计算机网络命令大全在Windows 2000/XP/Server 2003中要查看端口,可以使用Netstat命令: 依次点击"开始→运行",键入"c ...

  9. 计算机telnet命令大全,telnet命令大全.doc

    telnet命令大全 telnet 命令允许您与使用 Telnet 协议的远程计算机通讯.运行 telnet 时可不使用参数,以便输入由 Telnet 提示符 telnet 表明的 telnet 上下 ...

最新文章

  1. 剑指offer三:从尾到头打印链表
  2. 关于keil环境的 三个红点(备忘)
  3. python3.7基础教程_关于本教程 |《Python 官方文档:入门教程 3.7.0》| Python 技术论坛...
  4. kali里PHP文件502错误,解决Linux Kali iptables开放22端口失败等一系列问题
  5. Ice-E(Embedded Internet Communications Engine)移植到s3c2440A(arm9)linux(2.6.12)上的 -转
  6. 二等水准数据平差_二等水准平差软件
  7. C语言 · 进制转换
  8. hive教程:第一次使用sql
  9. java怎么打hello,java hello word怎么打
  10. 分类器集成和非均衡分类
  11. MTK6577+Android之Camera驱动) ~% d
  12. 【通讯录教程】Excel表格批量手机号码导入安卓和苹果手机的通讯录,下面教你方法
  13. 利用Google Earth卫星图更新地形图地物
  14. Foxmail:完美配置QQ邮箱、163邮箱、Google邮箱
  15. LPC1768生成bin文件夹问题
  16. python结巴分词实例_python 结巴分词(jieba)详解
  17. 具有编码能力的可展开结构人造肌肉
  18. 函数最值题目及答案_二次函数的最值问题举例(附练习答案)
  19. iptables 防火墙中的SNAT和DNAT
  20. 使用十六进制设置颜色

热门文章

  1. 精通Web Analytics 2.0 (8) 第六章:使用定性数据解答”为什么“的谜团
  2. [2021-11-02] VMware 共享文件夹不显示的问题
  3. 写在2015年年末的年终总结
  4. springBoot集成swagger访问报404
  5. 苏州Uber人民优步奖励政策
  6. 关于UGUI的Image,Text (转雨凇momo)
  7. TWS耳机无线充电仓
  8. JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)
  9. TWaver使用中间点画折线方法
  10. python剪刀石头布小游戏源码下载_Python Tkinter实现剪刀石头布小游戏