在条件存在时执行代码。
DO WHILE
命令无法用点语法。DO WHILE
里可以写Lable
quit,continue,retrun
退出区别DO {code} WHILE expression,...
DO WHILE
执行代码,然后计算表达式。如果表达式的计算结果为True,则DO WHILE
循环并重新执行代码。如果表达式不为true,则不重新执行代码,并执行Do While
后面的下一个命令。
请注意,Do While
始终以面向块的形式编写。要执行的代码放在do
和While
关键字之间,并用大括号括起来。
左大括号或右大括号可以出现在其自己的代码行上,也可以与命令显示在同一行上。左大括号或右大括号甚至可能出现在第1列中(但不建议这样做)。建议的编程实践是缩进大括号以指示嵌套代码块的开始和结束。左花括号前后不需要空格。右大括号前后不需要空格,包括无参数命令后的大括号。
DO WHILE
(与DO
命令无直接关系)不会创建新的执行级别。对执行级别敏感的命令(如NEW
和SET $ZTRAP
)在DO WHILE
循环期间调用,在循环结束后仍然有效。
一个或多个CachéObjectScript命令的块。代码块可能跨越几行。代码块用大括号括起来。代码块内的命令和注释以及命令内的参数可以通过一个或多个空格和/
或行回车符彼此分开。但是,与所有CachéObjectScript命令一样,每个命令关键字必须与其第一个参数仅用一个空格分隔。
一种测试条件,可以采用单个表达式或逗号分隔的表达式列表的形式。对于表达式列表,Caché按从左到右的顺序计算各个表达式。如果遇到假的表达式,它将停止求值。如果所有表达式的计算结果都为true,则Caché重新执行代码命令DO WHILE
重复执行,测试每个循环的表达式。如果任何表达式的计算结果为False,则Caché将忽略任何剩余的表达式,并且不循环。它在DO WHILE
之后执行下一个命令。
以下示例首先显示表达式为TRUE的DO WHILE
,然后显示表达式为FALSE的DO WHILE
。当expression为false时,代码块将执行一次。
/// d ##class(PHA.TEST.Command).TestDoWhileTrue()
ClassMethod TestDoWhileTrue()
{
SET x=1
DO {
WRITE !,"Looping",x
SET x=x+1
} WHILE x<10
WRITE !,"DONE"
}
DHC-APP>d ##class(PHA.TEST.Command).TestDoWhileTrue()
Looping1
Looping2
Looping3
Looping4
Looping5
Looping6
Looping7
Looping8
Looping9
DONE
此程序写入Looping1
到Looping9
,然后执行。
/// d ##class(PHA.TEST.Command).TestDoWhileFalse()
ClassMethod TestDoWhileFalse()
{
SET x=11
DO {
WRITE !,"Looping:",x
SET x=x+1
WRITE !,"Looping x + 1:",x
} WHILE x<10
WRITE " DONE"
}
DHC-APP>d ##class(PHA.TEST.Command).TestDoWhileFalse()
Looping:11
Looping x + 1:12 DONE
此程序编写Looping11
完成。
DO WHILE
和 WHILE
DO WHILE
命令执行循环一次,然后测试表达式。WHILE
命令在执行循环之前测试表达式。
DO WHILE
和 CONTINUE
在DO WHILE
命令的代码块中,遇到CONTINUE命令会导致执行立即跳转到WHILE
关键字。然后,DO WHILE
命令对WHILE
表达式测试条件求值,并基于该求值确定是否重新执行代码块循环。因此,CONTINUE
命令对执行的影响与到达代码块的右大括号完全相同。
DO WHILE
, QUIT
, 和 RETURN
代码块中的QUIT
命令结束DO WHILE
循环,并将执行转移到WHILE
关键字后面的命令,如下面的示例所示:
/// d ##class(PHA.TEST.Command).TestDoWhileLoop()
ClassMethod TestDoWhileLoop()
{
SET x=1
DO {
WRITE !,"Looping",x
QUIT:x=5
SET x=x+1
} WHILE x<10
WRITE !,"DONE"
}
DHC-APP>d ##class(PHA.TEST.Command).TestDoWhileLoop()
Looping1
Looping2
Looping3
Looping4
Looping5
DONE
此程序写入Looping1
到Looping5
,然后执行。
Do While
代码块可以嵌套。也就是说,DO WHILE
代码块可以包含另一个控制流循环(另一个DO WHILE
或FOR
或WHILE
代码块)。内嵌套循环中的QUIT
会中断内循环,转到下一个封闭的外循环。下面的示例显示了这一点:
/// d ##class(PHA.TEST.Command).TestDoWhileNested()
ClassMethod TestDoWhileNested()
{
SET x = 1,y = 1
DO {
WRITE "外部循环 ",!
DO {
WRITE "内部循环 "
WRITE " y=",y,!
QUIT:y=7
SET y = y + 2
} WHILE y < 100
WRITE "返回外部循环 x=",x,!!
SET x = x + 1
} WHILE x < 6
WRITE "Done"
}
DHC-APP>d ##class(PHA.TEST.Command).TestDoWhileNested()
外部循环
内部循环 y=1
内部循环 y=3
内部循环 y=5
内部循环 y=7
返回外部循环 x=1
外部循环
内部循环 y=7
返回外部循环 x=2
外部循环
内部循环 y=7
返回外部循环 x=3
外部循环
内部循环 y=7
返回外部循环 x=4
外部循环
内部循环 y=7
返回外部循环 x=5
Done
可以在任何时候使用RETURN
终止例程的执行,包括从DO WHILE
循环或嵌套循环结构中终止。Return
始终退出当前例程,如果没有调用例程,则返回调用例程或终止程序。无论是否从代码块中发出,Return
的行为始终相同。
/// d ##class(PHA.TEST.Command).TestDoWhileNestedReturn()
ClassMethod TestDoWhileNestedReturn()
{
SET x = 1,y = 1
DO {
WRITE "外部循环 ",!
RETURN
DO {
WRITE "内部循环 "
WRITE " y=",y,!
QUIT:y=7
SET y = y + 2
} WHILE y < 100
WRITE "返回外部循环 x=",x,!!
SET x = x + 1
} WHILE x < 6
WRITE "Done"
}
DHC-APP>d ##class(PHA.TEST.Command).TestDoWhileNestedReturn()
外部循环
DO WHILE
和 GOTO
代码块内的GOTO
命令可以将执行定向到循环外部的标签,从而终止循环。(LABEL有时也称为TAG。)。代码块内的GOTO
命令可以将执行定向到同一代码块内的标签。GOTO
可用于退出嵌套代码块。GOTO
的其他用法虽然受支持,但不推荐使用。
以下示例使用GOTO
退出DO WHILE
循环:
/// d ##class(PHA.TEST.Command).TestDoWhileGoto()
ClassMethod TestDoWhileGoto()
{
mainloop
DO {
WRITE !,"在无限DO WHILE循环中"
GOTO label1
WRITE !,"这不应显示"
} WHILE 1=1
WRITE !,"这不应显示"
label1
WRITE !,"转到label1并退出"
QUIT
}
DHC-APP>d ##class(PHA.TEST.Command).TestDoWhileGoto()
在无限DO WHILE循环中
转到label1并退出
下面的示例使用GOTO
在DO WHILE
循环内传输执行:
/// d ##class(PHA.TEST.Command).TestDoWhileGotoLoop()
ClassMethod TestDoWhileGotoLoop()
{
mainloop ; 代码块内的GOTO示例
SET x=1
DO {
WRITE !,"在DO WHILE循环中"
GOTO label1
WRITE !,"这不应显示"
label1
WRITE !,"GOTO之后仍在DO WHILE循环中"
SET x=x+1
WRITE !,"x= ",x
} WHILE x<3
WRITE !,"DO WHILE循环完成"
}
DHC-APP>d ##class(PHA.TEST.Command).TestDoWhileGotoLoop()
在DO WHILE循环中
GOTO之后仍在DO WHILE循环中
x= 2
在DO WHILE循环中
GOTO之后仍在DO WHILE循环中
x= 3
DO WHILE循环完成