トップページ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
0232デフォルトの名無しさん2011/06/11(土) 21:10:20.97
>>229
>>231
出来るよ。

int call_lua_function(lua_State *L) {
if( lua_gettop(L)>=1 && lua_type(L,-1) == LUA_TFUNCTION ) {
lua_pcall(L, 0, LUA_MULTRET, 0);
}
return 0;
}
int call_c_function(lua_State *L) {
void (*pCFunction)();
if( lua_gettop(L)>=1 && lua_type(L,-1) == LUA_TLIGHTUSERDATA ) {
pCFunction = (void(*)()) lua_topointer(L,-1);
pCFunction();
}
return 0;
}
void HelloWorld() { printf("Hello C Function!\n"); }
int get_c_function(lua_State *L) {
lua_pushlightuserdata(L, (void*)&HelloWorld);
return 1;
}

-- test.lua
call_lua_function( function() print("Hello Lua Function") end )
call_c_function(get_c_function())
0233デフォルトの名無しさん2011/06/11(土) 22:56:20.56
ちょっと興味を持って見てるんだけど、呼び出しとか引数渡しとかすんげーめんどくさいね。
普通に引数で呼び出すにはラップ関数書かないといけないのかな。

UWSCみたいなスクリプトの関数を呼び出す方法とかもちょっとまだ分からないし。
0234デフォルトの名無しさん2011/06/12(日) 00:03:33.30
AngelScript|Д`)ジー 

あー、でもC++側からスクリプトの関数呼び出す時はそんなに手間変わらんか。
0235デフォルトの名無しさん2011/06/12(日) 00:15:46.88
Easy things should be easy and hard things should be possible
という言葉があるが
可能であることの評価が低すぎる
効率が良いことしか評価されなくなってるのかな
0236デフォルトの名無しさん2011/06/12(日) 00:33:28.55
>>233
luabindというものがあってだな・・・
  lua_State *L = luaL_newstate();
  luaL_openlibs(L);
  open(L);
  {
    luaL_dostring(L,"function func1() print('hello') end" "\n");
    call_function<void>(L, "func1");

    luaL_dostring(L,"function func2(a,b) return a + b end" "\n");
    int a = 10, b = 20;
    cout << "a + b = " << call_function<int>(L, "func2", a, b) << endl;

    luaL_dostring(L,"function func3() return {1,2,3,['X']='XXX'} end" "\n");
    object tbl = call_function<object>(L, "func3");
    for( luabind::iterator i(tbl),end; i!=end; ++i ) {
      cout << i.key() << " is " << *i << endl;
    }
    luaL_dostring(L, "function dump_table(t) for k,v in pairs(t) do print(k .. ' is ' .. v) end end" "\n");
    call_function<void>(L, "dump_table", tbl);
  }
  lua_close(L);
0237デフォルトの名無しさん2011/06/12(日) 00:47:55.33
>>232
ありがとうございます
luaの関数を取っておいて後でpushfunctionみたいなことってできますでしょうか
0238デフォルトの名無しさん2011/06/12(日) 02:47:35.68
273です
topointerで取得したアドレスをlua_pushlightuserdataでスタックに積んで
LUA_TFUNCTIONに書き換えれば呼べたけど、たぶんまずいんだろうな
0239デフォルトの名無しさん2011/06/12(日) 02:55:39.46
それはスタックから消えてたらおだぶつやね

lua の場合はそういうときは関数をレジストリになげこんでおいて、
C側ではそれのキーを保持しておくのが定石

ただし、整数値のキーは lua が内部的に使っていて衝突の可能性が
あるので、普通は C側のポインタ値を lightuserdata としてキーにする。

静的変数のポインタか、lua の値を C側でとっておくための動的オブジェクトの
ポインタとかをキーにするのが一般的やね。



0240デフォルトの名無しさん2011/06/12(日) 03:21:18.85
>>239
LUA_REGISTRYINDEXですね!ありがとうございました
0241デフォルトの名無しさん2011/06/12(日) 17:49:02.77
Luaでクラスのインスタンスが連想テーブルだから変数名をtableってしたら
結構作ってから標準のtable関数が消えてることに気づいた…
なんでLuaの関数こんな簡単に死んでしまうん?…orz
0242デフォルトの名無しさん2011/06/12(日) 19:51:15.00
標準識別子の書き換えはLuaの便利なところでもありアホなところでもあるな
0243デフォルトの名無しさん2011/06/12(日) 21:43:09.59
pythonでも起こる、というか動的言語だとよくある
関数が変数に突っ込める以上仕方ないのかもしれん
0244デフォルトの名無しさん2011/06/12(日) 21:59:36.69
いや、予約語とすればいい

だけど、自由を制限しないためにチェックしてないんだろう。
0245デフォルトの名無しさん2011/06/12(日) 22:30:52.66
高級言語なのに単項、二項計算とかテーブル操作とかの演算子が少ないのがなぁ。

リスト操作をもっと簡単にしたいんだけど、metatableを全てのテーブルに強制的に束縛させる方法とかないかな?
0246デフォルトの名無しさん2011/06/12(日) 22:32:28.78
それつきつめていくとだいたい squirrel になるよw
0247デフォルトの名無しさん2011/06/13(月) 00:03:37.06
Luaからシェア奪えそうな組み込みスクリプト出てこないかな
0248デフォルトの名無しさん2011/06/13(月) 00:42:56.86
実績が大事よ
0249デフォルトの名無しさん2011/06/13(月) 02:16:42.39
squirrel最強!!
オヌヌメ解説本
http://tatsu-zine.com/books/squirrel/pages/interview1
squirrel関連の資料がほぼ皆無な現状で1,000円(税込)は安いと思いました
著者は5年くらい、都内のゲームデベロッパーにいてずっとゲームを作っておられた凄腕
わずか4、5歳の頃よりファミコンのマリオやドラクエを嗜んでおられたそうな
0250デフォルトの名無しさん2011/06/13(月) 02:28:21.51
目次みるとマニュアル以上のことがかかれてるように見えない件
0251デフォルトの名無しさん2011/06/13(月) 03:16:57.39
マニュアル読めない人向けなんだろ
0252デフォルトの名無しさん2011/06/13(月) 05:09:27.82
ページサンプルに「公式ドキュメントの翻訳ベースでわかりやすくした内容です」って書いてある
3.0非対応だし、確かに安いけど、ぶっちゃけいま買う理由はないんでないの
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)

みたいに定義できる、という仕掛け。
■ このスレッドは過去ログ倉庫に格納されています