「秀丸マクロ」と「hmLoadCLR」の、リスト(テーブル)との値のやり取り

  • 概要

    「秀丸マクロ」と「hmLoadCLR」とで、リストやタプルの情報へとアクセスする関数を確かめてみましょう。

    #MNG = loaddll( hidemarudir + "\\hmLoadCLR.dll" );
    
    #_ = dllfuncw(#MNG, "DoString", R"MNG(
    ary = {1, 2, 3}
    ary2 = { table.unpack(ary) }    -- aryと全く同じものの複製
    array_len = #ary2
    )MNG"
    );
    
    #target = dllfuncw(#MNG, "GetNumItemOfList", "ary2", 2);  // ary2[2]を数値として取得ということ
    
    message(str(#target));
    
    #_ = dllfuncw(#MNG, "SetStrItemOfList", "ary2", 2, "abc");  // ary2[2] = "abc"ということ
    
    #_ = dllfuncw(#MNG, "DoString", "array_len = #ary2"); // ary2の配列の長さをarray_len変数に代入
    #ary2len = dllfuncw(#MNG, "GetNumVar", "array_len");  // それを秀丸マクロ空間へと取得
    
    message("以下配列の中身を順々に表示");
    ##i = 1; // Luaの配列は1からスタート
    while(##i <= #ary2len ) {
      $$elem = dllfuncstrw(#MNG, "GetStrItemOfList", "ary2", ##i);
      message($$elem);
      ##i = ##i + 1;
    }
    
    freedll( #MNG );
    

    整数での添え字が可能なことの意味

    テーブル本体ではなく、テーブルにくっ付けてあるメタテーブルにも対象となります。

    次のようなマクロや関数の使い方も問題なく成立します。

    #MNG = loaddll( hidemarudir + "\\" + "hmLoadCLR.dll" );
    
    #_ = dllfuncw(#MNG, "DoString", R"MNG(
    
    aaa = {a = 3, b = 5, c = 8}
    setmetatable(aaa, { __index = { d = 1000, e = 3000 } } )
    
    )MNG"
    );
    
    ##elem = dllfuncw(#MNG, "GetNumItemOfDict", "aaa", "e"); // aaa.e を数値として取得
    
    message(str(##elem));
    
    freedll( #MNG );