【COBOL 読み1-20-2】愛憎とINTOとインデントと

🧩今日の学び
・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〜11Division/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」だけ覚えとけ。

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

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

この記事を書いた人

コメント

コメントする