🧩今日の学び
・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は命令より、読む順番を理解できるかで差がつく。

コメント