|
秀丸マクロは基本
・通常の数値型
・文字列型
・数値だけの配列(っぽい何か)
・文字列だけの配列(っぽい何か)
なので、
「配列自体」ではなく、「配列の要素」を取得したり設定したりするのをgetVarやsetVarと同レベルでのネイティブ実装しておくのはありかも。
(getVarやsetVarに準ずる程度の速度があれば十分な気がします)
getVarやsetVarに対応する、
```
// 秀丸マクロ上のとある配列の要素を取得
function getArrayVarItem( arrayvar_name: string, index: number): string | number | null
// 秀丸マクロ上のとある配列の要素へ代入
function setArrayVarItem( arrayvar_name: string, index: number, value: string|number): bool
```
// ---------------- 使用例 -----------------------
jsmode "WebView2";
$sdata[0] = "あいう";
$sdata[1] = "かきく";
$sdata[2] = "あいう";
$sdata[3] = "かきく";
$sdata[4] = "あいう";
$sdata[5] = "かきく";
$sdata[6] = "あいう";
$sdata[7] = "かきく";
$sdata[8] = "かきく";
$sdata[9] = "END番兵"; // 番兵
$sdata[10] = "これはなし";
#ndata[0] = 100;
#ndata[1] = 20;
#ndata[2] = 0;
#ndata[3] = 1000;
#ndata[4] = 99;
#ndata[5] = -99999; // 番兵変わり
js {
// 秀丸マクロのとある配列の要素を取得する(JavaScriptで仮実装したもの)
function getArrayVarItem(arrayvar_name, index) {
let typesimbol = arrayvar_name[0];
evalMacro(typesimbol + "_GETARRVARITEM_ = " + arrayvar_name + "[" + index + "]");
return getVar(typesimbol + "_GETARRVARITEM_");
}
// 秀丸マクロのとある配列の要素へ代入する(JavaScriptで仮実装したもの)
function setArrayVarItem(arrayvar_name, index, value) {
let typesimbol = arrayvar_name[0];
evalMacro(arrayvar_name + "[" + index + "] = " + JSON.stringify(value));
}
debuginfo(2);
//----------------------------------------------
console.log("マクロ→JSの配列構築パターン1");
let sarr1 = Array.from({length:9}, (_,i)=>getArrayVarItem("$sdata", i)); // 長さ「9」を自分でマニュアルで管理。マクロ部分との追従を忘れる怖さは残るが...
console.log(JSON.stringify(sarr1));
let narr1 = Array.from({length:5}, (_,i)=>getArrayVarItem("#ndata", i)); // 長さ「5」を自分でマニュアルで管理。マクロ部分との追従を忘れる怖さは残るが...
console.log(JSON.stringify(narr1));
//----------------------------------------------
console.log("マクロ→JSの配列構築パターン2"); // 番兵などを使うならこれか。
let sarr2 = [];
for (let i = 0; i < 100; i++) { // 十分すぎる長さ(万が一番兵が抜けている場合にそなえて、無限ループにはしない)
let item = getArrayVarItem("$sdata", i);
if (item == "END番兵") { break; }
sarr2.push(item);
}
console.log(JSON.stringify(sarr2));
let narr2 = [];
for (let i = 0; i < 100; i++) { // 十分すぎる長さ(万が一番兵が抜けている場合にそなえて、無限ループにはしない)
let item = getArrayVarItem("#ndata", i);
if (item == -99999) { break; }
narr2.push(item);
}
console.log(JSON.stringify(narr2));
//----------------------------------------------
console.log("JS→マクロへの配列代入");
setArrayVarItem("$sdata", 100, "たちづ");
setArrayVarItem("#ndata", 50, 200);
}
message($sdata[100]);
message(str(#ndata[50]));
// ---------------------------------------------
ECMAScript側が現代では結構強烈なので、粒が小さい橋渡しを用意しておくだけでも
let arr = Array.from({length:5}, (_,i)=>getArrayVarItem("#ndata", i))
みたいに、結構グっと拾い上げることができるっていうかなんていうか。
初心者でも普通にforで書いて配列へと仕立てるのは難しくないでしょうし。
|
|