インデント

インデックスに戻る][ホームに戻る][掲示板にジャンプ][メールを送る]

 現在ロードされているプログラムのリストの左端のスペースの数を調整し,適当な字下げをする為のユーティリティです。

特長 & 機能:
・行番号による範囲の指定が可能 
・範囲内の全部の行を自動的に字下げすることができる。 
・ラベル以外は最低5段字下げする。 
・ループやブロックIF文の開始行は前の行より2段字下げし,次の行を更に2段字下げする。 
・ループやブロックIF文の終了行は前の行より2段字下げを戻し,次の行を更に2段字下げを戻す。 
・ブロックIF文中の else 及び else if 行は前の行より2段字下げを戻し,次の行は前の行と同じにする。 
・ループがかなり複雑なマルチステートメントになっていても正しく字下げを行う(例外は注意の項を参照)

ソース

使用方法: 
a.現在ロードされているプログラムに【インデント】をマージする。 
b.コマンドモードで goto *D[,[<開始行>][-][<終了行>]] を入力する。 
c.終わり

詳細説明:
[a.]で既にマージされていれば不要 
[b.]で goto *D のみ入力した時は最後に行った範囲について行う。 (一番最初で範囲の指定を行わないときはすべての行について行う) 
[,]のみを付加したときは[-59999]として扱う。 (私の場合,60000 以降はユ−ティリティエリアと決めているため) 
[開始行],[終了行]は共に省略可能である。 ([list]などと同じ)

注意:
・このプログラムには "パラメータ" の様に "ー" を変数名に使用していますが,普通のBASICでは入力できませんので このプログラムを入力する前に poke@ $A,$1E35,$81:poke@ $A,$1E49,$81 を 実行しておいて下さい。 
これは全角の記号やかなを変数名やラベルに使用できるようにするおまじないです。 
・MZ-2800用のおまじないは残念ながら知りませんので他の文字に変更してください。 
・option base 0 で使って下さい 
・ステートメントと他の文字を区別するために option list lcase で使って下さい。 
・文字定数内のステートメントと同じ文字列もステートメントとして扱われます。 (ただし,コメント文と data 文の後ろのステートメントは無視します。) 
・従ってステートメントと同じ文字列を使いたいときは大文字か全角文字を使用してください。
・このプログラムは100%BASICで書かれているので変数名の変更だけでMZ-2800でも動くと思います。 
・外部メモリの増設をしていない場合は下の様に変更してください。
・一回毎に"EMM:"を[init]しているので必要ならば下のように変更して下さい。

・字下げできない例 
 data 文の後にプログラムが有る場合 
 ループ用ステートメント以外で始まり, ループを閉じるステートメントの後にループを開くステートメントのある場合 
 文字定数内にループ関係のステートメントがある場合

できない例1)
10 data 1:restore 10
20 data 2:for I=0 to 5
30 data 3:read A(I)
40 data 4:next I
50 data 5:return

というプログラムを

10 data 1:restore 10
20   data 2:for I=0 to 4
30     data 3:read A(I)
40   data 4:next I
50 data 5:return
とでもするのか?
(・_・):んなプログラムを書くやつが悪い

できない例2)
20   while 1
30     B=1
40       C=1:wend:while 1
50     D=1
60   wend
70 E=1
20 行の while と 60 行の wend が対応している訳ではない。
(・_・):んなプログラムを書くやつが悪い

できない例3)
10 A=1
20   print "while"
30 A=1
20 行のために段付けされている
(・_・):コメント内にコマンドと同じ単語をいれんといてくで〜!
こういう時は"While"にすればOK

できる例
1)(開いてから閉じる時)
10 A=1
20   while 1
30     B=1
40       C=1:while 1:wend
50     D=1
60   wend
70 E=1
20 行の while と 60 行の wend 及び 40 の while と wend は対応している。
またマルチステートメントになっていてもその行にループがあることが分かる。

