🧩今日の学び
・NEXT-RECは処理の意味を持たず、GO TOを成立させるためだけに生まれる“足場”である
・GO TOを選ぶと、制御の後始末・安全確認・説明責任まで人間が背負うことになる
なるお)係長?
GO TOのコードの例示内にNEXT-REC.って最期にふと出てきてますけど、これってなんでですの?
間違っちゃいました?ついに間違っちゃいました?
係)なんで嬉しそうなんだよ!
しかし、いいところ突いてきたな。
もう一回コードをみてみろ。
PERFORM VARYING I FROM 1 BY 1 UNTIL I > CNT
IF STATUS(I) NOT = "OK"
GO TO NEXT-REC
END-IF
IF TYPE(I) NOT = "A"
GO TO NEXT-REC
END-IF
IF AMOUNT(I) <= 0
GO TO NEXT-REC
END-IF
DISPLAY "処理する:" I
NEXT-REC.
END-PERFORM
結論から言うぞ。
このコード構造なら、NEXT-REC. は「GO TOを使うためだけに必要」なラベルだ。
逆に言うと、GO TOを使わないなら、NEXT-REC. 自体が不要だぞ。
なぜ NEXT-REC. が必要なのか
GO TOは必ず「飛び先のラベル」が必要- そのラベルが
NEXT-REC.となる。
ちなみに、NEXT-REC.はPARAGRAPHラベルだ。
- 単なる「目印」
- 処理は何もしない
GO TOの着地点
な)え!?なんもしない???
無能社員!?給料泥棒!?憧れの眼差し!?
係)お前と同種だな。
な)ええ!?
係)その前に憧れんなよ!
このNEXT-REC.はな
PERFORMの中にある
ループの外では使えない
構造としてはその場しのぎのジャンプ先
ということになる。
だから、GO TOを使う限り、NEXT-REC.は絶対に消せないんだ。
じゃあ消したらどうなる?
コードではGO TOの行き先が書かれているのに
GO TO NEXT-REC
行き先である
NEXT-REC.
がなくなるため、行き先不明でコンパイルエラーという未来になる。
つまり、「GO TOを使うことを選んだ瞬間、NEXT-REC.は必要」になる。
GO TO NEXT-REC
↓
NEXT-REC.
でもな、EXIT PERFORM CYCLEを使えば、そもそも要らないんだよ。
IF STATUS(I) NOT = "OK"
EXIT PERFORM CYCLE
END-IF
まとめるぞ。
NEXT-REC.はGO TOが生んだ“足場”となる。
構造として意味はない
読み手にとってはノイズ
書いた理由は「GO TOしたいから」
な)GO TOで飛ぶんだったらこういうことも考えないとならないってことっすね…ふむむ。
係)そう。GO TOを使うなら「考えること」が増える。
つまり、GO TOで飛ぶってことは、「自分で流れの後始末を全部考えろ」ってことだ。
それじゃ、何を考えなきゃいけないかということだが、GO TOを使うと発生する“追加タスク”がこうなる。
1 飛び先を作る
NEXT-REC.みたいなラベルが必要
2 そのラベルが安全な位置か確認
変数は壊れてないか
PERFORMの中か外か
3 飛んだ後の制御を想像
次の文?
次の周回?
それとも別の段落?
4 後から条件が増えた時の整理
ラベル増殖
GO TO連鎖
5 読む人への説明責任
「なぜここに飛ぶのか」を
コメントや命名で補う必要
GO TOは言語がやるべき仕事を人間に丸投げする命令だってことだ。
ただな、インラインPERFORMの中にラベル書くというのは、コンパイラによっては通るが、構造としては怪しい。
だから余計に「GO TOを選んだ時点で無理が出る」ってことになるわけだな。
おむすび
係)…なんか今日は静かに聞いてたな。また変なことでも妄想してたんじゃないのか?
な)へ?俺にだって考えることぐらいありますよ!
係)そ、それは悪かった…
な)たこ焼き食いたいんで、どこの銀だこが近いか考えてたんですよ!
係)俺は何に謝罪したんだよ…
係長のワンポイント
NEXT-REC. は処理ではなく、GO TO のためだけに作られた足場だ。
GO TO を書いた瞬間、「飛び先を用意する責任」が発生する。
それが安全な位置か、PERFORM の内か外かまで考えさせられるのが本質的な地獄だ。
EXIT PERFORM CYCLE なら、その判断と後始末を言語が引き受けてくれる。
GO TO は処理を短くするが、考えることを確実に増やす。

コメント