2018年1月2日火曜日

NLua

 C#で簡単なスクリプト機能が欲しかったけど、自前で作るほどじゃないし、かと言ってC#のスクリプトを作るほどじゃないし、ということで、NLuaを試してみた。NuGetで入れれるけど、最新版でも14年10月と、かなり前に更新が止まってる。

 テストコード

double coefficient;

private void Button1_Click(Object sender, EventArgs e)
{
    using (NLua.Lua lua = new NLua.Lua())
    {
        lua.RegisterFunction("TDAM", this, typeof(Form1).GetMethod("to_double_and_multiply"));

        string lua_version = lua["_VERSION"] as string;

        coefficient = 1;
        double v1 = (double)lua.DoString("return(TDAM(\"123.456\"))")[0];

        coefficient = 2;
        double v2 = (double)lua.DoString("return(TDAM(\"123.456\"))")[0];

        double sin45deg = (double)lua.DoString("return(math.sin(45 / 180.0 * math.pi))")[0];
    }
}

public double to_double_and_multiply(string value_str)
{
    double value = double.NaN;

    if (double.TryParse(value_str, out value))
    {
        value *= coefficient;
    }
    else
    {
        value = double.NaN;
    }

    return (value);
}

 結果は、lua_version="Lua 5.2"(string), v1=123.456(double), v2=246.912(double), sin45deg=0.70710(以下略)(double)という感じ。
 内部ではLua5.2が動いていて、標準ライブラリは何もしなくても読み込まれて、関数の登録もできる。

 もしかしたらAny CPUじゃ動かないかも(未確認)。

 関数は引数の型が違うと呼び出せない。戻り値は適当に処理してくれるっぽいけど、要素数1のobject配列が帰る。戻り値がない場合はnullになる。Luaの言語的には複数の戻り値を持てるが、C#ではできないっぽい。スタックとか気にせずにC#側を書けるのは便利な気もする。オーバーロードはGetMethodの引数でできるっぽい。
 もちろんC#で書いた部分はVisual Studioのデバッガで見れる。
 Luaの広域変数はlua["value_name"]みたいにして取れる。
 広域変数はDoStringとかを繰り返しても初期化されないので、前回の実行時の変数とかを持ち越したくない場合は、都度インスタンスを作る必要がある。

 関数の登録以外は結構簡単に書けそう。

0 件のコメント:

コメントを投稿