できる例2)(ループから始まっている時)
10 A=1
20   while 1
30     B=1:C=1
40   wend:while 1
50     D=1
60   wend
70 E=1
20行の while と 40 行の wend 及び 40 の while と 60 行の wend は対応している。

使用目的:
・プログラムの整理 
・ループの対応に関するデバッグ

備考:
私の場合,行番号 61000 以降に置いているので goto 61000,-100 でも使用可能。 行番号によるジャンプ行の指定は使用していないので自由なところにマージ可能。

最初の1回目はファイルが無いのでエラーがでます。 そのときは goto 61120 を入力して下さい。

EMM:を破壊したくない時 
61110 kill "EMM:字下げ前データ 
61112 kill "EMM:字下げ後データ

EMM:が実装されていない時 
61110 kill "FD1:字下げ前データ 
61112 kill "FD1:字下げ後データ 
61560 print "list ";CHR$(34);"FD1:段付け前データ";CHR$(34);範囲$;CHR$(5) 
61620 open "i",#1,"FD1:字下げ前データ 
61630 open "o",#2,"FD1:字下げ後データ 
62320 merge "FD1:字下げ後データ

解説: 
・MZ-2500の最大の特長は while-wend,repeat-until,ブロックIF文をサポートしていることである。
・ところがこれらのステートメントを使用するには字下げが不可欠である。 
というのもMZ-2000用のHu-BASIC V2.0を手にしたときにはこれらはあっても使う気にならなかったからである。 
 即ち for-next ならばループ変数によって必ず対応が付くがwhile-wend,repeat-untilでは対応が分かりにくい。 
 それなら if goto によって飛ばしたほうが分かりやすい。 
 字下げをするのは面倒である。 
 字下げをするとただでさえ少ないフリーエリアがますます少なくなる。 
など不利な点がたくさんあったからである。 
・しかしMZ-2500では広大なテキストエリアがあり,しかも段付けをしてもフリーエリアが減らない。 
・while-wend,repeat-until はともかくブロックIF文は非常に便利であるので使いたい。 
そこで自動的に字下げをするユーティリティを作りました。 

・このおかげで適当にループを開いてプログラムを書いていき字下げ処理後に対応したループを閉じるステートメントを書くといったいいかげんなプログラムの作りかたが可能になりました。 (滝汗
・私の場合基本的ストーリを考えただけでいきなりモニタに向かう方なので,これは大変助かるようになりました。 
・またプログラムが見易くなったために今までできなかった大きなプログラムも簡単に作成できるようになりました。 
・字下げの量に関してはいろいろ流儀があるようですが、ループ開始行で2段,ループ内でさらに2段字下げするようにしたのは,
 ループ内のみ字下げするとリストが堅い感じがする。 
 ループ用ステートメントが目立つ 
 マルチステートメントによりループが完結しているときに,『ここにループがあるよ』と下の様に教えてくれる。 
等の特長があるからです。
またラベル以外を最低5文字字下げするのは、ループの閉じるステートメントが1っ個多くなった時、字下げ量が1文字となり、対応が取れていないのがよく分かるからです。
例)
10 *ループの記載ミス例 
50      A=1
50      B=1
50      C=1
50      D=1
60        for I=1 to 10:A(I)=0:next  
70      C=1
80   next
90 D=1 
のようにラベルでない普通の行の字下げが少なくなっていればどこかがおかしいというのが瞬間的に分かります。


他機種への移植:
字下げのスペースにより貴重なプログラムエリアが圧迫されるようなカス言語への移植はやめておいた方が良いでしょう。
構造化プログラムの書けないカス言語への移植もやめておいた方が身のためでしょう。
コマンド/ステートメントも変数も全て大文字または小文字になってしまうようなカス言語への移植もやめておいた方が良いでしょう。

(・_・):ほな何やってら、移植できんねん。
(^_^):まず無いやろなぁ。

インデックスに戻る][ホームに戻る][掲示板にジャンプ][メールを送る]