よそ様で話題に出ていたネタです。長いです。90行を越えてしまった。 いにしえのN88-BASICには、行番号が必須です。 プログラムを作っている最中は行番号の並びなんてぐちゃぐちゃになってしまう ことも多々ありますが、ある程度固まったら、例えば10番おきとかにきれいに 整列させたいという希望があります。 これ、BASICのインタプリタ環境にいるときはRENUMコマンド一発で行けますが、 Vzでコードを書いているときは、なかなか一筋縄ではいかない。なぜというに、 RENUMコマンドって、コードの中のGOTO文なんかの飛び先まで書き換えてくれる のですが、これをVzマクロでやろうとするとなかなか大変。 この大変そうなものに挑戦しようと思いました。が、ほとんど思っただけ。 きちんと仕様を考えてたらとんでもないことがいろいろ発覚したので、まず最初 はサブセットで動くもの。とはいえ、できるかどうかわからない最終的な仕様を 目指して拡張性のあるものを作るくらいなら、最終仕様のものまで一気に作って しまおうか、という気もする。 いろいろな例外条件はあるのですが、基本的な外部仕様というか、こういう入力 がこうなってくれる必要がある、という例を以下に示します。 まず変換元。 100 IF A=B THEN 130 ELSE 150 130 GOTO 200 150 GOSUB 330:END 330 REM SUBROUTINE これを変換するとこうなってほしいという変換後。 100 IF A=B THEN 110 ELSE 120 110 GOTO 200 120 GOSUB 130:END 130 REM SUBROUTINE ジャンプ先が実在する行番号は、行番号の付け替えに伴い、コードの中身も置き 換わってくれることが必須。一方で、ジャンプ先が実在しない場合は、変換例の 110行目のように、変換が発生しないようにしたい。実機でもこういう仕様だった と記憶しています。 ところで、上記で「最初はサブセット」なんてことを書きました。フルセットに しない理由は、N88-BASICの仕様では、行番号の最大値は65529。そんなに大きな 行数のプログラムを作ったことがないので知りませんでした。が、なかなか微妙 な値です。とはいえ、もし簡単にこの値を使ったコードが実現できるのならば、 一気に作りたい。 さて、ここまでは事前の仕様検討で気がついた点です。 ここから実際のマクロを作りながら仕様を検討したら、次々と問題点が発覚。 まずは行番号の上限値。 たとえば、仮にサブセットとして上限値は32700でもいいのですが、処理を始める 前に上限を突破するかを確認し、もし突破するようならメインルーチンに入る前 に中止したい。これは初期値と増分と論理行数がわかれば計算できそう。 ただ、条件判定で気になるのが、仮に増分を1000番刻みの場合、行番号が32000の 次は33000になるわけですが、素直に作ると、なんとなく比較が破綻しそうな値。 ここはサブセットならではの制限をかける必要がありそう。 あるいはフルセットにするか。 また、BASICとして正当ではない行がある場合。 この場合、このファイルはN88-BASICのコードではないという理由で変換開始前に 処理停止。要は、途中まで変換して、そこでやめた、ということは回避したい。 この正当性の要件ですが、とりあえず思いつくものとしては、行番号で始まって いない論理行。空行がある場合も、これは行番号が付されていないわけですから 当然処理中止。また、行頭は数字でも、数字の並びのあとが半角空白かタブでは ない場合、つまり数字のあとに英字や記号がくっついている場合も処理中止。 ということで、私の考えたマクロのラフスケッチが以下のとおり。 初期設定 増分はハードコーディング 初期値は、開いているファイル自体の最初の行の行頭から取得 ファイル正常性確認 初期値、増分、論理行数から上限チェック 全ての行の行頭が数値であることのチェック メインループ 終了処理 ここでいくつか質問。 まず、論理行の要件チェック。 ループまわして各行チェック、というのはわかります。 そして、1文字ごとに cd で見ていくのが確実ですが、そうではない、なんか楽 な方法はないものか、と。 そして、行番号の上限チェック。 初期値の取得はカーソルをファイル先頭に移動させて &n ですが、論理行数って カーソルをファイル末尾に移動して ln というのが常套手段でしょうかね。 そして、モロモロ掛け算とか足し算とかで、さて上限値を超えたときのチェック はどうすればよいでしょうか。 さらに、将来的なフルセットの場合、行番号の初期値は40000だった、というもの にも対応させたいわけですが、これって &n では対応できませんよね。ならどう すればよいか、ということについてもアイディアをお伺いできればと思います。
関連記事一覧ツリー (▼ を押すとツリー全体を一括表示します)
返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)
- 以下のフォームから自分の投稿記事を修正・削除することができます -