そこでマクロを作ってみました。
そこそこうまくできたのですが、不満点というか欠点として繰り返し処理(for文の中身)を一連の流れの外に書く必要があります。
もっと使いやすくしたのですが現状ではここまでが限界でした。
もっといいのがある。もっと良くできる。など意見があれば連絡ください。
マクロの説明
最初に通常KAGで私が書くときの書き方を次に、作成したマクロの使用例をいくつか書きます。
最後にマクロの中身です。
KAGでのfor文
0から9を表示するだけです。for, foreachマクロの使用例
for文1
上の例と同じく0から9を表示します。
tf.iを増やしながら*doのラベルの処理を行います。
tf.iの初期値は0です。
for文2
こちらは2から9を表示します。
startでtf.iの初期値を指定できます。
foreach文1
foreach文の例です。
この例では配列内の数値が順番に表示されます。
listに配列もしくは配列の入った変数名を指定できます
tf.elemが各要素になります。
foreach文2
scenarioフォルダ内のファイルを表示する例です。
foreach文3
bgmフォルダ内のファイル一覧から再生リストを作成する例です。
listを指定しない場合はtf.listが操作される配列になります。
そうすることでtf.listとtf.iでtf.elemのかわりをすることができます。
tf.elemで書くと面倒な場合などで利用できます。
この場合、tf.elemにそのまま置き換えるとファイル名が変数名と判断されるためにエラーになるためにこのようにしています。
(tf.elemでもエスケープシーケンスを使って文字列扱いにすれば解決できます。)
foreach文4
tf.list以外を利用したときはlistに変数名を指定します
for, foreachマクロの実装
重要な部分だけ説明します。まず、[eval exp="mp.val=Scripts.eval(mp.list)"]の行です。
KAGのマクロでは引数は文字列で渡されるようです。
そこでScripts.eval()で変数名から中身の配列への参照を得ています。
次に[call target="&mp.func"]の行です。
func引数に指定された文字列のラベルにジャンプします。
ジャンプ先の最後のreturnタグで戻ってくることを想定しています。
またKAGにおいてマクロは呼び出し元のコンテキストで実行されるようです。
すなわち、storage引数が呼び出しもとファイルと同じ物となります(forマクロと呼び出し元は異なるファイルと仮定)。
そのため、このコードでは呼び出し元と同じファイル中のラベルをfunc引数に指定する必要があります。
違うファイルのラベルを呼べるようにするにはstorage引数を追加するだけでおそらく可能です。
0 件のコメント:
コメントを投稿