1 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 13:02:21 ] LuaやSquirrelなどアプリケーションへの組み込み用途で 使われるプログラミング言語についてのスレッドです まとめwiki(なにか質問する前に必ずみること!) wikiwiki.jp/lua/ その他の参考URLは>2から ■過去スレ その3 pc11.2ch.net/test/read.cgi/tech/1160799232/ (前スレ) その2 pc8.2ch.net/test/read.cgi/tech/1063711237/ その1 pc5.2ch.net/tech/kako/1034/10341/1034182349.html
18 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 12:50:09 ] squirrel [名](複 〜s, 1で((集合的))〜) 1 《動》リス:肉は食用になる. 2 [U]リス類の肉[毛皮]. 3 ((米俗))変なやつ. ━━[動](〜ed, 〜・ing;((英))〜
19 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 13:34:15 ] ____ / \ /\ キリッ . / (ー) (ー)\ / ⌒(__人__)⌒ \ <過去の方式である感は否めない。 | |r┬-| | \ `ー'´ / ノ \ /´ ヽ | l \ ヽ -一''''''"〜〜``'ー--、 -一'''''''ー-、. ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒)) ____ /_ノ ヽ、_\ ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ だっておwwwwww /⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒) | / / / |r┬-| | (⌒)/ / / // | :::::::::::(⌒) | | | / ゝ :::::::::::/ | ノ | | | \ / ) / ヽ / `ー'´ ヽ / / | | l||l 从人 l||l l||l 从人 l||l バ ヽ -一''''''"〜〜``'ー--、 -一'''''''ー-、 ン ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒)) バ ン
20 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 14:28:03 ] >>18 欧米じゃリスを食うのか…
21 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 15:27:03 ] squirrelちゃん涙目wwwwwwwwwwwwwwww
22 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:35:26 ] なんでこんなところに子供が…と思ったら春休みか
23 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 07:50:55 ] 外国だとFreePascalでNintendo DSのソフト作ってる人多いな
24 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 12:59:11 ] Squirrelの正規表現なんですが local text = "ab abcd ab"; re <- regexp("a.*b"); local ret = re.search(text); print("begin, end = " + ret.begin + ", " + ret.end + "\n"); print("ret = " + text.slice(ret.begin,ret.end) + "\n"); > begin, end = 0, 5 > ret = ab ab こうなっちゃうのうちだけでしょうか?
25 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 16:05:19 ] 正規表現通りの結果でてる。Squirrelでなくてもそうなると思う
26 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 17:56:02 ] "a.*b" の * は欲張りだから本来 "ab abcd ab" にまでマッチするはずじゃない? Squirrel書いたことないので見当違いしてたらごめん
27 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 19:55:26 ] a.*?bだよな。
28 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 20:55:19 ] >>25 >>26 さんの言うように最後までマッチするはずなんですよ 秀丸と、Luaで試してみましたが最後までマッチします。 >>25 さんのところでも同じ結果がでますか? うちで何か失敗してるのかなぁ?
29 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 13:54:40 ] うちでもなるから最短マッチな実装なんだと思うよ。 不満なら直すか、他から持ってくるしかないんじゃなかろうか。
30 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 14:28:25 ] いやいや、最短なら ab で終了だろw
31 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 14:35:24 ] あ、そうか。間抜けな俺。 * は 0 個もありだよな ってことで、バグ認定でいいんでね?
32 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 22:11:46 ] .が任意の一文字で*がワイルドカードだとすると辻妻あうな
33 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 22:33:32 ] >>29-31 ありがとうございます どうもバグみたいですね 英語苦手だけど、なんとかレポート送っときます
34 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 17:43:40 ] >>33 レポート乙
35 名前:デフォルトの名無しさん [2008/03/31(月) 20:28:40 ] age
36 名前:デフォルトの名無しさん [2008/04/02(水) 00:55:25 ] なんか過疎ってるな。 swig + lua の組み合わせを最近多用している。 luaからswigで公開する型や関数のメタ情報を取得ってできる? 例えば関数の引数や戻り値の型名とか。 構造体のメンバ変数の一覧ならメタテーブル経由で取得できるけど。
37 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 18:28:21 ] >>36 luaは動的言語だから、戻り値や引数の型の分からんでしょう。 型は変数じゃなくて、値にくっついてる。
38 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 02:55:50 ] luaをネットワーク関係のライブラリ(httpを解釈できればいい) 辺りだけ組み込んで、最小構成にするとどれだけ小さくなりますか? 100kByte以下とかできる?(linuxのELFで)
39 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 10:05:33 ] それは質問する前に自分で試せるだろう。
40 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 17:48:01 ] 組み込みの状態でヴィジュアルデバッグができる言語ありませんか?
41 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 01:21:25 ] ヴィジュアルデバッグとか聞いたことなかったけど、そんな単語あるんだなw ICEとかじゃだめなの?言語に依存する内容じゃないように思うけど・・・
42 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 01:41:17 ] サイケデリック ヴァイオレンス & クライム オヴ ヴィジュアル デバッグ!
43 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 02:00:17 ] squirrel は SqDbg と SQDEV っての使うと eclipse からリモートデバッグできるらしいけど使ったことはない。
44 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 08:50:27 ] squirrelはちょっと・・・すみません。
45 名前:40 mailto:sage [2008/04/08(火) 20:26:03 ] >>41 ヴィジュアルデバッグは造語かもしれません。 GDBじゃないVisualStudioのような環境のことを指しています。 あと、「組み込み」は小型機器への組み込みではなく、 C++プログラムに対する組み込みの意味です。 いろいろ、すみません。 >>43 その組み合わせは非常に使えそうなので、ちょっと試してみます。 ありがとうございました。
46 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 23:53:24 ] GUIデバッガとか、ソースレベルデバッガ、って言うと思う。
47 名前:41 mailto:sage [2008/04/09(水) 01:12:39 ] >>45 ヴィジュアルデバッグでググったら多少引っかかったんで個人の造語ってわけじゃないと思うよ。 単純に俺が無知だっただけorz
48 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 22:34:43 ] sqplusでプロパティ(getterとsetterを普通の変数アクセスのようにみせるアレ) は作れますか?
49 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 02:03:48 ] Xtalで char script[] = " \ add: fun(a,b) \ { \ println(a+b); \ } \ sub: fun(a,b) \ { \ println(a-b); \ } \ "; AnyPtr compiled = compile(script); compiled(); こうやってコードをコンパイルする。 そのあと任意のタイミングで add(a,b)やsub(a,b)をCから呼ぶ方法がわかんない。
50 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 01:20:39 ] >>40 scite-debugを使えば、C/Luaプログラムを同じ環境でデバッグできるはず 使ったこと無いけど
51 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 23:22:53 ] xtal結構いいよな。 luaから乗り換えた。 つか作者はドキュメント整備してくれんかのぉ。
52 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 23:24:02 ] >>49 マニュアル嫁
53 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 09:57:04 ] Xtalいいな ネイティブスレッド対応か。
54 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 12:28:27 ] Xtalのページ見てみたけどよくわからん。 ゲーム重視だからパフォーマンス重視なんだろうけれども。 Xtalはお手軽に制御構文が書けてかつパフォーマンス重視ってところがいいのかな?
55 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 21:36:25 ] >>53 ちょまて Xtalってバーチャルマシンがスレッドセーフでできてんのか?
56 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 09:32:44 ] ゲームのスクリプトにlispってどう思います?
57 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 10:52:19 ] やってみたら?
58 名前:56 mailto:sage [2008/04/18(金) 11:05:19 ] そっすね
59 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 20:29:27 ] >>56 たしか、naughty dogがlispなんだよね
60 名前:デフォルトの名無しさん [2008/04/21(月) 03:11:15 ] 誘導されてきました。 現在C++とSquirrelでSTGを作っています。 Sqruirrelスクリプト側からC++の関数を呼ぶためには、 SQInteger func(HSQUIRRELVM v) という形のグローバル関数でなくてはいけないんですが、スクリプト側から特定のオブジェクトを操作したいと考えています。 しかし、上の形だと動的メソッドでもないし、引数にオブジェクトへのポインタが含まれていないため、どうやって呼び出そうか困っています。 HSQUIRRELVMはスタックになっているので、スクリプト側に操作したいオブジェクトのポインタをあらかじめ渡しておいて 必要なときにスタックにぶち込んで引数として利用しようと考え、 /*Squirrelスクリプト*/ function ExeScript(p) /*引数はポインタ*/ { SetVelocity(p, 0, 5, 0); /*引数は操作するオブジェクトのポインタ、x方向の速度、y方向の速度、z方向の速度*/ return 0; } /* HSQUIRRELVMのスタックには 1(top):roottable, 2:p, 3:0 4:5 5:0)となっているはず*/ というようなスクリプト側の関数を作り、ExeScriptをC++側から呼び出す時に 引数に呼び出し側のポインタをぶち込んであげようと思ったんですが上手くいきません。 ちなみにpはスクリプト側ではint型で扱っていて、ExeScriptが呼ばれたときにintにキャストし、 SetVelocityが呼び出されたときにポインタにキャストするようになっています。 何かいい方法はないでしょうか? もしくはセオリーなどを教えていただけませんか?
61 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 03:12:37 ] 申し訳ありません、上げてしまいました
62 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 03:13:14 ] プログラム板では質問は age 推奨
63 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 03:19:01 ] 個人のゲームなんですかねえ
64 名前:デフォルトの名無しさん [2008/04/21(月) 08:12:31 ] まずポインタをデバッガで追ってみりい。 スタック操作で単純にミスしてるだけな気がするよう。
65 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 11:04:50 ] >>60 オブジェクトをIDで管理すればポインタを持たなくても IDでやり取りできるんじゃない?
66 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 19:30:36 ] >>60 そのC++オブジェクトをSquirrelのオブジェクトとして登録してみるのは?
67 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 08:12:10 ] Squirrelあきらめます。ありがとう。
68 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 11:19:04 ] www まあ正直聞いててスクリプトでやるようなことじゃないと思ったわ
69 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 22:55:42 ] >>64 スタック操作確認して怪しいところ修正したら動きました。 本当にありがとうございました…。 >>65 次改造するときに試してみます。 >66 そんなこと出来るのでしょうか? Squirrelのクラスについてもう少し学んでみようと思います。 >68 たしかにそうかもしれません…。
70 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 22:57:50 ] >>60 こんなんはどう? SqPlusを使うけど。 /*c++*/ /* c++クラスをsquirrelにexport */ SqPlus::SQClassDefNoConstructor<SomeClass> def(_T("SomeClass")); /* メソッド定義 */ def.func(&SomeClass::SetVelocity, _T("SetVelocity")); SomeClass* object = new SomeClass(); /* Squirrelの関数呼び出し用オブジェクトの取得 */ SqPlus::SquirrelFunction exeScript = SqPlus::SquirrelFunction<int>("ExeScript"); /* 関数実行。型がsquirrel用に変換可能であれば、 内部で変換されSquirrelに渡される。 */ exeScript(object); --- /*squirrel*/ function ExeScript(object) { object.SetVelocity(0,5,0); return 0; }
71 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 19:09:00 ] >>69 ホストのポインタをvm内に格納するばあい userpointer型を使うとかsqclassのインスタンスにsq_setinstanceupするのが適当
72 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 02:39:32 ] luaの関数をCの値として保持しておくことはできるんでしょうか? luaスクリプトからコールバックを登録して、Cから適宜呼び出す、ということをしたいのですが。
73 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 08:27:31 ] >>72 LuaのC APIを使って、Lua VM内のグローバルにある関数を(値として)スタックに積むことはできる スタックに積まれた関数をLuaのC APIから実行することはできる でOK? この手の話題ってC側なのかLua側なのか、表現が難しいな。 上のSquirrelのやつもそうだが
74 名前:72 mailto:sage [2008/04/24(木) 16:15:42 ] >>73 ありがとうございます。Cの値として保持しておくことはできないんですよね。 それだと、Luaから渡された関数を適当なタイミングで呼びだすには、 関数を一旦スタックの深いところに置いておいて、必要な時にインデックスを使って呼び出す、という形になるのかな…。
75 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 17:42:07 ] >>74 LuaからCに関数名を渡せばあとでCのほうから探索できる。 関数を保持しとくのは無理かな、たぶん。
76 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 20:17:04 ] luaL_ref/unrefを使えっていう話?
77 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:39:23 ] >>76 それが一番質問者の期待しているものに近そう。 75に似た方法で呼び出す関数名を決め撃ちするのもあり。
78 名前:72 mailto:sage [2008/04/25(金) 01:33:55 ] >>75-77 ありがとうございます。マニュアル引き引き調べてみます。
79 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 09:10:05 ] コンパイル済みのsquirrelスクリプトを事前に変数かなんかに格納しておいて、後でvmに読み込む場合はどのようにすればいいのでしょうか? リファレンスなどを読んだ感じだとsq_readclosure()辺りを使うのかと思ったのですが資料をあまり見つけることができませんでした。
80 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 15:57:18 ] >資料 ソースを読めばいいじゃない。 そこらのライブラリとかスクリプトのような聞き方をされると違和感をおぼえてしまう。
81 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 08:25:13 ] でたーソース嫁攻撃
82 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 09:27:07 ] そりゃあ出るだろう ソース読むのが妥当な場面だもの
83 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 11:59:05 ] すべての質問は自分で調べろで片付く ある意味最狂
84 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 12:31:55 ] まぁ、極論馬鹿の脳内では今回の話もそこへ繋がるんだろうな、 というのは、容易に推察できることではある。 アホくさいけど。
85 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 13:30:40 ] 昔はハウトゥー本前提での自分で調べろって台詞だったが、 最近は面倒になりそうなのは全部自分で調べろって投げ捨てるよな
86 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 13:44:35 ] ソース嫁馬鹿に極論馬鹿にレッテル馬鹿の三つ巴ですかw
87 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 13:45:52 ] バカばっか
88 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 14:14:23 ] >>86 無理矢理三つ巴と思い込む暇があったら ソースでも読んでた方がいいと思うよ。
89 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 16:55:55 ] ソース読まない馬鹿は死ぬべきだな。
90 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 17:32:11 ] 春か…
91 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 17:39:41 ] ソースを読めば素晴らしい回答が在る、というのにお礼も言わずに、 アホなレス繰り返してる馬鹿のレベルが低いんだもの。 まぁ、読めないから回答者に喰いついてるんだろうね。 質問者は社会常識を身につけてから出直しておいで。 自分の立場を弁える常識は必要だよ?学生君。
92 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 18:16:20 ] ソース読んでどうにかなるレベルの奴がここで質問するわけがない
93 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 18:24:36 ] テンプレに追加案 【このスレは”質問スレ”ではありません】 ソースを読めば素晴らしい回答があります。 何時間掛かるかも分りませんが、まずはすべてのソースを読み理解する頃には質問の内容も解決している事でしょう。 また質問者は立場をわきまえ、回答者を崇めること。 このスレは雑談スレか
94 名前:デフォルトの名無しさん mailto:sage [2008/04/30(水) 19:35:46 ] 79の言ってることがよくわからないんだけど、 あらかじめ変数に読み込んでおいてというのは、 ファイル開いてファイルサイズ分メモリを確保して、そこにreadするということか? それでそのバッファのポインタを渡して読み込ませたいってこと?
95 名前:79 mailto:sage [2008/05/01(木) 02:06:38 ] 忙しくてレスできませんでした。 >>80 とりあえずソース読んで分からなかったらまた尋ねるかもしれません。 >>94 94さんの言うとおりファイルサイズ分メモリを確保しておいて、そこにファイルを読み込ませ、そのメモリからオブジェクトにデータをロードさせようと 思っています(do_fileやload_fileなどを使うといちいちファイルにアクセスして負荷がかかるため)。 現在はchar*にスクリプトを読み込ませておいて、オブジェクト生成時にコンパイルしていたのですが、 コンパイルにかかる負荷がバカに出来ないと考え「コンパイル済」のスクリプトをメモリに保存しておいて運用したかったのでその方法を質問させていただきました。
96 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 03:37:06 ] コンパイルドバッファだったと思う。 ttp://wikiwiki.jp/lua/?Squirrel か もんしょの巣穴っていう個人さんのサイトに解説あった気がする。 違ったらヘッダをcompで検索すれば出てくると思う。 眠いからこれ以上は書けないZzzz
97 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 03:41:20 ] ああ勘違い、コンパイル済みスクリプトをバイナリで保存しておいて読み込みたいのね? 役に立てないZzzz
98 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 11:25:29 ] 本人が言ってるとおりsq_readclosureでいいんじゃないのか
99 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 12:14:36 ] 私はLuaの方の人だから見当違いかもしれないと前置き。 sq_readclosureでよさそうだけど解説があまりないから 断片的な情報とソースから推測するしかないって感じかな。 ソースはsqstdio.cppにあるsqstd_loadfileの実装が参考になりそう。 ところでsqstd_loadfileは関数を評価せずにスタックに 積むだけみたいだから、その参照を保持しておくだけで 用が足りたりしないのかな。
100 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 01:18:42 ] 流れぶった切るけどスマソ。 Lua側の関数に引き渡した0xFFFFFFFFってリテラルが、C側からlua_tonumberで取ってくると0で返却されるのは既知? さらに、0xFF00FFFF -> 0xFF010000なんて取れてきたりする。 どうもVC8だと起こるらしくて、gcc系だと引き渡したリテラルが正しく取れるんだけどなぁ。
101 名前:79 mailto:sage [2008/05/02(金) 02:27:06 ] sqstd_dofileは内部でsqstd_loadfileを呼び出していたため、sqstd_loadfileの中を見てみました。 sqstd_loadfileの中には外部から読み込んだファイルがバイナリであるかテキストであるかを判定する文があり、 バイナリの場合はコンパイルせずにそのままsq_readclosureによってスタックに読み込んでいることが分かりました。 そこで、sqstd_loadfile冒頭のsqstd_fopen(fopenと同じ働き)を削除し、loadfileの引数のファイル名の変わりに(FILE*)型のポインタを 渡してやるようにし、また、(テキストファイルは扱わないため)テキストであった場合の分岐を削除してみました。 これは成功すると思ったのですが(おそらく)こちらのコーディングミスでメモリ関係のエラーが出てしまいました。 こちらを直して正常に動作するようならまた報告したいと思います。 >>99 スタックトップに積むようなので、sq_move(dest, src, -1)といったように設定してやればいいんですかね? 試してみます。 ただ今回の件でSquirrelのスタック周りの操作についてほぼ無知であることが分かったため、もう少し勉強してからトライすることになると思います。
102 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 14:13:56 ] >>100 Luaは整数を小数として扱ってるからその辺りが関係あるのかなぁ。 あと、高速化のためか整数←→小数の変換には 単なるキャストを使っていたり、アセンブラ命令を直で使っていたりする。
103 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 17:37:50 ] >>102 luaconf.hの中のlua_number2intの定義の所ね。 _MSC_VERでifdefしてる個所もある@5.1.3 LUA_ANSIをdefineして直ったらここが原因だろう。
104 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 20:16:36 ] >>100 Direct3D使ってたら浮動小数点演算の精度が24bitになってる可能性あるんで D3DCREATE_FPU_PRESERVE を調べるといい。 ただ値の受け渡しだけはできるはずの気がするが。
105 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 16:16:35 ] lua_xmoveが使える条件に、「同じグローバルステートの異なるスレッド」ってあるんですが これってどういう事なんですか? 同じlua_Stateから派生したスレッド同士なら良いということですか?
106 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:37:37 ] >>105 それを使ったことはないけども・・・ coroutine作ると新しいlua_Stateが作られるけど、それは元のlua_Stateとグローバル情報を共有してる。 だからxmoveが使えるのは、元のVMから作られたcoroutineを示すlua_State(および元のVM)間だけ、ということかと。 「スレッド」って言うとOSスレッドのように聞こえるから、混乱を招くので敢えて使いたくないんだよね・・・。
107 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 03:48:30 ] >>101 FILE*つかってんなら load_file を忌避する理由がさっぱりわからんわけだが……。 バイトコード判定は残しておくほうがいいよ。作業中はテキストにしておいて、 リリース時に sq.exe つかって全部バイナリにしてしまえばおk // データ保持用クラス。ポインタだけだと終端がわからんので必要 static class DataBuffer { const u_char *data; u_int size; u_int pos; public: DataBuffer(const u_char *data, u_int size) : data(data), size(size), pos(0) {}; u_int getLeftSize() {return size - pos;} void copy(void *buf, u_int size) {memcpy(buf, data+pos, size); pos += size;} }; // sq_readclosure 用 SQREADFUNC static SQInteger buffer_read(SQUserPointer file,SQUserPointer buf,SQInteger size) { DataBuffer *data = (DataBuffer*)file; u_int dsize = data->getLeftSize(); if (size > dsize) {size = dsize;} if (size > 0) { data->copy(buf, size); return size; } return -1; } // スクリプトのメモリからの読み込み SQRESULT readscript(HSQUIRRELVM *v, const u_char *data, u_int size, SQBool printerror) { unsigned short us = *(unsigned short *)data; if (us == SQ_BYTECODE_STREAM_TAG) { DataBuffer buf(data, size); return sq_readclosure(v, buffer_read, &buf); } else { return sq_compilebuffer(v, (const SQChar*)data, size, "memory", printerror); } }
108 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 11:17:07 ] どうにも理解しがたいので、質問させてください。 Lua 5.1.3 @ VS2005Proです。 #include <stdio.h> #include <lua.hpp> int main(int argc, char* argv[]){ lua_State* Lbase = lua_open(); lua_State* L[10]; for(int count = 0; count < 10; count++){ for(int i = 0; i < 10; i++){ L[i] = lua_newthread(Lbase); // 何か実行 if(luaL_dostring(L[i], "a = 0;")){ printf("err : %s\n", lua_tostring(L[i], -1)); } } } return 0; } これを実行すると、i = 1の時のlua_newthreadで落ちるんですが これはどう対処すればいいんでしょうか・・・
109 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 12:06:07 ] >>108 lua_newthreadはあくまでコルーチンを作る関数だから、 それで作られたlua_Stateはコルーチンの流儀でしか使えないんじゃないかな? つまり、lua_resumeを使えと。 あとlua_newthreadはスタックにスレッド(コルーチン)オブジェクトを積むので、 使い終わったらpopするとか、グローバルに置くとか、なんとかしてやる必要がありそう。 思うに、Lua側からcoroutine使ったほうが余計なことを考えずに済むような気がするけど。
110 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 16:24:33 ] >>109 ありがとうございます。 そもそもこんな使い方をするものじゃない、ということですかね。 どうやら根本的に考え方がおかしかったようですね・・・ >>105 も私の書き込みです。遅れましたが、>>106 さんありがとうございます。
111 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 17:29:29 ] >>72 lua_tofunctionでググれば出てくるよ
112 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 22:54:29 ] Python スレに行くべきかとも思ったのですが、一応 Lua の話題なので こちらで質問させてもらいます。 The Implementation of Lua (ttp://www.jucs.org/jucs_11_7/the_implementation_of_lua/jucs_11_7_1159_1176_defigueiredo.html) の5章第3パラグラフの最初に "Most procedural languages avoid this problem by restricting lexical scoping (e.g., Python)" と書いてあるのですが、Python のレキシカル・スコープはどのような点が 制限されているのでしょうか?ご教授いただければと思います。
113 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 12:01:15 ] クロージャ関係のようだけど... なんか今そのLuaのドキュメントのあるサイトが落ちてるみたいなので 覚えてたらまた見てみますね。
114 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 16:40:29 ] 5章の最初のところね。そこで言いたいことはわかるんだけど、Pythonに、そこで 言ってるような制限は無いように思うんだな。昔のバージョンではそういう制限が あったのかもしれないけど。 実際、Figure 3. が意味しているコードはPythonで問題なく書ける。 def add(x): def tmp(y): return x + y return tmp add2 = add(2) print add2(5) その Most procedural ... の前の 2 パラグラフが言いたいことはわかってるよね?
115 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 17:45:25 ] wikiのsquirrelのAPIリファレンスが行数オーバーとか言われてるけど
116 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 01:46:31 ] >>114 5章の最初のパラグラフは、add によって返される関数はその内側のスコープにない変数 (レキシカル変数?でいいんですよね)x を参照しているから、add の処理から抜けて スタックから x の情報がなくなってもその情報も保持してないとまずくて、そのために 必要なのがクロージャですよ、って話ですよね。 僕も >>114 さんのいうように、Python にここでいうような問題点はないように思い、 質問させてもらいました。 今日も少し調べてみました。まず、以下の議論からもわかるのですが ttp://groups.google.co.jp/group/comp.lang.python/browse_thread/thread/dc4a74fd67f99614/fd1ad89d9b36c633 Python はレキシカル変数は immutable である、という制限(仕様)があるようです。 ひょっとすると、たしかに Python には制限があるものの、Figure 3 で例示されているの は飽くまでクロージャの必要性を示すためのコードで、Python の制限を示すためのものでは ない、ということではないでしょうか?
117 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 09:51:37 ] 別のサンプルでmutableに見えたのでうっかりしていたのですが、 def init(x): def chg(y): x = y def get(): return x return (chg, get) chg, get = init(0) print get() chg(1) print get() 実行すると 0 0 になりますね。そういうことでいいと思います。
118 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 11:26:01 ] >>117 やはりそういう理解でいいんですかね。 お付き合いいただきありがとうございました。