【COBOL 読み3-5-1】ループ抜け兄弟をまとめる〜係長搾取対象時代

🧩今日の学び
EXIT PERFORM CYCLEは「ループを終わらせず、今の1周だけを無かったことにする」制御命令
EXIT PERFORMが撤退なら、CYCLEは見送り。兄弟だが役割は明確に違う
IFのネストやGO TO地獄を避けるために用意された、現場向けの例外処理がCYCLE

係)よし、次行くぞ。

な)えー、休みましょうよー。

6月は恵みの雨に感謝の日が必要ですって。これから夏に向かって準備の日必要ですって。過ぎゆく春にさよならの日が必要ですって!

係)単純に「さようならの日」でいいぞ。一回限りだが。

な)いや、人は何度でもやり直せるんですよ!終わらない旅ですよ!

係)さようなら言ってたのお前だろうが!

EXIT PERFORM CYCLEの正体:ループは終わらせず「今週だけ休む」

係)今回はEXIT PERFORM CYCLEだ。

ここはな、分かったつもりで一番事故る場所だからな、丁寧にいくぞ。

な)って、なんすかこれ?

EXIT PERFORMは、ルーピング抜けるやつですよね?
それにCYCLEがくっついた⋯ということは、ルーピングを抜けるサイクル?

係)そう。

EXIT PERFORM は「ループを終わらせる」EXIT PERFORM CYCLEはその兄弟だ。

係)まず結論だ。

EXIT PERFORM CYCLE は「この周回をスキップして、次の周へ行け」

ということだ。

な)え、ルーピングは終わらないんすか?

係)終わらない。続く。

EXIT PERFORM→ ループ終了(外へ出る)

EXIT PERFORM CYCLE→ 今の1周だけ中断(次の周へ)

実行結果で理解する:抜けるのか、飛ばすのか

参考のコードだ。読んでみろ。

EXIT PERFORM の例

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
    IF I = 3
        EXIT PERFORM
    END-IF
    DISPLAY I
END-PERFORM

な)えーと、から始まって、ずつ増えていって、まで回すってルーピングで、IFのときの条件なので、「I」のときはEND-IFIF抜けてからのDISPLAYで表示となりながら、PERFORM VARYINGに戻って、再度足してになって再度回すも同じ流れ。

3になって再度回すもIFに捕まるので、EXIT PERFORMで抜けちゃうので、PERFORM VARYINGが終了となるので結果はこれっすね。

1
2

係)本当に理解してたんだな…

な)なんで嘘言うんすか!

係)悪かったよ。FからE-ぐらいで考えておくよ。

な)やった!

係)いや、喜ぶなよ⋯って、お前も突っ込めよ⋯

EXIT PERFORM CYCLE の例

係)次はこれだ。

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
    IF I = 3
        EXIT PERFORM CYCLE
    END-IF
    DISPLAY I
END-PERFORM

な)えーと、見た目はあんま変わらないんすね。

EXIT PERFORMEXIT PERFORM CYCLEになっただけっすかね。

んで、同じように、から入ってみて、IFにかからないので、IF外を進むと。

ルーピングして、DISPLAYを表示すると。

んでIになったら、IFに捕まってEXIT PERFORM CYCLEはそのときだけ抜かして、ルーピングが継続になるってことでしょ?おじいちゃんの言い方だと。

係)誰がおじいちゃんだよ!

な)ひとりごとを聞かないでくださいよー。もうー。

係)せめて口に出すなよ!

な)それだと、今日フルコースのディナー行くってひとりごと言って、行かなかったから詐欺だって言ってるようなもんですよ。

係)は…?

な)んでー、だけ抜けて、さらに45と進んでいってDISPLAYされると。

係)いや俺の疑問を無視すんなよ…。ま、まぁ集中しているからいいか…。

な)んでI=6になったら、UNTILに引っかかるから、それでEND-PERFORMでおしまいっと。世界の終わりっと、ドラゴナイっと。

なので、実行結果はこうっすね!

1
2
4
5

なぜCYCLEが必要か:GO TOとIF地獄を回避するため

係)やってみてとわかったと思うが、

CYCLE = 今回は無かったことにする

ということだ。

な)あれ?EXIT PERFORM CYCLE って、ループの先頭に戻ってんすかね?

係)違うな。正確にはこうだ。

PERFORMの制御部に戻るが、PARAGRAPH の先頭に戻るわけじゃない

係)こういったとき、

データ1件ずつ処理

条件に合わない行がある

でも全体処理は続けたい

GO TOで飛ばすは地獄。

IFでネスト増やすと読めない

となってしまうので、EXIT PERFORM CYCLEが使われるってわけだ。

なお、EXIT PERFORMとの使い分けを考えると、

全部やめたい → EXIT PERFORM

今回はやらない → EXIT PERFORM CYCLE

って覚えておけ。

ただし、これも覚えておけ。

  1. CYCLE は 例外処理
  2. 多用しない
  3. 1ループにつき最大1箇所
  4. コメントがあると親切

係)EXIT PERFORM CYCLE を理解したら、もうGO TOは要らないぞ。

・抜ける → EXIT PERFORM

・飛ばす → EXIT PERFORM CYCLE

これで全部表現できるからな。

おむすび

な)GO TOさん引退ですね⋯お疲れ様でした。

係)お前、それ俺に言ってないか?

係)やだなー、係長にはいつまでもいてくれないとですよ!よぼよぼになっても,俺のために来てくださいね!

あ、でも、交通費は自腹でお願いしますね!

係)なんの心配してんだよ!

な)あ、昼食代もです。あと、残業代は出ないので。

係)どこまで搾取する気だよ…

係長のワンポイント

EXIT PERFORM CYCLE は「ループを終わらせず、今の1周だけ無かったことにする」命令だ。
EXIT PERFORM が“撤退”、CYCLE は“今回は見送り”──役割ははっきり違う。
制御は段落の先頭ではなく、PERFORM の制御部に戻るのがポイントだ。
IF で包むと読めなくなり、GO TO は地獄を見る──だから CYCLE が用意された。
全部やめるか、今週だけ休むか──その判断を書けるのが EXIT PERFORM CYCLE だ。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする