プログラミング言語 Lua その3
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/10/14(土) 13:13:52前々スレ http://pc5.2ch.net/tech/kako/1034/10341/1034182349.html
前スレ http://pc8.2ch.net/test/read.cgi/tech/1063711237/
本家 http://www.lua.org/
lua-users http://lua-users.org/
LuaForge http://luaforge.net/
Lua 5.1 リファレンスマニュアル(日本語訳)
http://sugarpot.sakura.ne.jp/yuno/html/lua51_manual_ja.html
0053デフォルトの名無しさん
2006/12/02(土) 14:52:21スクリプト実行時にその時比較される値によって実行されたりされなかったりするんだよ?
その上で「まぁべつにいいんじゃねヽ(´ー`)ノ」という意味でいいって言ってるんだよね?
だから処世術なんてききたくないっていってんだよばかばかまんこ
0054デフォルトの名無しさん
2006/12/02(土) 16:00:59という設計思想なんでしょ。
不必要なことはしないというだけで、別に不完全とは思わないなあ。
0055デフォルトの名無しさん
2006/12/02(土) 17:13:580056デフォルトの名無しさん
2006/12/02(土) 17:16:18定義をしてくれ
言語設計ポリシーの結果として選択された仕様を
完全か否かなんて議論はきわめて不毛だし。
0057デフォルトの名無しさん
2006/12/02(土) 17:17:14仮にそういう設計思想なんだとして、だったら__eqなんて作らせないでしょ?
0058デフォルトの名無しさん
2006/12/02(土) 17:18:58>スクリプト実行時にその時比較される値によって実行されたりされなかったりするんだよ?
で、何が困るの?
困ることが無いなら、比較速度がかなり速くなる分、
いまの実装の方が完全なんだけど。
わかる?お前定義の「完全な言語」なんてどうでいいんだよアホ。
0059デフォルトの名無しさん
2006/12/02(土) 17:20:22はぁ?バカか?
お前__eqの意味すら理解してないんじゃないのか?
0060デフォルトの名無しさん
2006/12/02(土) 17:23:070061デフォルトの名無しさん
2006/12/02(土) 17:24:49君らばかだなホント
0062デフォルトの名無しさん
2006/12/02(土) 17:34:220063デフォルトの名無しさん
2006/12/02(土) 22:46:40彼がなぜ__eqが同一のオブジェクトでも
実行されて欲しかったのかは謎のまま。
0064デフォルトの名無しさん
2006/12/02(土) 23:59:37そんな事書くとまた出てきちゃうだろ。
JavaのequalsとかC++のoperator==とかは同一オブジェクトでも
呼び出されるから彼の要求が特別に変というわけではない気がする。
まぁ結局は>55なんだが。
0065デフォルトの名無しさん
2006/12/03(日) 01:11:57挙動が気に入らなきゃvm書き換えりゃいいだけの話なんだし
0066デフォルトの名無しさん
2006/12/05(火) 12:29:24それに意味があるかどうかというより、
不可能なことがある、ってのがちょっと気持ち悪いとは思う。
所詮スクリプトなんだし、そこまで求めないけど。
0067デフォルトの名無しさん
2006/12/05(火) 13:19:17>不可能なことがある、ってのがちょっと気持ち悪いとは思う。
ナポレオン乙
0068デフォルトの名無しさん
2006/12/09(土) 08:01:03さっぱりわけが分からない
0069デフォルトの名無しさん
2006/12/09(土) 09:07:09オーバーロードが一切出来ない言語できないなw
バカなお前じゃw
0070デフォルトの名無しさん
2006/12/09(土) 09:18:340071デフォルトの名無しさん
2006/12/09(土) 13:46:11>所詮スクリプトなんだし、そこまで求めないけど。
ちゃんと読めよ。
0072デフォルトの名無しさん
2006/12/09(土) 18:38:16アホかお前。お前がちゃんと読めよ。
>所詮スクリプトなんだし、そこまで求めないけど。
スクリプトじゃなければ、そこまで求めるんだろうが。
スクリプトじゃなくて、オーバーロードできない言語だと、不可能だらけ。
アホな66は使えません。
0073デフォルトの名無しさん
2006/12/09(土) 19:09:10という雰囲気にひとつ例を出したに過ぎない66に対して、
72の粘着っぷりは異常。
0074デフォルトの名無しさん
2006/12/09(土) 19:49:33なんかよほど言い負けた感を持ったらしいとしか思えん、何が原因かは不明だが。
0075デフォルトの名無しさん
2006/12/10(日) 18:35:050076デフォルトの名無しさん
2006/12/10(日) 19:08:12スルーしとけばよかったのに。
0077デフォルトの名無しさん
2006/12/12(火) 18:59:03もうLuaで鉄板?
0078デフォルトの名無しさん
2006/12/13(水) 01:25:310079デフォルトの名無しさん
2006/12/13(水) 11:43:37どんなものかを知るためにぜひやってほしいにょ
0080デフォルトの名無しさん
2006/12/13(水) 19:41:44俺もsquirrelを推したいけど別にLuaの変なとこを指摘することもないな
むしろLuaのほうが環境整ってるせいでsquirrelのほうが使いづらい感が…
0081デフォルトの名無しさん
2006/12/14(木) 02:02:30”環境”って日本語ドキュメント?binder?eclipseのplugin?
各apiを実行するとどういう風にstackがアクセスされるのかのきちんとした仕様の明示はほしい
これは外人もいってたけど
0082デフォルトの名無しさん
2006/12/14(木) 08:23:13前も書いたけどluabindのあるなしの問題
stackなんか考えるのだるいじゃん
0083デフォルトの名無しさん
2006/12/14(木) 09:06:07データの送受はインスタンスや配列の中身を直接アクセスするだけで大抵すんじゃうし
native closureの初期下時の組み込みとnative closure内での引数取得と
script側のclosureをcallするとき引数を積むくらいだよstack使うのなんて
実際必要ないからbinderが発達しないんだと思う
0084デフォルトの名無しさん
2006/12/16(土) 10:08:48標準だったり"++"と"+="があったり、いいかも。
ただ、配列とテーブルが違ったり、ジェネレーターとコルーチンが
違ったり、Luaに比べてやや複雑か。気になったのは、
・Luaだとtbl.abcとtbl["abc"]は同じ意味だけどsquirrelでも
同じ方法はある?
・classとtableの関係は?
・参照カウンタ+GCの意味は循環参照検出にGCを使うという意味?
パフォーマンスにはどんな影響が?
あたりか。
0085デフォルトの名無しさん
2006/12/16(土) 14:23:14できるよー
>・classとtableの関係は?
ハッシュテーブルの基盤を使ってclassが作られてるようなかんじ?
>・参照カウンタ+GCの意味は循環参照検出にGCを使うという意味?
そうみたい。
でもまともに書いてれば循環参照なんてありえんし
コンパイルオプションで参照カウンタオンリーにしてしまえ
0086デフォルトの名無しさん
2006/12/17(日) 14:35:45luaのcoroutineはどうなってるの?
0087デフォルトの名無しさん
2006/12/18(月) 00:25:35state切り替え
coroutine.create()から呼ばれるluaE_newthread()見れば、新しいlua_State作ってるのがわかる
0088デフォルトの名無しさん
2007/01/01(月) 20:05:520089デフォルトの名無しさん
2007/01/02(火) 02:35:200090デフォルトの名無しさん
2007/01/02(火) 08:20:310091デフォルトの名無しさん
2007/01/05(金) 04:39:10俺はbrainf*ckだな
0092デフォルトの名無しさん
2007/01/05(金) 15:18:31まず見ることがないじゃないかw
0093デフォルトの名無しさん
2007/01/09(火) 00:18:29最近Luaを知って調べ始めたんだが、自作プログラムの外部スクリプトとして
Luaを組み込む方法が全然見つからないんだが、どこへ行けば詳しく書いてるだろうか?
0094デフォルトの名無しさん
2007/01/09(火) 00:36:49ソースに付属しているインタープリタみれば一発じゃん。
0095デフォルトの名無しさん
2007/01/09(火) 00:56:16すまん、ソースダウンロードしてみたがさっぱりわからなかった。
Boostとかだと、〜をinlcudeしろ、〜.libのあるところにパスを通せ、といった記述があるのだが、
そういうのが全然見当たらないんだが・・・
0096デフォルトの名無しさん
2007/01/09(火) 01:03:260097デフォルトの名無しさん
2007/01/09(火) 01:17:19d!
やっと解説してるところが見つかった。
0098デフォルトの名無しさん
2007/01/09(火) 19:59:01で、どこにあったの?
0099デフォルトの名無しさん
2007/01/10(水) 00:14:33http://www.codeproject.com/cpp/luaincpp.asp
ただ、ビルドはできたが読み込む際のluaopen_ioで落ちる。
ちょっと作業する時間なかったので、原因はまだ調べてない。
0100デフォルトの名無しさん
2007/01/10(水) 20:07:13http://www.compuphase.com/pawn/pawn.htm
だれも使ってなさそうな、組み込み言語
0101デフォルトの名無しさん
2007/01/11(木) 22:24:14質問なんですが、C++側でlua_Stateをいくつか作ったとき、そのlua_State間で
C++の関数を通じてテーブルの参照渡しをすることはできますか?
どうも値渡しならスタックを再帰でゴリゴリやってできそうな感じですが…。
0102デフォルトの名無しさん
2007/01/12(金) 18:30:38lua_xmove かレジストリで良いのかな?
0103デフォルトの名無しさん
2007/01/12(金) 22:49:52lua_xmoveもレジストリも同じglobal stateのスレッド同士じゃないとだめ。
0104101
2007/01/13(土) 17:04:49もう少し方法を考えてみようと思います。
ありがとうございました。
0105デフォルトの名無しさん
2007/01/24(水) 14:39:15別にLuaが好きなわけじゃないんだからね!
0106デフォルトの名無しさん
2007/01/26(金) 13:07:45cdeclなのが気に食わないのはどうしたらいいものか...
0107デフォルトの名無しさん
2007/02/08(木) 05:10:19string.char(string.byte(str, x, y))
としてるんだけど、これであってるのかなあ。
Lua 2日目の初心者です。
0108デフォルトの名無しさん
2007/02/09(金) 06:24:110109デフォルトの名無しさん
2007/02/09(金) 16:26:000110デフォルトの名無しさん
2007/02/09(金) 17:56:11昔からいっぱい使われてるじゃないか。
0111デフォルトの名無しさん
2007/02/09(金) 17:56:420112デフォルトの名無しさん
2007/02/10(土) 04:55:56string.subはstring.gsubとおなじで文字列置換だと思ってた。
正直すまんかった。
0113デフォルトの名無しさん
2007/02/10(土) 13:23:010114デフォルトの名無しさん
2007/02/10(土) 21:12:44FarCryもつかってたな
0115デフォルトの名無しさん
2007/02/11(日) 06:31:15日本人よ、アニメ絵ゲームで萌えてる場合じゃないぞ!
0116デフォルトの名無しさん
2007/02/11(日) 14:37:36今検索したら日本語版も出そうだな。
http://www.4gamer.net/news.php?url=/DataContents/game/0412.html
stackless pythonをサーバー側・クライアント側ともに使ってるらしい。
0117デフォルトの名無しさん
2007/02/16(金) 22:15:17http://sourceforge.net/projects/nesla/
0118デフォルトの名無しさん
2007/02/17(土) 00:54:05function 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扱いなんだろう。
速度?
0119デフォルトの名無しさん
2007/02/17(土) 12:23:250120118
2007/02/21(水) 21:35:09これが出来ないと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使ってる人、意見ヨロ。
0121118
2007/02/21(水) 21:38:11そもそもdef_readwrite指定してpに代入すること
=> そもそもdef_readwrite指定してないpに代入すること
0122118
2007/02/21(水) 21:43:47118は最初f1をf2のローカル関数にしてたけど他でも参照しようとして
外部に出した時の話です。
0123デフォルトの名無しさん
2007/02/21(水) 22:08:28print(e.a)じゃだめなの?もしくはgetfenv(f2)ではどうなる?
getfenv(1)というのがわからんな。ソース読んだ方が早い
0125118
2007/02/21(水) 22:20:39setfenv(1,e) ;print(a)
end
function f2(f)
setfenv(1,setmetatable({},{__index=_G}))
a=123 ;f(getfenv(1))
end
f2(f1)
これなら動くんだけどねぇ。
0126デフォルトの名無しさん
2007/02/21(水) 23:20:32すまん。見てたが良くわからないから
偉い人が降臨するのを待った方がいいと思った。
でもローカル変数はenvironmentが持ってるわけじゃないし
(Function Prototypeが持ってるぽい)
他の関数はスコープの外だから無理だと思うよ。
table:functionの形式にしてselfに持たせるのはどう?
0127118
2007/02/22(木) 00:27:58いえいえ半分愚痴なんで。
たとえば>>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宣言し忘れてうっかりグローバル汚す
心配もないし。
0128118
2007/02/22(木) 02:37:14luabindのほうが大問題に思えてきた
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内部で
持ってる参照を追ってないためリークしてるのではと
予想してみたけど、どうでしょ。
0129デフォルトの名無しさん
2007/02/22(木) 12:27:46>>118で何を実現したかったのか見えなかったんだけど、
setfenvとかはあくまでグローバルテーブルが取れるだけだし、
localとupvalueが取れないのは仕様上しょうがない・・・。
debugライブラリ使ってもいいけど、安全上の問題が・・・とかマニュアルに書いてある。
んで、今luaのソースちょっと見てみたら、
ローカル変数は数値インデックスで管理されてて、テーブルになってない。
バイトコード上ではほぼ名前は省かれてて、「このインデックスのローカルにこのインデックスのローカルを代入」みたいな
処理になってると思われる。
グローバル変数をlocalに代入してから処理したほうが高速、といわれるのはこういう理由なのね。
グローバル汚す可能性についてはグローバルのメタテーブルの__newindexをいじくって
制限をつければいいと思う。
0130118
2007/02/22(木) 19:38:37tolua++ってコードジェネレーター系ですよね。
tolua++て>>128みたいなことって出来ます?例えば
a=ABC:new()
b=ABC:new()
a.p=b;b.p=a --aとbで循環参照させる。
a=nil;b=nil
collectgarbage("collect")
出来るとしたら、これでC++側のABCの実体のデストラクタ
って呼ばれます?
>グローバル汚す可能性についてはグローバルのメタテーブルの__newindexをいじくって
誰かがそんなことやってましたね。
0131デフォルトの名無しさん
2007/02/23(金) 03:51:29newしたものを普通のテーブルと同じように扱ってるところに問題がない?
userdataの可能性が高いし、そのままメンバー追加してどうなるかはluabindの実装によるかも。
tolua++では、new()で生成すると手動でdeleteが必要。
new_local()または クラス名() で生成すればガベコレに任せる。
local a=TestClass()
local b=TestClass()
local ax = { p = a }
local bx = { p = b }
a=nil;b=nil
ax=nil;bx=nil
collectgarbage(0)
これならちゃんと回収されてる。(Lua5.0の場合)
0132118
2007/02/24(土) 00:04:45てゆうか、それ循環してないし。
例え循環させても、テーブルは循環してても当然回収されるので
>>130みたくラッピングすればluabindでも当然回収される。
>>userdataの可能性が高いし、そのままメンバー追加してどうなるかはluabindの実装によるかも。
luabind的にはuserdataだけど一応メタテーブル設定して大丈夫になっています。
>>128にも書いたけど、おそらくuserdataからそれに関連づけされた
luaオブジェクトへの参照をGCが追跡できて無いのでリークしてると思う。
5.0ではuserdataに環境は設定できないけど5.1では出来るようになって
いる。5.1でそうした理由は多分”userdata->その環境table”のパス
をGCでおえるようにして循環参照を検出して回収可能にする為だと思います。
(ぐぐったらそれっぽい議論がされてる。)
おそらくluabindが5.1に対応しきれてないのではと予想して対策を検討中。
0134デフォルトの名無しさん
2007/02/24(土) 04:44:20あ・・・ほんとだぜんぜん循環してないorz
あとLua5.0でもフルユーザーデータにはメタテーブルもてたけどね。
lightuserdataの扱いが変わっただけかと。
問題はメタテーブルの__newindexとかで実際何をやってるかということだけど・・・
0135デフォルトの名無しさん
2007/03/10(土) 15:00:020136デフォルトの名無しさん
2007/03/18(日) 02:28:50Squirrel側から呼ばせるC++側の関数で
戻り値としてあるクラスのインスタンスをPushするにはどうすればいいんだろう?
0137デフォルトの名無しさん
2007/03/29(木) 21:09:520138デフォルトの名無しさん
2007/04/06(金) 23:54:07ttp://www.lua.org/news.html
0139デフォルトの名無しさん
2007/04/09(月) 14:51:00squirrel.libだけで741KBってどうなんですか?
スクリプトエンジンとか組み込むの初めてなので標準的な尺度がいまいちわかりません。
コンパイルかけたファイルしか使わないと考えればいろいろと削れる部分はあるんでしょうけど、
そういう使い方するのが普通なんですかね?
Luaってどのくらいのサイズなんでしょうか?
0140デフォルトの名無しさん
2007/04/09(月) 20:17:31自分でexe作成して確認してみな。
そっちのが手っ取り早いぞ。
0141デフォルトの名無しさん
2007/04/10(火) 09:23:05それでかすぎな気がする
デバッグ情報はってない?
あとstdlibとかなしでそのサイズ?
0142139
2007/04/10(火) 18:40:41プログラムサイズが小さくなるような最適化設定にしてビルドしたら664KBでした。
両方ともreleaseです。
>>139
一応、プロパティの『デバッグ情報の形式』というところは無効になっています。
0144デフォルトの名無しさん
2007/04/10(火) 19:05:160145デフォルトの名無しさん
2007/04/10(火) 19:28:56Linux/gcc-4.1.2だとストリップ前が403926バイト、後が295940バイト
Linux/gcc-3.3.6だとストリップ前が390954バイト、後が281116バイト
…Luaと比べると非常に大きいな。
0146デフォルトの名無しさん
2007/04/10(火) 21:07:090147デフォルトの名無しさん
2007/04/10(火) 21:53:40配布ではバイナリ互換性が怪しくなってない?
GCCのバージョンを揃えないとリンクに失敗するとか(←これ本当?)
PerlもRubyもPythonもPHPもLuaもオールCで書かれているのはその辺の事情
と思う。
FirefoxやOpenOfficeはC++で別に問題ないが、オプソのスクリプトエンジンの
ジャンルはC++は駄目でCが適切らしい.
0148139
2007/04/10(火) 22:12:21ttp://www.wanderer.jp/diary/200702.html
ここのサイトの人がコンパイルかけたら270KBくらいだった言ってたり…
VS2005でビルドしてたんですが、gccでメイクしたら450KBでした。
うーん、まだ何かあるのかな?
0149デフォルトの名無しさん
2007/04/10(火) 22:25:40オープンでも C++ の実装も結構あるよ。
JDK, AVM2, Poly/ML, StrongTalk とか。
俺も C で書いた方が良いと思うけどね。
0150デフォルトの名無しさん
2007/04/10(火) 22:44:39JDKがC++と判明して、オプソ界では扱いづらいな...と思われてたりして。
0151デフォルトの名無しさん
2007/04/10(火) 22:48:23昔からソースは公開されていたし、nm すればソース見ないでも C++ だって
分かる人には分かっていたから大丈夫だよ。
0152デフォルトの名無しさん
2007/04/10(火) 22:52:18あー、そうなんだ。
0153デフォルトの名無しさん
2007/04/11(水) 06:46:14■ このスレッドは過去ログ倉庫に格納されています