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

このエントリーをはてなブックマークに追加
982デフォルトの名無しさん:2009/05/22(金) 16:29:30
質問。
C からlua の関数を呼ぶ -> 呼ばれた関数は、lua 内の別の関数 A そのものを返す -> C 側でそれを保持して、必要なときに A を呼びだす

てことをやりたいんだけど、どうすればいいですか?
lua の関数オブジェクトやみたいなのをスタックから取得する関数が見当たらないのですが。

lua_getglobal(L, "getfunc");
lua_call(L, 0, 1);
myfunc = スタック[-1]からlua関数を取得

... しばらくたってから ...

myfunc をスタックにpush
lua_call(...)

ということがやりたいです。

983デフォルトの名無しさん:2009/05/22(金) 17:09:08
>>982
Lua はオブジェクトを直接C側で参照する機構を持たない。よって単純には出来ない。

一般的には luaL_ref を使ってオブジェクトのリファレンス(絶対重ならないint値)をとって、
それをつかってレジストリテーブルにつっこんでおいて、必要になったらそのリファレンスを
つかってレジストリテーブルから引っ張り出してくる、という手法がとられる。

そんなややこしいのはいやじゃって人は、リファレンスを C側で保持できる squirrel オススメ
984デフォルトの名無しさん:2009/05/22(金) 17:58:18
いまのプロジェクトにはC縛りがあるのでC++なsqurrelはダメなんです。
luaL_ref が一番素直そうなのでそれでやってみます。どうもありがとう。
985デフォルトの名無しさん:2009/05/23(土) 00:58:12
SquirrelってC++だっけ?
bindは確かにC++だが、直叩きだったらCの範疇でいけたような・・・
986デフォルトの名無しさん:2009/05/23(土) 01:07:48
squirrel のソース自体は c++ だよ。
class でなくて struct なのは趣味かね。

ただ、インターフェース的には全部C合わせなので、普通にリンクして使える。
例外とかも全く使ってないから問題になるところはどこにもない。
プロジェクトが C縛りってのがいまどきだと意味不明だねぇ
987デフォルトの名無しさん:2009/05/23(土) 08:11:35
   ∧_∧  / ̄ ̄ ̄ ̄
  ( ・∀・) <  Lua!!
⊂/  9)  \____
q(   /
  >  >

988デフォルトの名無しさん:2009/05/23(土) 09:07:00
テーブルAのメソッドBを引数Cで呼んで戻り値D, Eを得たいんだけど、

// スタック初期化
lua_settop(L, 0)
// A::Bをpush
lua_getglobal(L, "A")
lua_pushstring(L, "B")
lua_gettable(L, -2)
// 暗黙の引数selfをpush
lua_getglobal(L, "A")
//引数Cをpush
lua_getglobal(L, "C")
//実行
lua_call(L, 2, 2)
//luaで return d, e された戻り値を受け取る
D = lua_tointeger(L, 1)
E = lua_tointeger(L, 2)

てやると、D,Eにluaで返した値が入らないんだけど、どうしてですか???

989デフォルトの名無しさん:2009/05/23(土) 09:35:28
最初に lua_getglobal(L, "A") したときのAがスタックに残ってる。
lua_gettable(L, -2) の後に lua_remove(L,-2) を入れるか、
その後の lua_getglobal(L, "A") を消せばいいと思うよ
990デフォルトの名無しさん:2009/05/23(土) 11:43:43
>>989 後者の方法だと self が消えない?
991デフォルトの名無しさん:2009/05/23(土) 22:44:35
>>986
C++がぜんぜんわからないってのがいまだに上にいたりするからな…
自分がそういう上司に当たって死にかけてからもうずいぶんになるが、
いまだにそういう人はちょくちょく見かける。
992デフォルトの名無しさん:2009/05/23(土) 22:52:55
CとC#しか仕事で使ってません
てかつかえません
サーセン
993デフォルトの名無しさん:2009/05/24(日) 03:45:08
>>984
Cオンリーなら、
// 一行コメント
も使っちゃダメなんだろうな、大変だな。
994デフォルトの名無しさん:2009/05/24(日) 04:28:06
C99
995デフォルトの名無しさん:2009/05/24(日) 04:37:28
C++ダメなプロジェクトが、C99を(ry
996デフォルトの名無しさん:2009/05/24(日) 05:00:50
MSVCがC99に準拠することは今後も無いんだろうな
//は使えるけど
997デフォルトの名無しさん:2009/05/24(日) 11:00:21
うめ
998デフォルトの名無しさん:2009/05/24(日) 11:29:17
次スレ立ってないのに埋めんなw
テンプレに、大きな変更ないよね?
999デフォルトの名無しさん:2009/05/24(日) 21:29:00
1000デフォルトの名無しさん:2009/05/24(日) 21:29:53
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。