前回、Teraterm Macroの小技を紹介したけども、
Teraterm Macroって、結構誰でも気軽に使えるだけあって触ったことある人多いけど
あまり整理した書き方できる人って見ないなーと思ったので纏めてみる。
基本、マクロのリファレンスを見てもコマンド単位でしか書いてないから、
どーやって表現すればいいのかわからないって人も多いはず。
1.TeraTerm Macroの性質を整理する
捉えどころとしては、以下がポイントかなーと思う。
- 基本、上から下に流れて処理される。(SubとかFunctionの定義の概念がない。)
- 変数は、全部グローバル変数的な感覚になる。
- 各TTLコマンドでは、かなり共通したシステム変数が使われているので判定とかで使いたい時はすぐにオリジナルの変数に入れ替えとく必要がある。
<label> 行から始まるサブルーチンをコールする。
サブルーチンを抜け、メインルーチンへ戻る。
マクロの実行そのものを終了する。
":" とその直後に続くラベル名からなる。
goto <label>
ラベルへジャンプする。
3.関数っぽく動かす例①
適当に「SUB_TEST1」っていうラベルで関数を作る場合の例で考えると。
呼び出しはこう。
call SUB_TEST1
で、呼び出される定義側がこう。
end ; ■メインルーチン処理ここまで、以下はcall呼び出し専用ブロック :SUB_TEST1 ; なんらかの処理・・・ごにょごにょ。 return :SUB_TEST2 ; なんらかの処理・・・ごにょごにょパート2。 return
この例でいうと、呼び出されるブロックの先頭にendを記述してこのブロック自体はマクロファイルの一番最後の部分にまとめて記載しておくイメージ。
間違って呼び出し関数部分のラベルにgotoで飛ぶとreturnで失敗してエラーがでます。
4.関数っぽく動かす例②
ファイルの最後にぜーんぶの関数をまとめるってなるとマクロのシナリオが長くなりすぎてスクロールが長くなった時に読むのがつらくなってしまう場合も多々ある。
さっきの呼び出される定義側の記述をメインルーチンの中に埋め込むとしたら、こう書く。
; メインルーチン処理・・・ goto SKIP_SUB_TEST1 :SUB_TEST1 ; なんらかの処理ごにょごにょ。 return :SKIP_SUB_TEST1 ; 続きのメインルーチン処理・・・ goto SKIP_SUB_TEST2 :SUB_TEST2 ; なんらかの処理ごにょごにょ・・・パート2 return :SKIP_SUB_TEST2
よーするに、callで呼び出される以外のタイミングでは実行されなければ良いのだからgotoとラベルで囲んで、強制読み飛ばしゾーンを作ってからその中に関数用のラベルとreturnを設置すればよいのです。
5.関数っぽく書く時の注意点
処理ブロックとしては、上記の書きっぷりでまとめれば再利用性を持たせた処理も多少書けるようになる訳ですが、これで再利用しようと思ったら注意が必要なのが引数と戻り値の概念がないというところですね。
ローカル変数の概念がなく、グローバル変数的な扱いで固定の変数名で条件と結果のやり取りをする訳ですから、再利用した際にはそれぞれの変数も使いまわされて値が更新されてしまう訳です。
resultとか、inputstrみたいなシステム変数をそのまま受け渡しに使おうなんてもっての外ですよ。
予期せぬ挙動の原因になるので変数による値渡しを上手に考えて関数っぽく組み上げて行きましょうね。
以下もTeraTerm Macro記事でえ。参考にどうぞー。