do-untilループを持つプログラミング言語はありますか?
例:
do
{
<statements>
}
until (<condition>);
これは基本的に次のものと同等です。
do
{
<statements>
}
while (<negated condition>);
注:テスト後のループを探しています。
do-untilループを持つプログラミング言語はありますか?
例:
do
{
<statements>
}
until (<condition>);
これは基本的に次のものと同等です。
do
{
<statements>
}
while (<negated condition>);
注:テスト後のループを探しています。
Rubyはまで持っています。
i=0
begin
puts i
i += 1
end until i==5
VBA!
ここのかなりの数の人々がそれが本当の言語であるかどうか疑問に思うでしょうが、まあ、BASICはMicrosoftが始めた方法です(多くの人にとって非常に弱い議論です、私は知っています)...
VB.Netで可能です
bExitFromLoop = False
Do
'Executes the following Statement
Loop Until bExitFromLoop
BS2000(Fujitsu / Siemensオペレーティングシステム)のSDF-Pでも可能です。
/ DECLARE-VARIABLE A
/ DECLARE-VARIABLE SWITCH-1(TYPE=*BOOLEAN)
/ SET-VARIABLE A = 5
/ SET-VARIABLE SWITCH-1 = ON
/ REPEAT
/ A = A + 10
/ IF (A > 50)
/ SET-VARIABLE SWITCH-1 = OFF
/ END-IF
/ UNTIL (SWITCH-1 = OFF)
/ SHOW-VARIABLE A
A = 55
定義するマクロを使用してCまたはC++も可能ですuntil
例(定義):
#define until(cond) while(!(##cond))
例(使用法):
int i = 0;
do {
cout << i << "\n";
i++;
} until(i == 5);
VBでは、次のようなものを見つけることができます。
Reponse = InputBox("Please Enter Pwd")
Do Until Reponse = "Bob-pwr148" ...
Eiffelはuntilループを提供します。
from
x := 1
until
x > 100
loop
...
end
「アクロス」ループもあります。どちらも非常に強力で表現力豊かです。
このループの設計には、さらに多くの機能があります。その文法には、2つの重要な「正確さ」の問題を解決するのに役立つ2つの部分があります。
エンドレスループ保護
ループバリアントを追加して、ループコードを少し変更してみましょう。
from
x := 1
v := 1_000
until
x > 100
variant
v
loop
...
v := v - 1
end
ループバリアントは(本質的に)カウントダウン変数ですが、古い変数だけではありません。Variantキーワードを使用することにより、コンパイラーにvに注意を払うように指示しています。具体的には、コンパイラは次の2つの条件でv変数をウォッチドッグするコードを生成します。
vはループの反復ごとに減少しますか(カウントダウンしていますか)。カウントダウン変数が(実際には)カウントダウンしていない場合は、カウントダウン変数を使用してみるのは良くありませんよね?ループバリアントがカウントダウンしていない場合(任意の量だけ減少している場合)、例外をスローします。
vがゼロ未満の状態に達することはありますか?その場合、例外をスローします。
これらは両方とも、コンパイラーとバリアント変数を介して連携し、反復ループが反復に失敗するか、何度も反復するかどうかを検出します。
上記の例では、コードは0から1_000回まで繰り返すことを期待しているが、それ以上は繰り返さないというストーリーを伝えています。それ以上の場合は、ループを停止します。これにより、疑問が残ります。1_000回を超えて反復した場合があるのか、それとも条件がTrueにならないという問題があるのでしょうか。
ループ不変条件
ループバリアントが何であるかがわかったので、ループ不変条件が何であるかを理解する必要があります。
不変条件は、ループの各反復後にTrueを保持する必要がある1つ以上のブール条件のセットです。なぜこれらが欲しいのですか?
1_000_000回の反復があり、そのうちの1つが失敗したとします。各イテレーションをウォークスルーして、問題がないかどうかを調べる時間がありません。したがって、各反復の完了時にテストされる1つ以上の条件のセットを作成します。1つまたはすべての条件が失敗した場合、問題の原因となっている反復(およびその決定論的状態)が正確にわかります。
ループ不変条件は次のようになります。
from
x := 1
y := 0
v := 1_000
invariant
y = x - 1
until
x > 100
variant
v
loop
...
x := x + 1
y := y + 1
v := v - 1
end
上記の例では、yはxの後ろに1です。各反復後、yは常にx-1になると予想されます。したがって、ブールアサーションを示すinvariantキーワードを使用して、ループ不変条件を作成します。yがx-1に失敗した場合、ループはすぐに例外をスローし、どの反復がアサーションTrueを維持できなかったかを正確に通知します。
結論
これで、ループは非常にタイトで安全になり、障害(バグ、エラー)から十分に保護されます。