NeoLua
NeoLuaとは、オープンソースの下で開発されている.NET Framework向けのLua実装である。
目次
概要
.NET Framework向けのLua実装は多数存在するが、それらは本家LuaのDLLをP/Invokeで呼び出すものが多い。
一方、NeoLuaは.NET向けに移植されたCLRでのピュア実装となっている。 つまりIronPythonなどと同じ系列である。 表向きの名前はNeoLuaであるが、内部的な名前空間は「Neo.IronLua」となっており、やはり「Iron〜」である。 NeoLuaはPortable Class Library(PCL)環境でも何も考えずに一発で動くように作られている点がポイント高い。Xamarin系、MonoGame系では大活躍である。
NeoLuaは「純正Lua」ではなく「Lua互換品」となるためNeoLuaの公式サイトでも「100%の互換性はない」としている。互換性に問題があるようであればNLuaあたりを使ったほうがいいかもしれないが、NeoLuaの方が積極的にメンテナンスされており活況ではある。
使い方
インストール
- NuGetからNeoLuaを入れろ。
- 参照に「Microsoft.CSharp」を追加しろ。 ← これ重要
ハロワ
まずは定番のハロワ。dynamic変数にしておくとLua内のオブジェクトに直接手出しすることができる。インテリセンスが効かない諸刃の剣でもある。 dochunkは小文字だぞ。
using (var lua = new Lua())
{
dynamic g = lua.CreateEnvironment();
g.dochunk("s = 'hello world';","test");
Console.WriteLine(g.s);
}
こういう書き方もできる。 「clr」で標準の名前空間にもアクセスできる。
using (var lua = new Lua())
{
dynamic g = lua.CreateEnvironment();
g.dochunk(@"
s = 'hello world';
clr.System.Console.WriteLine(s);
");
}
dynamic変数を使わない方法だとSetMemberValue()だのCallMember()などのメソッドを使う。 この場合のDoChunkはパスカル記法だ。 ついでにまったく関係ないことだがLuaでの文字列連結は「..」だ。
using (var lua = new Lua())
{
var env = lua.CreateEnvironment();
env.DoChunk(@"
name = 'foo';
function Hello()
return 'hello ' .. name;
end
","test.lua");
var ret1 = env.CallMember("Hello");
Console.WriteLine(ret1.ToString());
env.SetMemberValue("name", "bar");
var ret2 = env.CallMember("Hello");
Console.WriteLine(ret2.ToString());
}
C#で関数を追加する
Luaでfunctionを書く方法だけでなく、C#で関数を追加することもできる。
using (var lua = new Lua())
{
var env = lua.CreateEnvironment();
// C#で書かれたadd関数を追加
env.Add("add", new Func<int,int,int>((a,b) => a+b));
// Lua側から呼び出してみる
var ret = env.DoChunk(@"return add(1,2)", "main.lua");
Console.WriteLine(ret);
}
dynamic版の場合だと更に簡潔明瞭。
using (var lua = new Lua())
{
var env = lua.CreateEnvironment();
// C#で書かれたadd関数を追加
env.add = new Func<int,int,int>((a,b) => a+b);
}