从当前例程中删除一行或一系列行,或卸载当前例程。
大纲ZREMOVE:pc lineref1:lineref2 ,...
ZR:pc lineref1:lineref2 ,...
参数
- pc 可选-后置条件表达式。
- lineref1 可选-单行或要删除的行范围中的第一行的位置。可以指定为文字(+5)或变量(+ a)。如果省略lineref1,则ZREMOVE会删除整个当前例程。
- :lineref2 可选-要删除的一系列行中最后一行的位置。
ZREMOVE
命令在当前进程的当前加载例程上运行。使用ZLOAD
加载当前例程。 ZLOAD
加载例程的INT代码版本。 INT代码不计算或不包含预处理程序语句。不管是在源代码中还是在多行注释中,INT代码都不会计算或不包含例程的MAC版本中的空白行。一旦例程被加载,它将成为所有名称空间中当前进程的当前加载例程。因此,可以从任何名称空间(而不仅仅是从其加载的名称空间)插入或删除行,显示,执行或卸载当前加载的例程。
从终端输入ZREMOVE
命令或使用XECUTE
命令或$XECUTE
函数调用它时,才可以使用ZREMOVE
命令。在例程主体中指定ZREMOVE
会导致编译错误。从例程中执行ZREMOVE
的任何尝试也会产生错误。
ZREMOVE
有两种形式:
- 不带参数的情况下将卸载当前例程。
- 带参数的对象会从当前例程中删除一行或多行ObjectScript源代码。
不带参数的ZREMOVE
会删除(卸载)当前加载的例程。在无参数ZREMOVE
之后,$ZNAME
返回空字符串,而不是当前例程的名称,并且ZPRINT
不显示任何行。因为该例程已被删除,所以您不能使用ZSAVE
保存该例程。尝试这样做会导致<COMMAND>
错误。
以下终端会话显示了此操作:
DHC-APP>ZLOAD PHA.TEST.Command
DHC-APP>WRITE $ZNAME
PHA.TEST.Command
DHC-APP>ZREMOVE
DHC-APP>WRITE $ZNAME
无参数ZREMOVE
可以指定后置条件表达式。
具有参数的ZREMOVE
可以删除当前例程的所有行,但不能删除当前例程本身。例如,ZREMOVE +1:NonexistentLabel·
删除当前例程的所有行,但可以使用ZINSERT
插入新行,并使用ZSAVE
保存该例程。
具有参数的ZREMOVE
会删除当前例程中的代码行。 ZREMOVE lineref1
删除指定的行。 ZREMOVE lineref1:lineref2
删除从第一个参考线开始到第二个参考线结束(包括两端)的行范围。它将编辑指针前进到删除的行之后。因此,ZREMOVE lineref1
后跟ZINSERT
会替换指定的行。
ZREMOVE
可以通过指定lineref1或lineref1:lineref2参数的任何组合的逗号分隔序列来删除ObjectScript源代码的多行(或多个范围)。每个指定的行或代码行范围都按照指定的顺序作为单独的删除操作删除。
可以使用ZPRINT
显示当前加载的例程的多行。可以使用DO
命令执行当前例程。
仅影响例程的本地副本,而不影响存储在磁盘上的例程。要存储修改后的代码,必须使用ZSAVE
命令保存例程。
以下终端会话显示了此操作。本示例使用一个虚拟例程(^myroutine
),其中每行将变量设置为命名该行的字符串:
DHC-APP>ZLOAD PHA.TEST.Command
DHC-APP>ZPRINT +8
WRITE "E is Epsilon",!
DHC-APP>ZREMOVE +8
DHC-APP>PRINT +8
/* Not sure about E */
参数
pc
可选的后置条件表达式。如果后置条件表达式为true(计算为非零数值),则Caché执行命令。如果后置条件表达式为假(计算为零),则Caché不执行命令。
lineref1
要删除的行,或者要删除的行中的第一个。它可以采用以下任何一种格式:
- +offset 指定例程中的行号。从1开始计数的正整数。
- label 在例程中指定标签。 ZREMOVE标签仅擦除标签行本身。这包括该行标签后面的所有代码。
- label+offset 指定标签和要在标签部分中偏移的行数,将标签行计为第1行。
标签的长度可能超过31个字符,但在前31个字符内必须唯一。 ZREMOVE
仅匹配指定标签的前31个字符。标签名称区分大小写,并且可能包含Unicode字符。
可以使用lineref1指定要删除的单行代码。可以将代码行指定为距例程开头的偏移量(+ lineref1),也可以指定为距指定标签的偏移量(label + lineref1)。
-
ZREMOVE +7
:从例行程序开始算起第七行。 -
ZREMOVE +0
:不执行任何操作,不产生任何错误。 -
ZREMOVE +999
:如果999大于例程中的行数,则不执行任何操作,也不产生错误。 -
ZREMOVE Test1
: 删除标签行Test1。 -
ZREMOVE Test1+0
:删除标签行Test1。 -
ZREMOVE Test1+1
:删除标签行Test1之后的第一行。 -
ZREMOVE Test1+999
: 删除标签行Test1之后的第999行。该行可能在另一个标记的模块中。如果999大于从标签Test1到例程结尾的行数,则不执行任何操作,不产生错误。
INT代码行包括在例程的MAC版本中找到的所有标签,注释和空格,但编译器删除的MAC例程中的完全空白行既不显示也不在INT代码中计数。多行注释中的空白行也将被删除。 MAC代码中的#;
,##;
和///
注释可能不会出现在INT代码中,因此可能会影响行数和偏移量。
lineref2
范围中要删除的最后一行。以用于lineref1的任何格式指定lineref2。冒号前缀(:
)是必需的。
可以将行的范围指定为+ lineref1:+ lineref2。 ZREMOVE
删除行的范围,包括lineref1和lineref2。如果lineref1和lineref2引用同一行,则ZREMOVE
会删除该单行。
如果lineref2在例程代码中早于lineref1出现,则不执行任何操作,也不产生错误。例如:ZREMOVE +7:+ 2
,ZREMOVE Test1 + 1:Test1
,ZREMOVE Test2:Test1
将不执行任何操作。
注意:在lineref2中指定标签名称时请小心。标签名称区分大小写。如果lineref2包含例程中不存在的标签名称,则ZREMOVE
会删除从lineref1到例程末尾的行范围。
此命令将删除当前例程中的第四行。
ZREMOVE +4
该命令擦除标签Test1
之后的第六行; Test1
被计为第一行。
ZREMOVE Test1+6
此命令将删除当前例程中的第3行到第10行(包括3行和10行)。
ZREMOVE +3:+10
在当前例程中,此命令通过紧随其后的行删除标签行Test1
。
ZREMOVE Test1:Test1+1
此命令在当前例程中擦除从标签Test1
到标签Test2
的所有行,包括两个标签。
ZREMOVE Test1:Test2