ネタ: マクロ強化No.08631
IKKI さん 15/06/19 01:23
 
秀丸担当さん、こんばんは。

ついでに (というか、こちらが本命ですが) マクロ関連のネタ出しです。

1. 文字列をマクロとして実行する機能
ex. "hoge" を挿入するマクロを生成するマクロ
 a. $x="hoge"; eval "insert $x;";
 b. $x="hoge"; eval "insert \"" + $x + "\";";
a.ができれば最高です。とはいえ、b.でも十分重宝します。
現状でも一旦ファイルに吐いて execmacro すれば可能ですが、オーバーヘッド的に
若干つらいです。

2. インクルード
ex. include macrodir + "\\library.mac";
hidesoft.4:07402 でプリプロセッサ云々の話をしましたが、プリプロセッサほど大
げさな仕組みを導入しなくても、要は include 文のコンテキストで外部ファイルを
評価すればよいので、上記 1.a ができれば include も同じ仕組みでできそうです。

3. sprintf 関数
ex. insert sprintf("%s.%03d", second, tickcount % 1000);
これがあると数値のゼロパディング処理とかずいぶん楽になります。

以上、ご検討いただければ幸いです。

[ ]
RE:08631 ネタ: マクロ強化No.08632
でるもんたいいじま さん 15/06/19 07:46
 
IKKIさん、こんにちは。でるもんた・いいじまです。

> 2. インクルード
> ex. include macrodir + "\\library.mac";
> hidesoft.4:07402 でプリプロセッサ云々の話をしましたが、プリプロセッサほど大
>
> げさな仕組みを導入しなくても、要は include 文のコンテキストで外部ファイルを
>
> 評価すればよいので、上記 1.a ができれば include も同じ仕組みでできそうです。
>

> 3. sprintf 関数
> ex. insert sprintf("%s.%03d", second, tickcount % 1000);
> これがあると数値のゼロパディング処理とかずいぶん楽になります。

私もこの2つは強く要望します。
sprintfについては、わざわざご自身で実装しなくても、FreeBSDの実装
(カーネル内部で使う整数用のものと、libcに含まれている浮動小数点数
対応のものとがあります)が修正BSDライセンスで手に入りますし、
Linuxの実装(glibc)も確かLGPLだったと思います。

Windows APIのwsprintfを使うと、たとえばsprintf("%4s","αβγδ")
あたりの解釈を秀丸の言語環境に合わせて変更することができなくなるので、
できれば秀丸のソースツリーの中にsprintfを持っておいたほうがいいと
思います。

[ ]
RE:08632 ネタ: マクロ強化No.08634
秀丸担当 さん 15/06/19 11:06
 

こちらもネタのご提供ありがとうございます。
ちなみに秀丸ファイラーClassicのスクリプトではwshの仕組みを使っていて、
JScriptやVBScriptで書けたりするので、特に気にせずevalとかもできたりしま
す。
秀丸エディタでもやると言語仕様にあまり依存せずできたりすると思いますが、
setactivehidemaruで他の秀丸エディタをまたいだ実行でおそらく問題になるこ
とと、マクロもjsもvbsもとサポートが大変になるだろうからということでやっ
ていないです。
sprintfは秀丸マクロとしてもあったら利用シーンは多いと思います。
こちらも参考にさせていただきます。

[ ]
RE:08634 ネタ: マクロ強化No.08636
IKKI さん 15/06/19 15:09
 
秀丸エディタ自体を COM サーバー化することは、仰るとおりサポートコストの点で
見通しが立たないと思います。

そこまで大げさな話ではなく、現状の秀丸マクロの仕組みの中で eval を実現するこ
とは相当困難でしょうか?
秀丸マクロがコンパイラ言語である以上、前述 1.a のような完全なクロージャを実
現することは困難だと思いますが、前述 1.b のような似非クロージャであれば、内
部的に「一旦ファイルに吐いて execmacro する」相当の動作をすればできそうな気
もします。

