|
こんにちは。ユーザーのIKKIです。
理想的にどうあるべきかという話は棚に上げて、現状でどうすればよいかというワー
クアラウンドの話をします。
そもそも、多数の変数が必要な場合、可能な限りマクロ変数を使わないことをおすす
めします。
秀丸マクロの変数は数が多くなるほどアクセスが遅くなります。
http://mobitan.org/hm/memo/130428/
↑これは9年前の測定結果ですが、いま測っても同じ傾向です。
手元の Core i5-7500T + 秀丸v9.12β2 で10000個の数値変数を定義したところ、100
00番目の変数を読んで書くのに0.13ミリ秒かかりました。
キューやスタックなどの基本的なデータ構造にマクロ変数を用いることがパフォーマ
ンス的に許容できるかどうかを実データで検証するべきです。
小さなテストデータは問題なく処理できても、実運用で大きなデータを食わせたら全
然処理が進まない、という可能性があります。
このことを踏まえて、ご質問の趣旨とは違ってしまうかもしれませんが、いくつかの
ワークアラウンドを提案します。
>1 つ目は、任意の配列変数に対してソートや 2 分探索などの基本的な操作を行った
>り、配列変数を
>キューやスタックなどの基本的なデータ構造として活用する、といった共通処理を
>行うサブルーチンの
>作成が困難になっていることです。
これは外部 DLL に頼るのが結局正解と思われます。
私が作るマクロでは、あべのりさん作 macrodll.dll を便利に使わせてもらっていま
す。ハッシュを使えば配列相当のことができます。
https://www.ms.u-tokyo.ac.jp/~abenori/soft/hidemaru/dllfunc.html
あるいは、こみやんまさん作の各種コンポーネントを使って、主な処理を他の言語で
書いてしまう手もありそうです。
http://秀丸マクロ.net/
>2 つ目は、複数の値をまとめてサブルーチンの引数や戻り値としてやり取りし辛い
>ことです。
これは文字列にエンコードしてしまうのが早いし速いです。例えばこのように。
call Hoge;
##_ = split($$a, $$return, "/");
message str(val($$a[0])) + ", " + str(val($$a[1])) + ", " + str(val($$a[2]))
+ ", " + str(val($$a[3]));
endmacro;
Hoge:
##lineno1 = 12;
##column1 = 34;
##lineno2 = 56;
##column2 = 78;
return sprintf("%i/%i/%i/%i", ##lineno1, ##column1, ##lineno2, ##column2);
以上、いずれも
> 参照渡しで操作するための記述方法を提案してもらえれば助かります。
というご質問の趣旨に反していることは承知の上で、現状で可能なワークアラウンド
を提案させていただきました。
ご参考になれば幸いです。
|
|