【COBOL 読み3-10-8】SEARCHのAT ENDとWHENの順序〜クローンウォーリーを探せ!

🧩今日の学び
SEARCHは「WHENを評価 → 見つからなければ最後にAT END」が実行される構文
・記述順と実行順が逆になる点が、SEARCH最大の混乱ポイント
COBOLは英語的に「枠を先に示し、中身を後で語る」思想で書かれている

今日のコード

01  ITEM.
    05 ITEM-REC OCCURS 5 TIMES
       INDEXED BY IDX.
        10 ITEM-ID PIC X(3).
        10 ITEM-NAME PIC X(10).

01 TARGET-ID PIC X(3) VALUE "003".

MOVE "003"    TO ITEM-ID(3).
MOVE "ORANGE" TO ITEM-NAME(3).

SET IDX TO 1
SEARCH ITEM-REC
    AT END
        DISPLAY "見つかりません"
    WHEN ITEM-ID(IDX) = TARGET-ID
        DISPLAY "見つけた: " ITEM-NAME(IDX)
END-SEARCH

AT ENDが先?SEARCH最大の混乱ポイント

なるお)あれ?

そういえばAT ENDの方が先なんすよね。なんでENDが先なんすかね。終わりの始まりって言いたかったんすかね。つまり、世界は終わるんすね⋯残念です…。係長、お元気で…。

係長)勝手に終わらせて落ち込むんじゃねーよ。まじめにやれって。

な)いつだって真剣ですよ!大剣ですよ!あ、一緒にモンハンやります?会社のゴミPCでもやれるかもですよ!

係)いろいろ解雇案件だからな。

な)え!?

係)いいか、ここはSEARCH最大の混乱ポイントだ。

評価はWHENが先、記述はAT ENDが先

係)書く順番は「AT ENDが先」
評価される順番は「WHENが先」

な)…はぁ。

後先逆にするとか、ややこしいんすよ!順番間違ってもおれのせいじゃないっすからね!END言ってんのに、先にするほうが悪いんすよ!

映画でENDってなってんのに、エンドロール後、立たなくてよかった!100円分損するとこだったーって思わせるやつですよ!結局帰っちゃってますよ!後日部屋でみたらまだ終わってなかったんかい!って思うやつですよ!終わらない閉店セールですよ!

係)なんで先なんですか、でいいだろが…

SEARCHの中で実際に起きている判断順はこれだ。

1️⃣ WHENをチェック
2️⃣ 見つかったら → WHEN実行してSEARCH終了
3️⃣ 見つからず、最後まで行ったら → AT END

つまり、AT END は「全部WHENがダメだった時の保険」ということだ。

な)AT ENDが先に動くことはないっすよね。

係)絶対にない。
WHENより先に評価されることはない。

な)だったら、後でいいじゃないっすか!

係)うるっさいな…閉店セールになんか恨みでもあるのかよ…

な)だって、閉店かと思ったら、ただのリニューアルで、商品の置き場所変わってただけだったんすよ!

係)別に(どーでも)いいじゃねーか…

なぜAT ENDを先に書くのか:COBOLの英語的発想

なぜ「AT END を先に書く」のか、というのがCOBOLの英語思想だな。

SEARCH ITEM-REC
    AT END
        DISPLAY "見つかりません"
    WHEN ITEM-ID(IDX) = TARGET-ID
        DISPLAY "見つけた"
END-SEARCH

これ、英語で流れを読むとこうなる。

Search item-rec,
at end do this,
when condition do that

係)英語には「大きな枠組みを先に決めてから、中身を語る」という性質があるからな、COBOLはその性質に沿った考え方ってことだろうな。

な)ほへー。係長純日本人っぽいのに、よく英語のこととか知ってますね…

係)悪かったな!

な)ってことは、じゃない方が先なんですね。

係)は?

な)だって、AT ENDって例外っぽい感じがしません?全部見たけど、なかったらってことだから、ウォーリーを探せ!みたいな?

係)む…ん…

な)でも、全員赤ボーダーで、黒縁眼鏡で、ニット帽かぶってるクローンウォーリーだったら、ウォーリー探せないっすよ!

係)全員クローンウォーリーだったら、全員ウォーリーで正解だろ!

順番を入れ替えたらどうなる?

な)でも別にWHEN先でもいけそうですけどね?

SEARCH ITEM-REC
    WHEN ITEM-ID(IDX) = TARGET-ID
        DISPLAY "見つけた"
    AT END
        DISPLAY "見つかりません"
END-SEARCH

ほらー読みやすい!

係)文法エラーだ。

な)え、ダメなんすか!?

係)ダメだ。

SEARCH文の構文は順番固定

  • SEARCH
  • AT END
  • WHEN
  • END-SEARCH

な)なんて融通の利かない!これだからぴっちり七三分けは!

係)一度、本場で怒られてこいって。

細かい理屈はともかく、この逆転を覚えとけよ。

な)これだからアメリケーヌはおしゃれさんだって言われるんですよ。

係)どこにオシャレ要素あるんだよ!

おむすび

係)SEARCHは糖衣構文は許すが、礼儀作法が厳しいってことだ。

な)だから、ホイップクリーム構文ですって!

係)うるせえ!

な)むー。

係)AT ENDがなくても一応通るが、きちんとした処理にならないことも考えられるから注意しろよ。

な)そらいいんですけど、なんかまた係長の知識がひけらかされた感じでしたよー。

係)嫌な言い方するなよ!

な)英語喋れないのに。

係)おれは日本から出ねーからいいんだよ!

な)一緒に本場行きましょ!ね!

係)お前は入国審査通らねーだろ。

な)なんで!?

係長のワンポイント

SEARCHは「書いた順」に動く構文じゃない。
評価はWHENが先、記述はAT ENDが先──ここが最大の罠だ。
AT ENDは最初に書くが、最後まで見つからなかった時にしか動かない。
英語的には「枠を先に決めて、中身を後で語る」発想になる。
SEARCHは命令より、読む順番を理解できるかで差がつく。

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

この記事を書いた人

コメント

コメントする