あるいは、もっとハードルを下げて、goto 文/call 文の引数にラベルではなく文字
列を渡せるようにすることは難しいでしょうか?
ex. call $$1;
これができればコールバック関数のようなものを扱えるようになって、eval ほど強
力ではないにせよ、今までマクロ単体では不可能だったことができるようになります。

このネタのキモは要するに、文字列とコードの垣根を突破したいということです。
急ぐ話ではないので、次バージョンに向けてじっくり考えてみていただけるとうれし
いです。

[ ]
RE:08636 ネタ: マクロ強化No.08637
秀丸担当 さん 15/06/19 16:36
 

秀丸エディタ本体でevalをするとしたら、いったんファイルに書いてexecmacro
を呼ぶ、相当であれば、おそらくそれほど難しくは無いと思います。
execmacroそのままでは変数の空間は別になるので、evalの場合は変数は
execmacroとは違って変数は維持するといいと思います。
gotoとラベルのことを考えると、eval内にラベルができたり、eval内でgotoする
のはややこしくなることが予想されます。
goto/call文のラベルを文字列変数で指定可能にすることは、難しくないと思い
ます。
最近のバージョンアップは小刻みにする方針で、やるとしたら大きなバージョン
アップではなくどこか適当なバージョンになるかもしれません。
やるときにはまた書き込みます。
それぞれ参考にさせていただきます。

[ ]
RE:08636 ネタ: マクロ強化No.08652
秀丸担当 さん 15/07/02 11:16
 

gotoやcallのラベルで文字列変数を使えるようにするのは、影響なくできると思
うので、次のβ版でしてみます。
evalやincludeについては、やはりgotoやcallでラベルが使えないと効果が薄れ
ると思うので、よく考える必要がありそうです。

[ ]
RE:08652 ネタ: マクロ強化No.08653
IKKI さん 15/07/02 14:15
 
秀丸担当さん、こんにちは。

>gotoやcallのラベルで文字列変数を使えるようにするのは、影響なくできると思
>うので、次のβ版でしてみます。
ありがとうございます。
このネタの真の狙いは、引数にラベル名を取るような組み込み文・関数を将来作れる
ようになる、という点にあります。

// 例: 文字列置換 (Javascript の replace、Ruby の gsub 相当)
$text = gsub($text, "(\\C)", "Callback"); // "ほげ" → "\x82D9\x82B0"
endmacro;
Callback:
  return "\\x" + hex(code($$1));

なので、文・関数が内部でサブルーチンを呼んで返り値を受け取れるような仕組みも
(次のβでは使わないにせよ)可能なように考えておいていただけるとありがたいで
す。
よろしくお願いいたします。

[ ]
RE:08652 ネタ: マクロ強化No.08654
IKKI さん 15/07/02 14:52
 
追加ネタです。今パッと思いついたので深くは考えてないですが…

call で別ファイルのサブルーチンを直接指定して実行できると楽しそうです。

call macrodir + "\\library.mac::Hoge";
message ##return; //=> library.mac の Hoge サブルーチンの返り値

現状でも execmacro と getresultex(-1) でできる話で、何か違いがあるかというと
 ・呼ばれる側のマクロは単にサブルーチンを並べるだけで、特別な処理が要らない
 ・数値型の引数・返り値を文字列に変換せず数値のまま扱える
ぐらいで、あまり嬉しくないかもしれません?

[ ]
RE:08654 ネタ: マクロ強化No.08655
秀丸担当 さん 15/07/02 15:43
 

>このネタの真の狙いは、引数にラベル名を取るような組み込み文・関数を将来作れる
>ようになる、という点にあります。

組み込み関数用ということでは、次の修正自体は直接的には関係は無いですが、
例にあるgsubというサブルーチンを作ることは可能になると思います。

>call で別ファイルのサブルーチンを直接指定して実行できると楽しそうです。

そういう方法もできたらいいということで、ご意見参考にさせていただきます。

[ ]