プログラミング言語 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
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:140154デフォルトの名無しさん
2007/04/11(水) 07:38:08VS2005で、SquirrelをDLL化して
Releaseビルド220Kだよ
0155139
2007/04/11(水) 13:13:13それって『構成の種類』をdllに設定してビルドするってことですか?
たしかにsquirrel.dllが170KBくらいで軽くなっているんですが、
sqstdlib.dllがエラーで作成できない…。このリンクエラーどうしました?
0156139
2007/04/11(水) 15:34:58libのサイズってコンパイルさせるために必要なデータが入ってるから
dllより重くなるみたいですね。知りませんでした。
実行ファイルのサイズに影響する分のサイズは二つのlibでだいたい270KBくらいなんだと思います。
ありがとうございました。
0157デフォルトの名無しさん
2007/04/11(水) 16:46:14Rubyは作者が、オブジェクト指向の言語をオブジェクト指向の言語で書きにくいと言ってる。
>>153
どの辺が?
サイズ大きいのは別に害じゃないと思うけど
0158デフォルトの名無しさん
2007/04/22(日) 00:44:070159デフォルトの名無しさん
2007/04/28(土) 20:45:470160デフォルトの名無しさん
2007/05/08(火) 17:11:310161デフォルトの名無しさん
2007/05/09(水) 20:26:56http://wikiwiki.jp/lua/?Squirrel
Squirrelの参考リンク参考になりました。
サンクス。
0162デフォルトの名無しさん
2007/05/13(日) 11:16:32Squirrelで
sq_open使うと
ハンドルされていない例外 : System.TypeLoadException: アセンブリ 'squirreltest, V
ersion=0.0.0.0, Culture=neutral, PublicKeyToken=null' から型 'SQVM' を読み込めま
せん。
at main()
みたいなメッセージでる。調べたけどわからん
助けて
0163デフォルトの名無しさん
2007/05/13(日) 11:33:09なんでこうなるのかよくわからんけど
0164デフォルトの名無しさん
2007/05/13(日) 11:41:18自己解決したら、解決法をかけとあれほど・・・
0165デフォルトの名無しさん
2007/05/13(日) 11:52:471. MyProject.cpp ファイルに次のコードを含みます。typedef struct _t_Struct *myStruct;
2. 手順 1 で探したコードをの後、次のコードを追加します。 struct _t_Struct
{
};
を書いて
t_Structの部分をSQVMにしたら動いた
プログラム初心者なんで意味がよくわからないし本当に治ってるのかわからないけど
0166デフォルトの名無しさん
2007/05/16(水) 15:52:01今ゲームに組み込んでるのでそこで得た知識をいずれ記事にしてまとめるかも
コードのどこを削るかとか、Windows以外で使うときにメモリ確保部分をどう書き換えるかとか
0167デフォルトの名無しさん
2007/05/16(水) 17:29:10マジで期待したいです。
0168デフォルトの名無しさん
2007/05/16(水) 23:03:00ttp://d.hatena.ne.jp/xtalco/
0169デフォルトの名無しさん
2007/05/18(金) 00:35:540170デフォルトの名無しさん
2007/05/18(金) 20:11:56ざっと目を通しただけなので細かいところはわからないけど、
C++への組み込みに使用するとき、スタックを意識せずによいみたい。
残念なのは、ソースがVC依存ぽいところ。
0171デフォルトの名無しさん
2007/05/23(水) 03:05:54むしろ、レス見てると、gcc依存っぽいが。
0172デフォルトの名無しさん
2007/05/23(水) 17:33:52xtal-language - Google Code
http://code.google.com/p/xtal-language/
こっちを出さないと
0173デフォルトの名無しさん
2007/05/23(水) 20:38:360174デフォルトの名無しさん
2007/05/23(水) 22:20:10おまー、mixiのluaコミュでも同じ質問してるだろ
0175デフォルトの名無しさん
2007/05/23(水) 22:38:270176デフォルトの名無しさん
2007/05/23(水) 23:36:38なんか凄いところで紹介されてるね
■404 Blog Not Found
君は新言語xtalを知っているか?
ttp://blog.livedoor.jp/dankogai/archives/50836939.html
0177デフォルトの名無しさん
2007/05/23(水) 23:59:34ver5.1使ってるんですけど日本語化パッチが5.02までしかないみたいなんで
sjisに対応できないんですよ。まあ出るのを待ちますか。
0178デフォルトの名無しさん
2007/05/24(木) 00:01:39自分で改造するんだ!
0179デフォルトの名無しさん
2007/05/24(木) 07:36:570180デフォルトの名無しさん
2007/05/24(木) 14:31:10これはどう?
Lua@空想具現化プログラミング
http://hammm.dw.land.to/lua/
0181デフォルトの名無しさん
2007/05/26(土) 21:53:290182デフォルトの名無しさん
2007/05/26(土) 22:25:110183デフォルトの名無しさん
2007/05/30(水) 16:12:03C++ネイティブからOpenGL使っているところを、一部分のOpenGL関数だけ
Luaから呼びたいんですけど。
0184デフォルトの名無しさん
2007/05/30(水) 17:36:39WikiLuaだっけ
0185デフォルトの名無しさん
2007/05/30(水) 18:38:340186デフォルトの名無しさん
2007/05/30(水) 19:06:52自分で書いて命令増やしたりしてたな。
HDDと共に吹っ飛んでもう手元にないが。
0187デフォルトの名無しさん
2007/06/02(土) 16:37:36GCCのABIがかわったのは、C・C++関係ないだろ。
0188デフォルトの名無しさん
2007/06/02(土) 16:39:26は、どうした?
0189デフォルトの名無しさん
2007/06/06(水) 20:10:290190デフォルトの名無しさん
2007/06/07(木) 07:23:060191デフォルトの名無しさん
2007/06/07(木) 20:10:15squirrel.dllを作ろうとするのですが、失敗します・・・
うまくできた人いない?
■ このスレッドは過去ログ倉庫に格納されています