テストコード
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 件のコメント:
コメントを投稿