🧩今日の学び
・STRINGは“材料列挙”、INTOは“入れ物指定”、END-STRINGが“締め”という構造を理解
・パンチカード時代の列位置文化が、現代のインデント自由度に影響している事実を知る
・迷ったら「材料 → INTO → END-STRING」の流儀で読むと混乱しない
今日のコード
WRITE-DETAIL-LINE.
STRING
"DATE=" DELIMITED BY SIZE F-ORDER-DATE-A DELIMITED BY SIZE
" ID=" DELIMITED BY SIZE F-ORDER-ID-A DELIMITED BY SIZE
" SKU=" DELIMITED BY SIZE F-SKU-A DELIMITED BY SIZE
" QTY=" DELIMITED BY SIZE F-QUANTITY-A DELIMITED BY SIZE
" UNIT=" DELIMITED BY SIZE F-UNIT-PRICE-A DELIMITED BY SIZE
" TAXR=" DELIMITED BY SIZE F-TAX-RATE-A DELIMITED BY SIZE
" CTY=" DELIMITED BY SIZE F-COUNTRY-A(1:2) DELIMITED BY SIZE
" GROSS=" DELIMITED BY SIZE
INTO OUT-REC
END-STRING
WRITE OUT-REC.
STRINGとINTO:途中で出てくる理由は“締め”だから
なるお)そういや INTO っていきなりでてきてもいいんですか?STRING中なのに。
係長)「STRING の中に突然 INTO が出てくる」
確かに見た目はびっくりする。
けどこれ、COBOLの構文的にはちゃんとした“文の終点”なんだ。
構文の流れをざっくり読むと
STRING
“文字列A” DELIMITED BY SIZE
変数B DELIMITED BY SIZE
“文字列C” DELIMITED BY SIZE
INTO OUT-REC
END-STRING
となるわけだが、これは人間の言葉に直すと
「文字列Aと変数Bと文字列Cを、順番にくっつけて、OUT-REC に入れろ」
ということだな。
なんで途中で出てくるのかっていうと、COBOLは「段落単位」で読むように設計されてるからだ。
STRINGの内部は “部品の列挙”
INTOは “結果の格納場所”
END-STRINGで “命令の終わり”
つまり、INTO は内部じゃなくて「最後の締め」なんだよ。
いきなり出てきたように見えるけど、構文的にはちゃんと外枠の一部。
インデント問題:COBOL文明開化はまだ途中
な)えー締めなら締めらしくインデント変えたほうがいいのでは?
地球の果ぐらいまでにおいておくとか。見果てぬ夢を追いかけるとか。追いかけて追いかけてLOVEとか。
係)お前、愛という言葉が似合ってないくせに使いたがるよな。
でもな、実はそれ、COBOLの長年の宿命でもあるんだ。
今のお前の感覚は、まっとう。正しい。
けど、COBOLの世界では「インデント」という概念がまだ“文明開化”途中みたいなもんなんだよ。
パンチカード時代の列番号:COBOLが怒りっぽい理由
COBOLってな、今みたいな自由なコード配置じゃなくて、昔は「列番号で意味が決まってた」。
例えばこんなふうにだ。
| 列 | 意味 |
|---|---|
| 1〜6 | 行番号(カード時代の名残) |
| 7 | 継続とかコメントの印 |
| 8〜11 | Division/Section/Paragraph名とか |
| 12〜72 | 命令文(ここが本体) |
| 73〜80 | コメント・予備エリア |
つまり「インデントで読みやすく」なんて時代は、パンチカードを穴あけてた頃は存在しなかった。
ズレたら機械が読まない世界だからな。
だから、現代でもインデントを自由につける人もいれば、全部12列目から書く職人気質な人もいる。
STRINGのところも、本当は
STRING
"DATE=" DELIMITED BY SIZE
F-ORDER-DATE-A DELIMITED BY SIZE
...
INTO OUT-REC
END-STRING
みたいにインデントしても問題ない。
ただし古い人に見せると「お前TAB使ったな?読めねーだろ!」って怒られるぞ、
おむすび
な)なんでそんなすぐ怒るんすか…?
俺よりなんでこいつの牛丼のほうが先に出てくるんだよ!
って、俺に向けて言ってきた人ぐらい短気じゃないです!?
係)よっぽど憎たらしい顔して食ってたんだろ。
な)どういうこと!?
係)実際憎たらしい顔してるしな。
な)だからどういうこと!?
あ!愛憎ってことっすね!
憎たらしいけど愛くるしいと。ま、愛くるしい体型ですし、そうなんですよねー。
… って、こっち見て!聞いて!話ししてってー!
係長のワンポイント
STRING は“部品の列挙”、INTO は“結果の入れ物”、END-STRING が“締め”だ。
INTO が途中に見えるのは、STRING 内部が「材料列挙」で、INTO だけ外枠の構文だから。
COBOL の文字列処理は“どこに入れるか”を最後に書く流儀で統一されている。
インデントは人間の都合で、COBOL は列位置と構文だけを信じる生き物だ。
迷ったら「材料は STRING、入れ物は INTO、終わりは END-STRING」だけ覚えとけ。

コメント