1 名前:デフォルトの名無しさん mailto:sage [2006/10/14(土) 13:13:52 ] だれか サポ−ト 頼む。 前々スレ pc5.2ch.net/tech/kako/1034/10341/1034182349.html 前スレ pc8.2ch.net/test/read.cgi/tech/1063711237/ 本家 www.lua.org/ lua-users lua-users.org/ LuaForge luaforge.net/ Lua 5.1 リファレンスマニュアル(日本語訳) sugarpot.sakura.ne.jp/yuno/html/lua51_manual_ja.html
29 名前:デフォルトの名無しさん mailto:sage [2006/10/29(日) 20:30:04 ] 保守
30 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 18:50:04 ] 定期保守
31 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 19:51:42 ] 小ネタ投下。 luaL_newmetatableで作成されたメタテーブルを持つユーザーデータならtnameを返し、それ以外ならtype()の結果を返す。 たとえばio.openで開いたファイルなら"FILE*"という文字列になる。 debugライブラリを使ってるのがマズイ function type_ex(o) local t = type(o) if t=="userdata" then local m = getmetatable(o) if m then for k,v in pairs(debug.getregistry()) do if m==v then if type(k)~="string" then return tostring(k) end return k end end end end return t end
32 名前:デフォルトの名無しさん [2006/11/01(水) 06:24:32 ] ていうか誰か速くJUMP文実装してくんねーかなぁ〜〜
33 名前:デフォルトの名無しさん mailto:sage [2006/11/02(木) 18:54:59 ] スパゲティコードでよければ ↑の人が実装する
34 名前:デフォルトの名無しさん mailto:sage [2006/11/07(火) 01:36:18 ] temp = { 500, x = 200, 'aaa', y = 300 } というテーブルがあって、 temp[2]で200を取得することって出来ない?
35 名前:デフォルトの名無しさん mailto:sage [2006/11/07(火) 14:23:55 ] できないと思う。 temp[2]は'aaa'になる。 嫌なら temp[2] = temp.x みたいにするとか。
36 名前:デフォルトの名無しさん mailto:sage [2006/11/07(火) 19:59:45 ] 前スレの978みたいなやつ。 循環参照にも対応してるはず。 テーブルを渡すとそのテーブルを復元するコードを返す。 loadstring(save_table(t))()で元のテーブルのコピー。 ↓をlua.exeに食わせると(ry print((string.gsub([==[function save_table(data)@;assert(type(data)=="table")@ ;local s,l,c={},"",""@;local function dump(x)@;;local t,r=type(x),nil@;;if t== "nil" or t=="boolean" or t=="number" then@;;;r=tostring(x)@;;elseif t=="string " then@;;;if x:find("[%[%]]") then@;;;;x=x:gsub("%%", "%%%%"):gsub("%[", "%%(" ):gsub("%]", "%%)")@;;;;r="(u[["..x.."]])"@;;;else@;;;;r=" [["..x.."]] "@;;;en d@;;elseif t=="table" then@;;;if s[x] then@;;;;r="m[\""..s[x].."\"]"@;;;else@; ;;;assert((not getmetatable(x)) or (not getmetatable(x).__tostring))@;;;;local k=tostring(x)@;;;;s[x]=k@;;;;l=l.." m[\""..k.."\"]={}"@;;;;r="s(\""..k.."\",{ "@;;;;for k,v in pairs(x) do@;;;;;r=r.."["..dump(k).."]="..dump(v)..","@;;;;en d@;;;;r=r.."})"@;;;end@;;end@;;return r@;end@;s[data] = "r"@;for k,v in pairs( data) do@;;c = c.." r["..dump(k).."]="..dump(v)@;end@;return [[do local r,m={} ,{r=r}local function s(n,t)local r=m[n]for k,v in pairs(t)do r[k]=v end return r end local function u(s)return s:gsub("%%%)","]"):gsub("%%%(","["):gsub("%%% %","%%")end]]..l..c.." return r end"@end]==], "\n",""):gsub("%s*@%s*", "\n") :gsub(";", "\t")))
37 名前:36 mailto:sage誰もいない? [2006/11/08(水) 17:21:17 ] 少し修正。 print((string.gsub([==[function save_table(data)@;assert(type(data)=="table")@ ;local s,l,c,e,a={},"","",false,false@;local function dump(x)@;;local t,r=type (x),nil@;;if t=="nil" or t=="boolean" or t=="number" then@;;;r=tostring(x)@;;e lseif t=="string" then@;;;if x:find("[%[%]]") then@;;;;x=x:gsub("%%", "%%%%"): gsub("%[", "%%("):gsub("%]", "%%)")@;;;;r="(u[["..x.."]])"@;;;;e=true@;;;else@ ;;;;r=" [["..x.."]] "@;;;end@;;elseif t=="table" then@;;;if s[x] then@;;;;r="m ['"..s[x].."']"@;;;else@;;;;assert((not getmetatable(x)) or (not getmetatable( x).__tostring))@;;;;local k=tostring(x)@;;;;s[x]=k@;;;;l=l.." m['"..k.."']={}" @;;;;r="s('"..k.."',{"@;;;;for k,v in pairs(x) do@;;;;;r=r.."["..dump(k).."]=" ..dump(v)..","@;;;;end@;;;;r=r.."})"@;;;;a=true@;;;end@;;end@;;return r@;end@; s[data] = "r"@;for k,v in pairs(data) do@;;c = c.." r["..dump(k).."]="..dump(v )@;end@;return "do local r,m={},{}m.r=r"@;;..((a and " local function s(n,t)lo cal r=m[n]for k,v in pairs(t)do r[k]=v end return r end") or "")@;;..((e and " local function u(s)return s:gsub('%%%)',']'):gsub('%%%(','['):gsub('%%%%','%% ')end") or "")@;;..l..c.." return r end"@end]==],"\n",""):gsub("%s*@%s*", "\n" ):gsub(";", "\t")))
38 名前:36 mailto:sage [2006/11/08(水) 17:26:29 ] コード貼るだけではアレなのでちょっと使い方を説明。 --tableは保存しておきたいテーブル dump = save_table(table) --または dump = string.dump(loadstring(save_table(table))) --ファイルに書き出す f = io.open("hoge.lua", "w") f:write(dump) f:close() --元のテーブルが復元される table = dofile("hoge.lua") function、thread、userdataはもちろん対応してない
39 名前:デフォルトの名無しさん [2006/11/08(水) 19:47:35 ] あるスレッドである程度スタックに値を積んでいる状態で lua_resumeを呼んで帰ってきたときに、それまでスタックに積んでいたものが見事に なくなります。lua_call系では消えずに残っているようですが…仕様なのかバグなのか。 マニュアルに書いてあるlua_resumeを使うときはlua_newthreadで新しくスレッドを 作ってから使えっていうのはこういうことなのですね…。
40 名前:デフォルトの名無しさん mailto:sage [2006/11/10(金) 18:38:07 ] lua.exeに食わせるとかアホな事やってないで うpろだ使えよ
41 名前:デフォルトの名無しさん mailto:sage [2006/11/23(木) 12:09:36 ] metaluaの使い方がわからねぇ。
42 名前:デフォルトの名無しさん [2006/11/23(木) 13:52:08 ] 昨日5.1 SJIS対応版を拾ってテストコードを作ってみたんだが動かないんだ。 lua_State *L=lua_open(); luaL_loadstring(L,"function Add(x,y)\r\n return x+y \r\nend\r\n"); //printf("%s\n",lua_typename(L, lua_type(L, -1))); lua_getglobal(L, "Add"); //printf("%s\n",lua_typename(L, lua_type(L, -1))); //printf("%s\n",lua_typename(L, lua_type(L, 1))); lua_pushnumber(L, 1.2); //printf("%s\n",lua_typename(L, lua_type(L, -1))); lua_pushnumber(L, 2.3); //printf("%s\n",lua_typename(L, lua_type(L, -1))); if(lua_pcall(L, 2, 1, 0) != 0){ printf("残念賞:%s\n",lua_tostring(L, -1)); } printf("%f\n",lua_tonumber(L, -1)); lua_pop(L, 1); lua_close(L); これだけで動くと思うんだが、lua_pcallした後は 「残念賞:attempt to call a nil value」 合間のprintfを有効にすると function,nil,function,number,number って出る。 初っ端から駄目駄目な俺に誰か助言をくれ〜
43 名前:デフォルトの名無しさん mailto:sage [2006/11/23(木) 14:09:21 ] >>42 残念!
44 名前:デフォルトの名無しさん mailto:sage [2006/11/23(木) 14:57:13 ] >>42 FAQ loadstringは評価しない。callしる。
45 名前:42 mailto:sage [2006/11/23(木) 16:47:09 ] >>44 オオゥ。そうなのか。 ・・・うん、無事動きました。ありがとう。
46 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 04:10:14 ] ==演算子でテーブルをくらべてるとき指してるテーブルが同じときにだけ__eqが呼ばれないことについて
47 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 01:21:16 ] >>46 そう定義されてるから仕方が無い
48 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 03:19:41 ] 処世術なんてききたくない この挙動は真っ当ではないと思わないか
49 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 03:38:02 ] それほど酷い仕様とも思えんが・・・ むしろ"=="の意味からいったら真っ当な気さえする。 演算子をつかってboost.spirit並みの拡張をしたい というなら話はべつだが。
50 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 03:59:33 ] metamethodは記述は同じでも比べられる変数の値によって実行されたりされなかったりしていいと思う? 意味的な意味で >むしろ"=="の意味からいったら真っ当な気さえする。 __eqよんだ上で返値を無視すりゃいいじゃん
51 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 13:39:17 ] >実行されたりされなかったりしていいと思う? いいんじゃん。単に言語設計上のポリシーの問題では? >__eqよんだ上で返値を無視すりゃいいじゃん 無視するぐらいなら、呼ばなきゃいいじゃん
52 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 13:55:08 ] >>50 別にいいと思う。それより 意味的な意味で ← この日本語がどうかと思う。意味がわからん。
53 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 14:52:21 ] metamethodの機能として不完全だということは認知してもらえるんだろうか? スクリプト実行時にその時比較される値によって実行されたりされなかったりするんだよ? その上で「まぁべつにいいんじゃねヽ(´ー`)ノ」という意味でいいって言ってるんだよね? だから処世術なんてききたくないっていってんだよばかばかまんこ
54 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 16:00:59 ] 同じテーブルを指す=比較するまでもない という設計思想なんでしょ。 不必要なことはしないというだけで、別に不完全とは思わないなあ。
55 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 17:13:58 ] 言いたい事があるならMLでサクーシャに直接言ったら良いじゃない。
56 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 17:16:18 ] とりあえず「metamethodの機能として完全」の 定義をしてくれ 言語設計ポリシーの結果として選択された仕様を 完全か否かなんて議論はきわめて不毛だし。
57 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 17:17:14 ] >>54 仮にそういう設計思想なんだとして、だったら__eqなんて作らせないでしょ?
58 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 17:18:58 ] >>53 >スクリプト実行時にその時比較される値によって実行されたりされなかったりするんだよ? で、何が困るの? 困ることが無いなら、比較速度がかなり速くなる分、 いまの実装の方が完全なんだけど。 わかる?お前定義の「完全な言語」なんてどうでいいんだよアホ。
59 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 17:20:22 ] >>57 はぁ?バカか? お前__eqの意味すら理解してないんじゃないのか?
60 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 17:23:07 ] そろそろ釣れた宣言がくる悪寒
61 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 17:24:49 ] べつにつらないよw 君らばかだなホント
62 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 17:34:22 ] お、でたでた。バカの口癖「お前等全員バカ」。
63 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 22:46:40 ] どうやら尻尾巻いて逃げたようです。 彼がなぜ__eqが同一のオブジェクトでも 実行されて欲しかったのかは謎のまま。
64 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 23:59:37 ] >>63 そんな事書くとまた出てきちゃうだろ。 JavaのequalsとかC++のoperator==とかは同一オブジェクトでも 呼び出されるから彼の要求が特別に変というわけではない気がする。 まぁ結局は>55なんだが。
65 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 01:11:57 ] 別になんか要求してるわけじゃないよ 挙動が気に入らなきゃvm書き換えりゃいいだけの話なんだし
66 名前:デフォルトの名無しさん mailto:sage [2006/12/05(火) 12:29:24 ] 比較時にログを出力する、という実装は不可能だわな。 それに意味があるかどうかというより、 不可能なことがある、ってのがちょっと気持ち悪いとは思う。 所詮スクリプトなんだし、そこまで求めないけど。
67 名前:デフォルトの名無しさん mailto:sage [2006/12/05(火) 13:19:17 ] >>66 >不可能なことがある、ってのがちょっと気持ち悪いとは思う。 ナポレオン乙
68 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 08:01:03 ] luabindの中身見たが、なんだありゃ・・・ さっぱりわけが分からない
69 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 09:07:09 ] >>66 オーバーロードが一切出来ない言語できないなw バカなお前じゃw
70 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 09:18:34 ] 方言?
71 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 13:46:11 ] >>69 >所詮スクリプトなんだし、そこまで求めないけど。 ちゃんと読めよ。
72 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 18:38:16 ] >>71 アホかお前。お前がちゃんと読めよ。 >所詮スクリプトなんだし、そこまで求めないけど。 スクリプトじゃなければ、そこまで求めるんだろうが。 スクリプトじゃなくて、オーバーロードできない言語だと、不可能だらけ。 アホな66は使えません。
73 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 19:09:10 ] __eqが同一のオブジェクトでも実行されて欲しいケースなんてない、 という雰囲気にひとつ例を出したに過ぎない66に対して、 72の粘着っぷりは異常。
74 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 19:49:33 ] 72の粘着っぷりが怖いよ。 なんかよほど言い負けた感を持ったらしいとしか思えん、何が原因かは不明だが。
75 名前:デフォルトの名無しさん mailto:sage [2006/12/10(日) 18:35:05 ] 「粘着っぷりが怖い」という粘着ぶりが怖いw
76 名前:デフォルトの名無しさん mailto:sage [2006/12/10(日) 19:08:12 ] ほら粘着とか呼んじゃうからムキになってるじゃないか。 スルーしとけばよかったのに。
77 名前:デフォルトの名無しさん mailto:sage [2006/12/12(火) 18:59:03 ] Lua以外の(軽量組込み系)言語の話はとんとご無沙汰な件について もうLuaで鉄板?
78 名前:デフォルトの名無しさん mailto:sage [2006/12/13(水) 01:25:31 ] squirrel推したいけど比較するのにluaの変なとこを引き合いにだすと粘着されそうなんでやめときますね
79 名前:デフォルトの名無しさん mailto:sage [2006/12/13(水) 11:43:37 ] >>78 どんなものかを知るためにぜひやってほしいにょ
80 名前:デフォルトの名無しさん mailto:sage [2006/12/13(水) 19:41:44 ] >>78 俺もsquirrelを推したいけど別にLuaの変なとこを指摘することもないな むしろLuaのほうが環境整ってるせいでsquirrelのほうが使いづらい感が…
81 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 02:02:30 ] >>80 ”環境”って日本語ドキュメント?binder?eclipseのplugin? 各apiを実行するとどういう風にstackがアクセスされるのかのきちんとした仕様の明示はほしい これは外人もいってたけど
82 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 08:23:13 ] >>81 前も書いたけどluabindのあるなしの問題 stackなんか考えるのだるいじゃん
83 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 09:06:07 ] squirrelならscriptで使うクラス等の型はscriptで書いてそれを最初にdofileさせるだけだよ データの送受はインスタンスや配列の中身を直接アクセスするだけで大抵すんじゃうし native closureの初期下時の組み込みとnative closure内での引数取得と script側のclosureをcallするとき引数を積むくらいだよstack使うのなんて 実際必要ないからbinderが発達しないんだと思う
84 名前:デフォルトの名無しさん [2006/12/16(土) 10:08:48 ] squirrelをざっと眺めてみたけど、Cと文法が近かったりビット演算が 標準だったり"++"と"+="があったり、いいかも。 ただ、配列とテーブルが違ったり、ジェネレーターとコルーチンが 違ったり、Luaに比べてやや複雑か。気になったのは、 ・Luaだとtbl.abcとtbl["abc"]は同じ意味だけどsquirrelでも 同じ方法はある? ・classとtableの関係は? ・参照カウンタ+GCの意味は循環参照検出にGCを使うという意味? パフォーマンスにはどんな影響が? あたりか。
85 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 14:23:14 ] >・Luaだとtbl.abcとtbl["abc"]は同じ意味だけどsquirrelでも できるよー >・classとtableの関係は? ハッシュテーブルの基盤を使ってclassが作られてるようなかんじ? >・参照カウンタ+GCの意味は循環参照検出にGCを使うという意味? そうみたい。 でもまともに書いてれば循環参照なんてありえんし コンパイルオプションで参照カウンタオンリーにしてしまえ
86 名前:デフォルトの名無しさん mailto:sage [2006/12/17(日) 14:35:45 ] squirrelのgeneratorはjump使ったトリック、threadはvmのstate切り替え luaのcoroutineはどうなってるの?
87 名前:デフォルトの名無しさん mailto:sage [2006/12/18(月) 00:25:35 ] >>86 state切り替え coroutine.create()から呼ばれるluaE_newthread()見れば、新しいlua_State作ってるのがわかる
88 名前:デフォルトの名無しさん mailto:sage [2007/01/01(月) 20:05:52 ] squirrelはC++だから流行らないとみた。
89 名前:デフォルトの名無しさん mailto:sage [2007/01/02(火) 02:35:20 ] 今のところ他人のコードを見たくない言語ナンバーワンだ・・・
90 名前:デフォルトの名無しさん mailto:sage [2007/01/02(火) 08:20:31 ] Cは記号に頼りすぎ。
91 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 04:39:10 ] >89 俺はbrainf*ckだな
92 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 15:18:31 ] >>91 まず見ることがないじゃないかw
93 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 00:18:29 ] なあ、すごく基本的なこと聞いていい? 最近Luaを知って調べ始めたんだが、自作プログラムの外部スクリプトとして Luaを組み込む方法が全然見つからないんだが、どこへ行けば詳しく書いてるだろうか?
94 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 00:36:49 ] >>93 ソースに付属しているインタープリタみれば一発じゃん。
95 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 00:56:16 ] >>94 すまん、ソースダウンロードしてみたがさっぱりわからなかった。 Boostとかだと、〜をinlcudeしろ、〜.libのあるところにパスを通せ、といった記述があるのだが、 そういうのが全然見当たらないんだが・・・
96 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 01:03:26 ] 「lua embed」でググレ
97 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 01:17:19 ] >>96 d! やっと解説してるところが見つかった。
98 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 19:59:01 ] >>97 で、どこにあったの?
99 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 00:14:33 ] >>98 www.codeproject.com/cpp/luaincpp.asp ただ、ビルドはできたが読み込む際のluaopen_ioで落ちる。 ちょっと作業する時間なかったので、原因はまだ調べてない。
100 名前:デフォルトの名無しさん [2007/01/10(水) 20:07:13 ] The Pawn language www.compuphase.com/pawn/pawn.htm だれも使ってなさそうな、組み込み言語
101 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 22:24:14 ] ゲーム用のスクリプトを探していて、最近Luaを触り始めた者です。 質問なんですが、C++側でlua_Stateをいくつか作ったとき、そのlua_State間で C++の関数を通じてテーブルの参照渡しをすることはできますか? どうも値渡しならスタックを再帰でゴリゴリやってできそうな感じですが…。
102 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 18:30:38 ] >>101 lua_xmove かレジストリで良いのかな?
103 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 22:49:52 ] >>102 lua_xmoveもレジストリも同じglobal stateのスレッド同士じゃないとだめ。
104 名前:101 mailto:sage [2007/01/13(土) 17:04:49 ] ご回答どうもです。 もう少し方法を考えてみようと思います。 ありがとうございました。
105 名前:デフォルトの名無しさん [2007/01/24(水) 14:39:15 ] ROのほむのAIがLuaで記述できるので触っただけです。 別にLuaが好きなわけじゃないんだからね!
106 名前:デフォルトの名無しさん mailto:sage [2007/01/26(金) 13:07:45 ] 帰値がdoubleなのはヘッダいじるとして cdeclなのが気に食わないのはどうしたらいいものか...
107 名前:デフォルトの名無しさん [2007/02/08(木) 05:10:19 ] 部分文字列ってどうやって取得するの?今は string.char(string.byte(str, x, y)) としてるんだけど、これであってるのかなあ。 Lua 2日目の初心者です。
108 名前:デフォルトの名無しさん mailto:sage [2007/02/09(金) 06:24:11 ] なぜstring.subを使わない
109 名前:デフォルトの名無しさん mailto:sage [2007/02/09(金) 16:26:00 ] 最近ゲーム内スクリプトに使われることが多いのかな?
110 名前:デフォルトの名無しさん mailto:sage [2007/02/09(金) 17:56:11 ] >109 昔からいっぱい使われてるじゃないか。
111 名前:デフォルトの名無しさん mailto:sage [2007/02/09(金) 17:56:42 ] つっても2年くらいだけどさ
112 名前:デフォルトの名無しさん mailto:sage [2007/02/10(土) 04:55:56 ] >>108 string.subはstring.gsubとおなじで文字列置換だと思ってた。 正直すまんかった。
113 名前:デフォルトの名無しさん mailto:sage [2007/02/10(土) 13:23:01 ] homeworldはこれ使ってるね
114 名前:デフォルトの名無しさん [2007/02/10(土) 21:12:44 ] >>113 FarCryもつかってたな
115 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 06:31:15 ] Homeworldで検索したら凄いなこれ・・・ 日本人よ、アニメ絵ゲームで萌えてる場合じゃないぞ!
116 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 14:37:36 ] EVE onlineもすごいぞ 今検索したら日本語版も出そうだな。 www.4gamer.net/news.php?url=/DataContents/game/0412.html stackless pythonをサーバー側・クライアント側ともに使ってるらしい。
117 名前:デフォルトの名無しさん mailto:sage [2007/02/16(金) 22:15:17 ] NullLogic Embedded Scripting Language sourceforge.net/projects/nesla/
118 名前:デフォルトの名無しさん mailto:sage [2007/02/17(土) 00:54:05 ] getfenvってlocal変数は取得できないのって不便だな。 function f1(e) setfenv(1,e) ;print(a) end function f2(f) local a=123 ;f(getfenv(1)) end f2(f1) で123が表示されてほしいんだけど。 debug.getlocalとか使えばなんとかなるんだろうけど。 getlocalとgetupvalueだけ何でdebug扱いなんだろう。 速度?
119 名前:デフォルトの名無しさん [2007/02/17(土) 12:23:25 ] あげとこう
120 名前:118 [2007/02/21(水) 21:35:09 ] ぅぅ、誰もいないのか? or どうでもいい話題? これが出来ないとf1への引数指定をするしかないよね。 f2のローカル変数が増えて且つf1でそれを使う場合 f1の引数宣言をどんどん追加する羽目になるんだよなー。 Cのマクロ展開的に気楽に処理をまとめようとする時 >>118 見たいに出来ると便利なんだけど。 ------- 話変わるけど、luabind使って a=luabind_class_a() --luabindで定義したクラス生成 b=luabind_class_b() --luabindで定義したクラス生成 a.p=b ; b.p=a a=nil ; b=nil collectgarbage("collect") ってやっても回収されないような気がする。 (pはluabindでdef_readwrite指定してない) 循環さえしてなければ回収されるっぽい。 そもそもdef_readwrite指定してpに代入すること 自体がまずいのかな? luabind使ってる人、意見ヨロ。
121 名前:118 mailto:sage [2007/02/21(水) 21:38:11 ] 修正 そもそもdef_readwrite指定してpに代入すること => そもそもdef_readwrite指定してないpに代入すること
122 名前:118 mailto:sage [2007/02/21(水) 21:43:47 ] 更に追記 118は最初f1をf2のローカル関数にしてたけど他でも参照しようとして 外部に出した時の話です。
123 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 22:08:28 ] luaさわったことないが、luaでは環境=テーブルなんだし print(e.a)じゃだめなの?もしくはgetfenv(f2)ではどうなる? getfenv(1)というのがわからんな。ソース読んだ方が早い
124 名前:118 mailto:sage [2007/02/21(水) 22:13:40 ] >>123 print(e.a)でも駄目。 getfenv(f2)もgetfenv(1)もf2内では 同じ意味(のはず)です。
125 名前:118 mailto:sage [2007/02/21(水) 22:20:39 ] function f1(e) setfenv(1,e) ;print(a) end function f2(f) setfenv(1,setmetatable({},{__index=_G})) a=123 ;f(getfenv(1)) end f2(f1) これなら動くんだけどねぇ。
126 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 23:20:32 ] >>118 すまん。見てたが良くわからないから 偉い人が降臨するのを待った方がいいと思った。 でもローカル変数はenvironmentが持ってるわけじゃないし (Function Prototypeが持ってるぽい) 他の関数はスコープの外だから無理だと思うよ。 table:functionの形式にしてselfに持たせるのはどう?
127 名前:118 mailto:sage [2007/02/22(木) 00:27:58 ] >>126 いえいえ半分愚痴なんで。 たとえば>>118 を以下の様に書き換えると a=456 function f1(e) setfenv(1,e) ;print(a) -- 123が表示 end function f2(f) --ここからシンタックスシュガー local org_env=getfenv(1) local local_env={} setfenv(1,setmetatable(local_env,{__index=org_env})) --ここまでシンタックスシュガー -- aはローカル a=124 f(local_env) -- print($a) グローバルなaを表示 => print(org_env["a"]) -- 456が表示 end f2(f1) print(a) -- 456が表示 関数先頭でローカル環境設定して むしろlocalが指定されていないときをlocal変数 と解釈し、Rubyみたく$a見たいに記述された時を グローバル変数と解釈するほうが安全なようなきがする。 関数内でlocal宣言し忘れてうっかりグローバル汚す 心配もないし。
128 名前:118 mailto:sage [2007/02/22(木) 02:37:14 ] なんか一人で書き込んでるな (orz luabindのほうが大問題に思えてきた class 'abc' function abc:__init(name) self.name=name ; print("initialize:"..self.name) end function abc:__finalize() print("finalize:"..self.name) end a=abc("1") b=abc("2") a.p=b;b.p=a --循環 a=nil;b=nil collectgarbage("collect") これも__finalizeが呼ばれない模様 上記コードのaもbもuserdataで多分GCがuserdata内部で 持ってる参照を追ってないためリークしてるのではと 予想してみたけど、どうでしょ。
129 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 12:27:46 ] luabindはboostまわりで環境(バージョン)依存するし、tolua++使ってるわ。 >>118 で何を実現したかったのか見えなかったんだけど、 setfenvとかはあくまでグローバルテーブルが取れるだけだし、 localとupvalueが取れないのは仕様上しょうがない・・・。 debugライブラリ使ってもいいけど、安全上の問題が・・・とかマニュアルに書いてある。 んで、今luaのソースちょっと見てみたら、 ローカル変数は数値インデックスで管理されてて、テーブルになってない。 バイトコード上ではほぼ名前は省かれてて、「このインデックスのローカルにこのインデックスのローカルを代入」みたいな 処理になってると思われる。 グローバル変数をlocalに代入してから処理したほうが高速、といわれるのはこういう理由なのね。 グローバル汚す可能性についてはグローバルのメタテーブルの__newindexをいじくって 制限をつければいいと思う。