「NeoLua」を編集中
この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
1行目: | 1行目: | ||
− | # | + | '''NeoLua'''とは、[[オープンソース]]の下で[[開発]]されている[[.NET Framework]]向けの「ピュア」な[[Lua]]実装である。 |
+ | |||
+ | == 概要 == | ||
+ | [[.NET Framework]]向けの[[Lua]]実装は多数存在するが、それらは本家Luaの[[DLL]]を[[P/Invoke]]で呼び出すものが多い。これらは[[C言語]]で書かれた環境依存しまくりの[[ネイティブコード]]を呼び出している関係で[[Xamarin]]環境や[[Linux]]上の[[Mono]]環境では動かないことが多い。 | ||
+ | |||
+ | 一方、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」を追加しろ。 ← これ重要(ダイナミック版を使う場合のみ必須) | ||
+ | |||
+ | === ハロワ === | ||
+ | まずは定番の[[ハロワ]]。NeoLuaには2種類の実行環境がある。頭の固い人向けの静的版と、ユルユルな人向けのダイナミック版である。CreateEnvironmentメソッドの戻り値の型を、「var」(型推論)にすると静的版に、「dynamic」にするとダイナミック版になる。ダイナミック版は[[インテリセンス]]が効かない諸刃の剣であるが、ある程度慣れると圧倒的にこちらの方が便利かつ簡潔明瞭である。ちなみにダイナミック版のdochunkは小文字だぞ。 | ||
+ | |||
+ | こういう書き方もできる。 | ||
+ | 「clr」で標準の名前空間にもアクセスできる。 | ||
+ | <source lang="csharp"> | ||
+ | using (var lua = new Lua()) | ||
+ | { | ||
+ | dynamic g = lua.CreateEnvironment(); | ||
+ | g.dochunk(@" | ||
+ | s = 'hello world'; | ||
+ | clr.System.Console.WriteLine(s); | ||
+ | "); | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | dynamic変数を使わない方法だとSetMemberValue()だのCallMember()などのメソッドを使う。 | ||
+ | この場合のDoChunkは[[パスカル記法]]だ。 | ||
+ | ついでにまったく関係ないことだがLuaでの文字列連結は「..」だ。 | ||
+ | <source lang="csharp"> | ||
+ | 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()); | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | === C#で関数を追加する === | ||
+ | NeoLuaではLuaで関数を書く方法だけでなくC#で関数を追加することもできる。NeoLuaではLua標準ライブラリの「os名前空間」が未実装だったりするので、日付・時間などを扱おうと思う場合は、この方法で実装すれば綺麗に決まる。Lua側からclr名前空間を叩いて実装する方法もあるがあんまり綺麗じゃない。<source lang="csharp"> | ||
+ | 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); | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | ちなみにdynamic版の場合だと更に簡潔明瞭。C#のFunc<>メソッドをそのままブチ込める。<source lang="csharp"> | ||
+ | using (var lua = new Lua()) | ||
+ | { | ||
+ | var env = lua.CreateEnvironment(); | ||
+ | |||
+ | // C#で書かれたadd関数を追加 | ||
+ | env.add = new Func<int,int,int>((a,b) => a+b); | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | === C#でクラスを追加する === | ||
+ | 前述のC#で関数を追加する方法と同じ要領でクラスも追加できる。<syntaxhighlight lang="csharp"> | ||
+ | class MainClass | ||
+ | { | ||
+ | public static void Main(string[] args) | ||
+ | { | ||
+ | using (var lua = new Lua()) | ||
+ | { | ||
+ | var env = lua.CreateEnvironment(); | ||
+ | |||
+ | // C#で書かれたfooオブジェクトを追加 | ||
+ | env.Add("foo", new Foo()); | ||
+ | |||
+ | // Lua側から呼び出してみる | ||
+ | var ret = env.DoChunk(@"return foo:ticks()", "main.lua"); | ||
+ | Console.WriteLine(ret); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class Foo | ||
+ | { | ||
+ | public long ticks() | ||
+ | { | ||
+ | return DateTime.Now.Ticks; | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == 外部リンク == | ||
+ | * https://neolua.codeplex.com | ||
+ | * https://github.com/neolithos/neolua | ||
+ | |||
+ | == 参考文献 == | ||
+ | {{reflist}} | ||
+ | |||
+ | {{stub}} | ||
+ | |||
+ | [[category: Lua]] | ||
+ | [[category: NeoLua]] |