トップページtech
981コメント297KB

【Lua】組み込み系言語総合 その4【Squirrel】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2011/03/30(水) 01:00:58.93
LuaやSquirrelやAngelScriptなどアプリケーションへの組み込み用途で
使われるプログラミング言語についてのスレッドです
まとめwiki(なにか質問する前に必ずみること!)
http://wikiwiki.jp/lua/

その他の参考URLは>2から

■前スレ
【Lua】組み込み系言語総合 その3【Squirrel】
http://hibari.2ch.net/test/read.cgi/tech/1272643397/

■過去スレ
その2 http://pc12.2ch.net/test/read.cgi/tech/1243210301/
その1 http://pc12.2ch.net/test/read.cgi/tech/1205208141/

プログラミング言語 Lua
その3 http://pc11.2ch.net/test/read.cgi/tech/1160799232/
その2 http://pc8.2ch.net/test/read.cgi/tech/1063711237/
その1 http://pc5.2ch.net/tech/kako/1034/10341/1034182349.html
0253デフォルトの名無しさん2011/06/13(月) 07:08:32.27
>>247
LuaもSquirrelも数千行の短いプログラムでできてんだろ?
なら俺達でも作れるんじゃね?
0254デフォルトの名無しさん2011/06/13(月) 07:24:09.21
採用実績と速度を超えるのが至難
0255デフォルトの名無しさん2011/06/13(月) 07:25:55.86
このレベルか・・・
0256見習い中2011/06/13(月) 12:15:07.57
Luaの注意点

数値はDouble型。型指定は基本的にできない。ポインタ型を32ビット変数として使う方法がある。
Doubleのせいで計算速度が遅くなるだけでなく、キャストで化けることあり。
SciTEの読みはサイト(らしい)。ゼロの使い魔か?
エラーの際のlua_atpanicにはお世話になりそう。
日本語未対応。対応バージョンもなくもない。

C言語と相互運用が可能だが、なんかしょっぱなからめんどくさい。
Lua側はシンプルなので、間違ってはいないのかも。

squirrel との比較
クラスがなく、冗長な記述になる。
C++との親和性が低い
continue がない。やっぱり必要?
ビット演算 が弱い。あれ?ライブラリは・・

>>214
> Squirrelの前にはLuaとかもあって、海外とかだとわりと積極的に使われていたのではないでしょうか。
> 汎用的なものと組み込み言語というのはメジャーになってきた、というような雰囲気ですね。
>
> Squirrelの場合、クラスベースの考え方が通用する分、僕はやさしいなと感じます。
> Luaとかはわりとかけ離れているというか、かけ離れているとまでは言わないですが、単純に見た目としての問題って言うんですかね、
> ある程度プログラミングのたしなみのある人が見えればやってることは理解できるんですけども、
> ほんとにSquirrelの方が分かりやすいなっていう感じがします。
> PythonやRubyも文法とか文化が違う感じが若干しますね。

なるほど
0257デフォルトの名無しさん2011/06/13(月) 14:14:43.26
   ∧_∧  / ̄ ̄ ̄ ̄
  ( ・∀・) <  Lua!!
⊂/  9)  \____
q(   /
  >  >

0258デフォルトの名無しさん2011/06/13(月) 16:59:30.65
最低でもCの組み込み型位は標準対応してほしいよね
0259デフォルトの名無しさん2011/06/13(月) 18:18:08.35
グルーコード作りたいだけなのにtolua++とか覚えて時間とられるのは本末転倒だな・・・
0260デフォルトの名無しさん2011/06/13(月) 22:31:47.51
ビット演算ならbitopで
http://bitop.luajit.org/

PerlのMoose(Coat)ぽいOOなら、lua-Coatで
http://lua-coat.luaforge.net/
lua-Coatは、MOP使ってて重いので
LuaJIT使える環境ならそっちがいいかも
0261デフォルトの名無しさん2011/06/13(月) 22:48:06.58
>>256

>数値はDouble型。型指定は基本的にできない。ポインタ型を32ビット変数として使う方法がある。
数値型はdouble以外にも割り当てられなかったっけ?

>Doubleのせいで計算速度が遅くなるだけでなく
そもそも計算速度が問題になるほど大量の四則演算を行う処理を
luaで書くの?そういう所はアルゴリズムを固定小数点化やSSEで
対応等するべきであってスクリプト言語でどうこうする所じゃないような。
0262デフォルトの名無しさん2011/06/13(月) 23:02:15.51
今時Doubleなんて、x86ならバカっ速いぞ。
下手にテーブル引いてキャッシュミスしてもたもたするより速い。
0263デフォルトの名無しさん2011/06/13(月) 23:02:38.60
数値型は、コンパイル時に選択だね。
http://www.lua.org/source/5.1/luaconf.h.html#LUA_NUMBER
@@ LUA_NUMBER is the type of numbers in Lua.
0264デフォルトの名無しさん2011/06/13(月) 23:12:55.06
x86ならdouble使った整数演算も速いね
http://attractivechaos.github.com/plb/
これ以上速度求めるなら、逆に型推論がある静的型評価の言語を組み込んだ方がいいかも?
0265デフォルトの名無しさん2011/06/13(月) 23:23:38.60
っていうか整数持ってるSquirrelさんより速いしなあ
0266デフォルトの名無しさん2011/06/13(月) 23:32:15.38
つーかIEEE754っていって?ってやつは浮動小数禁止
0267デフォルトの名無しさん2011/06/14(火) 09:11:12.44
         \   l´⌒\⌒\ \\ \
           \ ヽ   )  )   \\ \\   
              (   \ \∩___∩ \\ 
           \   \  ⌒⌒| ノ      ヽ  \\      
              \ \   /  ●   ● ト、\ \\\ 
               \  Y |    ( _●_)  ミ\  \\\  
               \ / 彡、_  |∪| ノ   \  \\\
                 (____)―ヽノ' ヽ      ̄ ̄ ヽ\\
                                \,  j  l l .l }
                         Lua!   l (_ノノノノ

0268デフォルトの名無しさん2011/06/14(火) 22:38:55.38
AngelScript|Д`)ノ<きたわよ
0269デフォルトの名無しさん2011/06/15(水) 07:51:02.77
        (´\r-、     ┼         +     /`/`)    +
     ┼   (\. \!              *     // ,/)  *
  +     * (ヽ、   \ +  *          /   /)   +
      ⊂ニ      )        *   +  (     ニ⊃
  *  +  ⊂、     (   ∩___∩   ノ     ⊃   +  *
         (/(/   ヽ  | ノ     ヽ /    、)ヽ)  ┼
    +        (/     ∨  ●   ●レ /⌒) 、)ヽ)
     *       (/'   |   ( _●_) ミ'  /、)、)´       +
         +    (/'ヽ 彡、   |∪| ノ /     AngelScript!!
     +            / __ヽノ  /  *      +
       ┼        (___) /      +
0270見習い中2011/06/15(水) 10:38:14.65
普段UWSC使ってるんだけどバイナリデータが弱かったからつなぎ言語もかねて探してたんです。
だから日本語扱えないのと整数値型がそろってないのはかなり痛い。

Luaも日本語化パッチがあったりするけど・・・
ビット演算があったりするけど・・・
セットアップがめんどくさいと配布がしにくいし

squirrel もいいなと思ったけどC++解説サイト見たら「なんか出来そうだな」と思ってみたり。
そうするとAngelScriptってC++にかなり近いから無駄にならないかも?

AngelScriptってGNUでソース配布?まさかプロジェクト全部に感染?


squirrel で日本語
ttp://monsho.blog63.fc2.com/blog-entry-49.html
squirrel はASCIIなので、日本語対応はUNICODE宣言が必要。
#define _UNICODE

それだけではwprintf() や vwprintf() で文字化けするので、ロケールを指定する。2007/05/19(土)
setlocale( LC_ALL, "Japanese" ); // 日本語にする
setlocale( LC_ALL, "" ); // 環境に合わせる


@__john_ 悟
Luaはダメだ。 AngelScriptを試してみよう…   これでダメだったら、機能を絞るしかないわな…
4月30日 webから

@__john_ 悟
AngelScriptではとりあえず実装可能っぽいけど… 呼び出しコストとかどうなんだろ? GC処理がLuaより管理しやすい分早いかな? 
試すしかないかなぁ… はぁ… 資料少ないなぁ。
5月1日 webから
0271デフォルトの名無しさん2011/06/15(水) 12:22:38.06
AS1.7.0以降はzlib互換ライセンスにchange!したyow
0272デフォルトの名無しさん2011/06/15(水) 14:43:23.05
   /ヽ /ヽ
  ':' ゙''"  `':,
  ミ   ・ω・ ;,
 :; . っ Lua!, つ
  `:;      ,;'
   `( /'"`∪
0273デフォルトの名無しさん2011/06/15(水) 22:32:32.50
AngelScriptはデフォでASCII、UTF8に対応。
有志のShiftJIS版も一応ある。
ただし、UTF16には対応してないので注意。
0274デフォルトの名無しさん2011/06/15(水) 23:02:22.61
Luaのメタテーブルの__callが微妙だなぁ…。
第一引数がテーブル自身で第二引数以降が呼び出しの時の引数だけど、
テーブル(引数)だけじゃなくてテーブル.メソッド(引数)で呼び出したときにも使えるようにならないものか…。
メソッドまでメタテーブル指定するのは面倒くさい。
0275デフォルトの名無しさん2011/06/16(木) 00:34:27.57
__indexに関数入れて仕事を振ればいいだけのように読めるけど
0276デフォルトの名無しさん2011/06/16(木) 07:04:19.72
まぁそれでいいんだけど__callの使い方が(テーブル,メソッド名,引数1...n)
だと勘違いしてプログラミングしてたからメソッド名が無いって気づいてげんなりして
メソッド名なかったから、使い道あるのかなこれと思って。
0277デフォルトの名無しさん2011/06/16(木) 10:41:59.96
__callはほぼユーザーデータ用と割り切った方がいいんじゃない?
関数がファーストクラスでクロージャやコルーチンがあるLuaの範囲じゃ
確かに使いどころが思いつかない
0278デフォルトの名無しさん2011/06/16(木) 11:24:53.98
       //
     /  /   パカッ
     //⌒)∩__∩
    /.| .| ノ     ヽ
    / | |  ●   ● |     
   /  | 彡  ( _●_) ミ Lua!!
   /  | ヽ  |∪|  /_
  // │   ヽノ  \/
  " ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ

0279デフォルトの名無しさん2011/06/16(木) 19:21:04.60
__callはC++でいうところの()演算子だと思ってる。
0280デフォルトの名無しさん2011/06/18(土) 19:37:04.89
Lua、自由度が高いからいろいろやろうと思うけど、ちょっと進めて後戻りばかりだなぁ…。
他の言語みたいにこういう関数や記法でやれって堅苦しく決まってる奴は面倒くさくてもしぶしぶ従うけど、
標準モジュールが何もないLuaだとテーブル操作も関数にしようか、メタテーブルにしようか、
変数名はどうしようか、クラスは使うか使わないかとかそんなことばかり考えて
修正ばかりで全然先進まない…orz
自分の開発設計技術が無さ過ぎるのが問題っていうのはわかってるけど。
0281デフォルトの名無しさん2011/06/18(土) 21:49:44.42
Luaとオブジェクト指向
http://www.hakkaku.net/articles/20081118-286
> このように、Lua のオブジェクト指向は、その実現方法が様々です。
> Lua のユーザーズ Wiki を確認すると、オブジェクト指向の実現方法がいくつか列挙されています。
> 好きな方法を利用してオブジェクト指向を実践すると良いでしょう。

重いしC++と互換性がないけどLua-CoatかわいいよLua-Coat
http://perldoc.perlassociation.org/pod/Moose-Doc-JA/index.html
ManualとCookbook
0282デフォルトの名無しさん2011/06/19(日) 00:15:39.15
オブジェクト指向 = GCを使うがクロージャを使わない、
と考えると結局どう見てもユーザーデータ用としか思えない
0283デフォルトの名無しさん2011/06/19(日) 09:35:43.66
       //
     /  /   パカッ
     //⌒)∩__∩
    /.| .| ノ     ヽ
    / | |  ●   ● |     
   /  | 彡  ( _●_) ミ Lua!!
   /  | ヽ  |∪|  /_
  // │   ヽノ  \/
  " ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ

0284デフォルトの名無しさん2011/06/19(日) 10:16:53.06
Luaみたいにオブジェクトの要素のpublic,private指定ができないと不安になる
継承されて整合性が破壊されないかとかメソッドをnilにされたらどうしようとか気になってしょうがない
0285デフォルトの名無しさん2011/06/19(日) 10:39:13.08
そもそもLuaは重厚長大なライブラリを作るための言語じゃないんじゃね。
そういうもの作るんならprivateも必要になるんだろうけど。

その上に乗っかりそれの動作をカスタマイズ(設定orコールバックで)
するための言語だと思う。
0286デフォルトの名無しさん2011/06/19(日) 11:51:17.36
lua_Stateってシングルトン的に使うもんなの?
0287デフォルトの名無しさん2011/06/19(日) 15:46:01.40
複数作れば同時に動かせたとおもったけど
0288デフォルトの名無しさん2011/06/19(日) 17:46:32.65
難しそうでスルーしてたけど環境ってめがっさ便利っぽいな
オブジェクトのメンバ関数のようにLuaコードを呼びたい時とかに重宝しそう
0289デフォルトの名無しさん2011/06/19(日) 17:56:47.42
そう、知れば知るほど味があるのがLua。
その他のは・・・・
自分の得意な言語に似せようとするだけのオナニー型といわざるをえない。
0290デフォルトの名無しさん2011/06/19(日) 19:47:59.72
Lua、混乱させられる機能ばかりだから、
単一代入の組み込み言語が欲しくなってきた。
そのほうがデバッグもしやすいし。
0291デフォルトの名無しさん2011/06/19(日) 21:26:55.87
こうしてまたひとつひとつ
泡沫のようにオナニー言語が生まれては消えてゆくのであった
ああ無常・・・
0292デフォルトの名無しさん2011/06/19(日) 22:46:25.86
でも宣言されてない変数はnilを返すってねぇー。
リテラルがあっちゃデバッグしづらくてしょうがねぇよ。普通エラーでしょ。
0293デフォルトの名無しさん2011/06/19(日) 22:56:42.49
Luaはそれをエラーに出来るできるのがいいところだよね
0294デフォルトの名無しさん2011/06/19(日) 23:04:31.44
機能拡張は他のとこで作業するときに困るけど、機能制限の方向なら悩むことなくさくさくやってしまえばいいよね
0295デフォルトの名無しさん2011/06/20(月) 00:50:07.12
>>293
それってどうやるの?
0296デフォルトの名無しさん2011/06/20(月) 01:32:54.16
strict.lua
0297デフォルトの名無しさん2011/06/20(月) 09:20:51.28
           ∩_
           〈〈〈 ヽ
          〈⊃  }
   ∩___∩  |   |
   | ノ      ヽ !   !
  /  ●   ● |  /
  |    ( _●_)  ミ/ Lua!!
 彡、   |∪|  /
/ __  ヽノ /
(___)   
0298デフォルトの名無しさん2011/06/20(月) 16:33:43.20
LuaSJIS対応版以外の本家のって、リテラルでSJIS使えませんよね?
いちいちWideCharToMultiByteをラップしたのを経由してユーザー変数に入るとか
しないといけないのはメンドイ。
0299デフォルトの名無しさん2011/06/20(月) 16:36:29.38

[[文字列]]
と書けばSJISリテラルも使えるのか。
ごめん
0300デフォルトの名無しさん2011/06/20(月) 17:52:46.75
スタックの指定した位置にあるオブジェクトが
getfieldでアクセスできる要素がnilを含めて存在するオブジェクト
であるかどうかを調べるスマートな方法はある?
再帰的にテーブルかどうか、__indexを持ってるかどうかを繰り返し調べるしかないかな
0301デフォルトの名無しさん2011/06/20(月) 17:58:27.94
用途を書いた方が良いかも
その方がスマートな解答がでそう
0302デフォルトの名無しさん2011/06/20(月) 21:41:56.73
Lua、テーブルがしょぼ過ぎるから拡張したくてオブジェクトにして色々な操作メソッドつけ足したら
メソッド作らないとipairsとかでテーブルの中身が呼び出されないことに気がついた。
何この使えん言語。
0303デフォルトの名無しさん2011/06/20(月) 21:53:14.11
Luaは必要最低限のグルー関数を用意して、あとはなるべくスクリプト内で完結させるような用途に向いてると思う。
0304デフォルトの名無しさん2011/06/20(月) 23:24:50.41
>>296
ありがとう。
古いバージョン使ってるから、そういうのあるの知らなかった。
0305デフォルトの名無しさん2011/06/21(火) 06:05:04.30
>>300
エスパーするとpcall

>>302
内包したんでしょ?
言語の問題ではない
0306デフォルトの名無しさん2011/06/21(火) 08:11:00.31
   ∧_∧  / ̄ ̄ ̄ ̄
  ( ・∀・) <  Lua!!
⊂/  9)  \____
q(   /
  >  >

0307デフォルトの名無しさん2011/06/21(火) 10:46:26.14
lua_State *p1 = lua_open();
lua_State *p2 = lua_open();

p1のスタックからテーブルを取り出してp2のスタックに積むにはどうすれば?
数値や文字列は一回Cを経由すればできるんだけどテーブルは…
0308デフォルトの名無しさん2011/06/21(火) 11:13:13.10
>>307
フィールドが数値型や文字列型なら列挙していけば良いだろうけど
関数型あたりは無理だよね

そもそもlua_Stateを分離する必要があるのかってところから見直した方が良いんじゃない?
スクリプト毎にサンドボックス作りたいってだけならそれぞれ独自の環境を割り当てて
共有したいLuaオブジェクトはグローバル環境やレジストリに押し込めるってので過不足ないと思うけど
0309デフォルトの名無しさん2011/06/21(火) 12:28:40.23
>>307
数値や文字列でもLuaの値はメタテーブルを持てるので
Lua側のデータを共有したいなら
lua_State *p = lua_open();
lua_State *p1 = lua_newthread(p);
lua_State *p2 = lua_newthread(p);
でやるしかないよ
0310 忍法帖【Lv=8,xxxP】 2011/06/21(火) 13:15:51.75
なぜポインタを共有するんですか
コピーコンストラクタのようなものは何か根本的に駄目なんですか
0311デフォルトの名無しさん2011/06/21(火) 18:47:24.32
lua_Stateをひとつ、lua_newthread()を複数で最初に設計して
loadstring()がグローバル変数見に行くんで詰んだ経験ががが。
0312デフォルトの名無しさん2011/06/21(火) 20:02:15.49
結局のところシングルトンでおkってことね
0313デフォルトの名無しさん2011/06/21(火) 20:10:25.76
lua_State(threadは除く)を複数使うなんて、スクリプトの並列処理が必要で
かつスクリプト間でLuaオブジェクトのやり取りが必要無いって状況くらしか思いつかないな
0314デフォルトの名無しさん2011/06/21(火) 20:52:19.74
相互に参照したいオブジェクトだけホストに管理させてMutexで保護すればいんじゃないの
0315デフォルトの名無しさん2011/06/21(火) 21:59:27.82
>>313
ゲーム作る時に、敵1匹ごとに仮想マシン1個って感じでやるときかなぁ…
Luaだとそういう場合どうするんだろう。
0316デフォルトの名無しさん2011/06/21(火) 22:20:12.07
ねえよww
0317デフォルトの名無しさん2011/06/21(火) 22:53:31.64
ボードゲームみたいなのでAIごとにスクリプト使う場合とかあるだろ
0318デフォルトの名無しさん2011/06/21(火) 23:06:15.77
マルチスレッドに対応させるとかか。具体的に方法思いつかんけど
0319デフォルトの名無しさん2011/06/22(水) 01:10:29.57
>315
さすがにオーバーキル過ぎるだろ。
ロボットの並列制御やってるんじゃないんだから。
0320デフォルトの名無しさん2011/06/22(水) 01:51:00.20
>>312
なんか違和感がある
lua_Stateは複数作れるからシングルトンじゃないと思うけど
どういう意味でシングルトンと言ってるの?
0321デフォルトの名無しさん2011/06/22(水) 07:31:24.17
>>311
使い方間違ってるんじゃない?
lua_newthreadはコルーチンなので
問題の起きようがないと思うのだが。
0322デフォルトの名無しさん2011/06/22(水) 07:36:23.92
>>315
いくつかの動的確保とopenlibsやゲームAPIなどの各種初期化、解放時にはガベコレ
生成破棄が多いゲームでオブジェクトと1対1はどうかとおもう
lua_Stateは共有して環境テーブルをオブジェクトにもたせるのがいいと思うよ
0323デフォルトの名無しさん2011/06/22(水) 09:37:58.69
敵=すぐ死ぬMOBみたいに決め付けてないかい
4人格闘ゲーのCPUとかかもよ
0324デフォルトの名無しさん2011/06/22(水) 11:08:27.41
ところでDLLじゃなくてEXEからモジュールを提供したい場合ってどうするの?
loadedとかいろいろあるけど全部自前でやらんとだめなのかな
0325デフォルトの名無しさん2011/06/22(水) 12:19:05.47
DLLでやれ
異論は認めるが自前の意見がないなら異論もなにもない
0326デフォルトの名無しさん2011/06/22(水) 12:24:12.50
>>324
hogeというモジュールなら
LUALIB_API int luaopen_hoge(luaState *L) {...}
という形で提供するのがお約束なので
単純にluaopen_hoge(L);すればいいよ
プリプロセスでLUALIB_APIがどのように置き換わるかは
ご自分で確認しましょう
0327デフォルトの名無しさん2011/06/22(水) 12:52:33.09
>>324
>require calls the loader with a single argument, modname.
とあるから
lua_pushcfunction lua_pushstring lua_pcallするべき
0328デフォルトの名無しさん2011/06/22(水) 13:22:22.73
そのほうが行儀いいね
0329デフォルトの名無しさん2011/06/23(木) 07:47:19.78
         \   l´⌒\⌒\ \\ \
           \ ヽ   )  )   \\ \\   
              (   \ \∩___∩ \\ 
           \   \  ⌒⌒| ノ      ヽ  \\      
              \ \   /  ●   ● ト、\ \\\ 
               \  Y |    ( _●_)  ミ\  \\\  
               \ / 彡、_  |∪| ノ   \  \\\
                 (____)―ヽノ' ヽ      ̄ ̄ ヽ\\
                                \,  j  l l .l }
                         Lua!   l (_ノノノノ

0330デフォルトの名無しさん2011/06/25(土) 08:39:57.67
Yコンビネーションって何者なんですか?
0331デフォルトの名無しさん2011/06/25(土) 08:51:11.14
Yコンビネータ?

このスレより関数型言語スレの話題だと思うけど、

fact(x) = ... fact(x - 1) ...

みたいな感じで、再帰がある関数は、自分自身の定義の中に自分自身を使うわけだよね?
で、数学的に厳密な「定義」が必要な場合とか、循環定義は困るので、

fact_norec(f)(x) = ... f(x - 1) ...

みたいにして、

Y(fun) = fun(Y(fun))
(↑この定義ではここで循環定義を使っちゃってるけど、λ計算という理論では
循環定義のないものを定義できる。)
という「Yコンビネータ」を使って、

fact(x) = Y(fact_norec)

みたいに定義できる、という仕掛け。
0332デフォルトの名無しさん2011/06/25(土) 08:52:46.54
ウィキペディアだとここにある
http://ja.wikipedia.org/wiki/%E4%B8%8D%E5%8B%95%E7%82%B9%E3%82%B3%E3%83%B3%E3%83%93%E3%83%8D%E3%83%BC%E3%82%BF
0333デフォルトの名無しさん2011/06/25(土) 15:41:33.28
循環なんて難しい言葉を使わなくても
まだ無いものは使えない、既に有るものは使える、でいいんだが
数学厨は (宗教的な理由で) 時間の概念を認めないんだよね
0334デフォルトの名無しさん2011/06/25(土) 19:29:39.23
時間も(半)順序の一種。
認めるも認めないも無いだろ。
0335デフォルトの名無しさん2011/06/25(土) 21:57:57.69
>>331
どうもありがとう
なんだかよくわからなかった
0336デフォルトの名無しさん2011/06/25(土) 23:13:16.65
>>333 には偏見のために何かよく分からないものが見えているようなのだが、
何がどう見えているのかよく分からない。
0337デフォルトの名無しさん2011/06/26(日) 01:10:15.69
そういやLuaのスクリプト内のローカル変数とかってどこに保存されてる?
0338デフォルトの名無しさん2011/06/26(日) 01:32:57.00
宣言された関数の専用スロット
0339デフォルトの名無しさん2011/06/26(日) 13:08:39.45
Luaでクラスの継承で
Object1にindex,newindex,addなど複数のメタテーブルをセットして
Object2はObject1を継承してさらに複数のメタテーブルをセットしたいのですが、
setmetatableやオブジェクトをオーバーライドなど色々やってみましたが、
Object2はセットしたメタテーブルしか呼び出せません。
どうすればObject1も継承できるでしょうか?

0340デフォルトの名無しさん2011/06/26(日) 13:31:25.50
new_hoge = function(base)
local b_ = base
local t_ = {}

setmetatable(t_ , { __index = base } )

local o_ = {}

setmetatable(o_, { __index = setmetatable() } )
0341デフォルトの名無しさん2011/06/26(日) 13:34:24.14
変なとこで送信しちゃった
例えば__indexだけだったら↓みたいな感じでいいとおもう

new_hoge = function(base)
local o_ = {}
setmetatable(o_, { __index = setmetatable({ }, { __index = base }) } )
return o_
end


0342デフォルトの名無しさん2011/06/26(日) 14:31:31.14
>>339
メタテーブルを入れ子にすればいいだけじゃない?
mt = { oldmt = getmetatable(Object1) or {} }
for k,_ in pairs(mt.oldmt) do
mt[k] = mt.oldmt[k]
end
setmetatable(Object1,mt)

破棄するなら
mt.__index = function(self,k) ... end
super呼ぶなら
mt.index = function(self,k)
...
return mt.oldmt.__index and mt.oldmt.__index(self,k) or nil
end
とかで適当に上書き
0343デフォルトの名無しさん2011/06/26(日) 14:34:23.12
__metatable = falseの入ってるクラスを継承するにはどうすれば
0344デフォルトの名無しさん2011/06/26(日) 14:38:06.18
>>343
debug.getmetatableやC関数を介せばいけるけど普通はやらない
0345デフォルトの名無しさん2011/06/26(日) 15:58:37.11
>>341-342
テーブルの値にメタテーブルを指定すればいいんですね。
メタテーブルのことあまり理解していませんでした。
ありがとうございます。
0346デフォルトの名無しさん2011/06/27(月) 07:54:43.92
       //
     /  /   パカッ
     //⌒)∩__∩
    /.| .| ノ     ヽ
    / | |  ●   ● |     
   /  | 彡  ( _●_) ミ Lua!!
   /  | ヽ  |∪|  /_
  // │   ヽノ  \/
  " ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ

0347デフォルトの名無しさん2011/06/27(月) 20:30:12.75
create = function()
local x = 0
local get = function()
return x
end
local inc = function()
x = x + 1
end
return { get = get, inc = inc }
end

obj = create()

obj.inc()
print(obj.get())

こういうふうに書いたほうが安全でよくね?
なんでみんな本やWebで推奨されてる方法を使うのか解らない
0348デフォルトの名無しさん2011/06/27(月) 22:11:58.91
安全に拘るならそもそもスクリプトを使うべきじゃないってことなんじゃないかな
0349デフォルトの名無しさん2011/06/27(月) 22:31:54.81
>>347
それだと、インスタンスごとに関数を作ることになる
0350デフォルトの名無しさん2011/06/27(月) 22:33:46.95
そもそも結論を急ぐ必要がないから
どの方法が普及するかは自然の成り行きに任せればいいんじゃないの
0351デフォルトの名無しさん2011/06/27(月) 22:58:35.96
AngelScript|Д`)ノ<グローバルプロパティ?が何か面白いぞ

_this.Hoge();

とかできる
0352デフォルトの名無しさん2011/06/28(火) 00:06:51.29
ASは3倍早くなってから出直してきてください
■ このスレッドは過去ログ倉庫に格納されています