コンテンツにスキップ
メインメニュー
メインメニュー
サイドバーに移動
非表示
案内
メインページ
最近の更新
未作成ページ
おまかせ表示
ヘルプ
MonoBook
検索
検索
ログイン
個人用ツール
ログイン
ログアウトした編集者のページ
もっと詳しく
投稿記録
トーク
「
NeoLua
」を編集中
ページ
議論
日本語
閲覧
編集
ソースを編集
履歴表示
ツール
ツール
サイドバーに移動
非表示
操作
閲覧
編集
ソースを編集
履歴表示
全般
リンク元
関連ページの更新状況
特別ページ
ページ情報
2018年8月15日 (水) 10:25時点における
imported>Administrator
による版
(
→概要
)
(
差分
)
← 古い版
|
最新版
(
差分
) |
新しい版 →
(
差分
)
警告: このページの古い版を編集しています。
公開すると、この版以降になされた変更がすべて失われます。
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。
スパム攻撃防止用のチェックです。 けっして、ここには、値の入力は
しない
でください!
'''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でfunctionを書く方法だけでなくC#で関数を追加することもできる。NeoLuaではLua標準ライブラリの「os名前空間」が未実装だったりするので、日付・時間などを扱おうと思う場合は、この方法で実装すれば綺麗に決まる。Lua側からclr名前空間を叩いて実装する方法もあるがあんまり綺麗じゃない。<source> 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版の場合だと更に簡潔明瞭。<source> 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]]
編集内容の要約:
MonoBookへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MonoBook:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の確認用の質問に回答してください (
詳細
):
1たす1は?(全角で入力してください)
キャンセル
編集の仕方
(新しいウィンドウで開きます)
本文の横幅制限を有効化/無効化