途中で終了。
ここで Dex 実装(Dex_T)における行処理の仕様を確定させておくことにした。
確定仕様
次行への移行は Dex::bl_T 個体の Ctn() で自身を指す指示体を返すか,指示体を通して現在行変数に特殊文字列(現在は仮に"&&skip;"
)を設定した場合のみとし,それ以外は原則として現在行を維持する。
経緯
これまで,とにかく動くことを優先させて不明確な部分だったが,流石にそれで保守性を維持するのは難しい規模になっていた。
10日の開発でデラング不具合修正から Dex 設計見直し,記法実装へと移行してきたが,これも仕様の方向性を決めるためだった。一昨日の開発のリスト記法実装途中で,ある程度こうあって欲しいという仕様が見えてきて,昨日の開発で入ったのが「Dex 改良」だ。
これまでのデラングの不具合で多かったのが部区切り替えに失敗することだが,これも行処理の仕様が曖昧だったことが大きな原因としてある。
単純に入力を行毎に読み込み,それを部区個体のスタックで処理していくという実装だったため,「現在行が勝手に進んでしまう」という問題があった。これへの対応を部区実装毎にやろうとすると複雑化してしまう。
意図
そこで,新しい部区や上位部区への移行時には現在行を維持し,同一部区での処理を継続する場合にのみ行を進めることにした。部区移行時にも明示的に次行に進める手段として,現在行を特殊文字列に置換する方法を使う。これは部分的に実装して好感触を得ていたため,部区毎ではなく共通処理化する。
bgn() と Ctn(),Ctn() と end() の間でも現在行を維持することにした。後者は従来通りだが,前者では次行に進んでしまっていたため,混乱することがあった。これは少し悩んだが,bgn() と Ctn() は共通処理が多くなるため,この仕様の方が単純化する場面が多いだろうと判断した。
要するに,特定条件でなければ現在行が動かないようにすることで挙動を把握しやすくする,というのが本仕様の意図だ。
課題
本仕様で概ね問題ないと思われるが,しいて言えば,各部区個体の Ctn() 実装を厳密にしないと,容易に無限循環に陥いる。これまでのように行処理が勝手に進んで勝手に終わってくれないためだ。
ただ,無意味な循環を検知するような対策は難しくないので,大きな問題ではないだろう。