|
>はないということと、C++側とのやりとりというのは具体的なイメージがちょっ
>とわからず、教えていただけると助かります。
あ、たしかに、typeofがあっても、マクロの層だと総称的に出来ないですね。
(typeofがあっても、数値でも文字列でも両方でいける関数を作れないです、失礼し
ました)
C++でのやりとりが必要というのは、Hideamru_EvalMacroがあるので、
必要性が高くなる(無くても書けるがあると圧倒的にスマートになる)。
秀丸マクロ上の、変数の中身は、C++からは直接読めないので、
何らかの形で、C++で扱うためには、必ず、マクロ⇔C++の変数伝達
が必要となります。
EvalMacro(R("
// 対象が文字列なら、SetStrVarというdllの関数を使わねばならない
#_ = dllfuncw( #self, "SetStrVar", "filename", filename);
// マクロの環境変数内にある内容を、自分自身のdllに伝えて、
// 何らかの形で、filenameというなまえのハッシュなりなんなりに
// 移すことになる。
// 対象が数値なら、SetNumVarというdllの関数を使わねばならない
#_ = dllfuncw( #self, "SetNumVar", "x", x);
// 数値だとこうなる。秀丸マクロ⇒dll自分に伝達する度に、
// StrかNumかの関数の呼び分けが必要になる。
);
これをC++で関数でラップしたとして、
// AUTODYNAMICは何の型でも受け付けられるようなタイプを作成したとする
AUTODYNAMIC GetMacroVar( string var_name) {
// 連結とか記述すると煩雑なので、以下の%sにvar_nameの内容の文字列が入っ
てるものとします
// ここでtypeofがあれば、
hm.EvalMacro("
if typeof( %s ) == "string" {
// マクロ⇒dllへの文字列タイプの伝達
#_ = dllfuncw( #self, "SetStrVar", %s, %s);
} else typeof( %s ) == "number" {
// マクロ⇒dllへの数値タイプの伝達
#_ = dllfuncw( #self, "SetNumVar", %s, %s);
}
)
return AutoDynamicHash[var_name];
}
AUTODYNAMIC myfilename = GetMacroVar( "filename" );
AUTODYNAMIC cpp_xx = GetMacroVar( "$xx" );
AUTODYNAMIC cpp_date = GetMacroVar( "date" );
GetMacroVarとは別に、SetMacroVarも作成し、オブジェクトや演算子多重定義や代入
演算子などでさらに洗練させてゆくと、記述は
// C++上で、macrovarというオブジェクトは、秀丸マクロの変数アクセスオブジェク
トであるかのように利用できる。
auto myfilename = macrovar["filename"];
auto cpp_xx = macrovar["$xx"];
macrovar["$xx"] = "abc";
typeofで一番あるあるな役割がこのパターンだろうと思います。
(実際にはもっととりまわしがし易いAUTODYNAMICとか作る必要がないC#とかで実装す
ると思います)
秀丸マクロの場合ほとんどの場合は、「数値なタイプなの?」「文字列なタイプな
の?」に糾合されるので、
文字列でもそれ以外でもどちらでも(関数の)引数にできるけれども、
(関数)結果から引数が文字列だったか、そうでないか、
判別可能な関数が1つでに既存であるならば、それで概ねは代用できるかもしれませ
ん。
現行の秀丸マクロとして、「引数の型を問わない関数」が難しいようなら、実装しだ
いですが、sprintfあたりに、%tとか加えて、実現できないかな〜とか。
|
|