【COBOL 読み1-17】メロスの激怒とADDってTO

🧩今日の学び
・ADDとMOVEは「TOの右側が本命」というCOBOL界の絶対ルールを理解。
・段落名は“未来の拡張”を見据えた見出し構造であり、1行でも意味がある。
・ピリオド1つで段落と変数の世界が分かれる──COBOLの文化を知ると理解が深まる。

今日のコード

  *> トータル加算
           ADD N-LINE-NET   TO SUM-NET
           ADD N-LINE-TAX   TO SUM-TAX
           ADD N-LINE-GROSS TO SUM-GROSS
           ADD 1 TO TOT-OK

           *> 国コード(先頭2文字)抽出
           DECLARE-C-UPDATE.
               PERFORM UPDATE-COUNTRY-SUM.

           *> 明細1行 出力(任意)
           PERFORM WRITE-DETAIL-LINE.
ADD N-LINE-NET   TO SUM-NET

なるお)N-LINE-NET にSUM-NETを足すってのはわかる。

わかるってだけだけど。

でも読めてる!俺読めてるよ!

係)それ逆だ。

ADD N-LINE-NET TO SUM-NET」ってのは、“N-LINE-NETをSUM-NETに足す”

て意味だ。

つまり計算式にするとこうだ

SUM-NET = SUM-NET + N-LINE-NET

ADDとMOVE:TOの右側が本命という絶対ルール


な)そうだ、入れる順番がまだ誤解しちゃうんですけど、

ADD A TO B

とか、Bが主体ってことでいいんです?これ絶対です?

係)そうだ、Bが主体──つまり「Bに対して何をするか」って考えるのが正解だ。

これはもうCOBOL界の絶対ルールだな。

な)えーでも、AとBが並んでるから、左から右に読むと「AにBを足す」って思っちゃうんすけど。

係)そこがCOBOLのトラップゾーンだ。

英語の文法に従うと、「add A to B」=「AをBに加える」になる。

英語の“to”が指してるのは“行き先”で、つまり、Aが材料、Bが目的地ってわけだ。

な)材料と目的地?

材料と目的地ってことは、、、、

おれは卵をあの娘のもとに届ける。
メロスのごとく?セリヌンティウスは置いといて?激怒してる場合じゃないっすよ!

係)違ってねーけど、お前が思ってることとは違うわ。

逆に

MOVE A TO B

なら「AをBに動かせ」だから、Bが目的地、Aが中身

MOVEもADDも、「TOの右側が本命(更新されるやつ)」って思っておけ。

な)なるほどー右が本命。

じゃあ俺の愛も「右に入れて」もらえれば叶うってことすね!
んで、愛の右ってなんです?

係)知るか!

段落名は目印:DECLARE-C-UPDATEの本当の役割

    *> 国コード(先頭2文字)抽出
           DECLARE-C-UPDATE.
               PERFORM UPDATE-COUNTRY-SUM.

な)ん?PERFORM一つだけだったら、前のコードと一括りにしてもいいんじゃないんですの?

DECLARE-C-UPDATE

わざわざここだけの宣言しなくても。目立ちたがりですか?

係)見た目だけで判断するなよ。

いいか、ここは“目立ちたがり”じゃなくて“整理上の区切り”だ。

な)整理上?領収書の仕分け的な?A4のクリアファイルとかで?

係)まぁ近い。COBOLはな、段落(Paragraph)を見出し代わりに使う文化がある。

だから DECLARE-C-UPDATE. ってのは「ここから国別サマリ関連の処理を始めますよ」っていう目印みたいなもんだ。

な)えー、でも PERFORM 1行しかないですよ?

だったら直接 PERFORM UPDATE-COUNTRY-SUM. だけでいいじゃないっすか。
なんなら一行で終わる恋みたいにスッキリするのに。

係)お前の恋はだいたい一行も続かねぇけどな。

な)…うっさい(小声)

係)いいか。ここは「今後拡張するかもしれない場所」なんだよ。

たとえば、国コードを抜くだけじゃなくて「コードを正規化する」とか「国名を参照する」処理をあとで足したくなったら、この DECLARE-C-UPDATE の中にどんどん増やせばいいだろ?

な)あー、未来への投資ってやつすね!
もっと食べときますね!

係)どういうことだよ…

段落名と変数名の違い:ピリオド一つで世界が変わる

           *> 明細1行 出力(任意)
           PERFORM WRITE-DETAIL-LINE.

な)WRITE-DETAIL-LINEを実行するって感じっすね。

なんかややこしいんですけど、段落名(ラベル)でしたっけ?これと変数の見た目の違いってあるんです?

係)確かに COBOL は 段落名(Paragraph Name)変数名(Data Name) の見た目が似てて、混乱しやすいな。

違いはな、書く場所とドット(.)の有無で見分けるんだ。

まず段落名は 手続き部(PROCEDURE DIVISION) に書く
で、最後にピリオド(.)を付ける

ドット一個で意味が変わるわけだ。

な)あれ?ピリオドなんすか、ドットなんすか?

係)COBOLの世界では、正式には「ピリオド (period)」って呼ぶのが正解だ。

な)えードットじゃないんですかー、なるおドットコムとかどうですか?

係)常に404だろうなって、いいんだよそんなことは。

日本語では「ドット」でも通じるし、みんなそう言うけどな。
でも英語のCOBOL仕様書や教科書では「ピリオドで段落を終わらせる」って言い方が正式。

おむすび

な)んー部屋着はスェット、パーティは短パンみたいな感じっすかね。

係)お前を人前につれていけねーな…

まぁ、どっちで言っても通じるが、会議で「ドットが〜」とか言うと、COBOL爺たちに「ピリオドだ!」ってツッコまれるから気をつけろ。

な)何すかその、柿の種ばっかり食べてたらピーナツ残すな!って言われる感じ…

係)一切わからんわ。

係長のワンポイント

ADD も MOVE も「TO の右側が本命(更新されるほう)」だ。
ADD N-LINE-NET TO SUM-NET は「SUM-NET = SUM-NET + N-LINE-NET」の意味になる。
英語の “add A to B” は「A を B に足す」で、B が“行き先・目的地”だと覚えろ。
DECLARE-C-UPDATE. みたいな段落名は「ここから国別サマリ処理ですよ」という見出しラベルだ。
PROCEDURE DIVISION にあってピリオドで終わる名前は“段落”、それ以外はだいたいデータ名と思っておけ。

― 目次(読みシリーズ)へ戻る ―

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

この記事を書いた人

コメント

コメントする