09/05/25 09:15:36
■関連してるかもしれないスレ
Io Language
スレリンク(tech板)
2 part forth
スレリンク(tech板)
●●●●TCL/TKなら俺に聞け 2●●●●
スレリンク(tech板)
ECMAScript デス 3
スレリンク(tech板)
各種ライブラリ紹介スレ2(ゲ制作)
スレリンク(gamedev板)
【Perl,PHP】LLバトルロワイヤル5【Ruby,Python】
スレリンク(tech板)
「コンパイラ・スクリプトエンジン」相談室13
スレリンク(tech板)
Garbage Collection (GC)について語るスレ
スレリンク(tech板)
3:デフォルトの名無しさん
09/05/25 09:17:28
■参考URL
■Lua
URLリンク(www.lua.org) (本家)
URLリンク(lua-users.org) (lua-users)
URLリンク(luaforge.net) (LuaForge)
URLリンク(sugarpot.sakura.ne.jp)(5.1マニュアル和訳)
Lua言語の紹介
URLリンク(staff.aist.go.jp)
入門Luaプログラミング
URLリンク(www.amazon.co.jp)
■Squirrel
URLリンク(www.squirrel-lang.org) (本家)
URLリンク(sourceforge.net)
URLリンク(sourceforge.net) (SqPlus)
URLリンク(sourceforge.net) (Squirrel Shell)
URLリンク(wikiwiki.jp)(wiki内2.1マニュアル和訳)
■Xtal(ゲーム向け。スタックを意識しなくていい?)
URLリンク(d.hatena.ne.jp)
URLリンク(code.google.com)
URLリンク(blog.livedoor.jp)
4:デフォルトの名無しさん
09/05/25 09:18:54
■よく分からないので前スレからコピペ
10 名前:デフォルトの名無しさん[sage] 投稿日:2008/03/11(火) 21:17:18
RubyもPythonも組込めるけどなあ。
Perlはさすがにやったことないが、できないこともないだろう。
11 名前:デフォルトの名無しさん[sage] 投稿日:2008/03/11(火) 22:39:02
RubyにしてもPythonにしても標準ライブラリや言語機能がでかすぎにみえる。
組込みに向いてるってのはコードサイズまたは外部への依存の少なさと
言語機能のバランスが取れてるって意味にではないのかと。
12 名前:デフォルトの名無しさん[sage] 投稿日:2008/03/12(水) 01:23:20
没になったテンプレ案には書いてあったけど、
そういう比較的大きな言語の組みこみの話も
多少は許容することが前スレで同意されていたはず。
でも一応Luaスレの続きだからその辺は空気読んでねと。
■没テンプレ
The Pawn language(だれも使ってなさそうな、組み込み言語)
URLリンク(www.compuphase.com)
NullLogic Embedded Scripting Language
URLリンク(sourceforge.net)
※テンプレ以上※
5:デフォルトの名無しさん
09/05/25 09:49:57
1乙
6:デフォルトの名無しさん
09/05/25 13:22:42
次から AngelScript も足してあげていいんじゃないかとちょっとオモタ
7:デフォルトの名無しさん
09/05/25 13:27:34
■AngelScript
URLリンク(www.angelcode.com)
まとめwikiにテンプレのページ作ったほうがいいかな。
8:デフォルトの名無しさん
09/05/25 22:43:44
luaでlua_call する前に関数と引数をプッシュしますよね。そういう作業の前には
かならずlua_settop(L, 0)したほうがいいんですか?
lua処理の前後でちゃんとスタック深さが一致するようにプログラムを心がけていれば
不要なものなのでしょうか。
何かする前に必ずlua_settop(L, 0)するクセを付けておいたほうがいいのか、
それともそれはCでグローバル変数を必ず=NULLや=0で初期化しないときがすまないような、
ちょっとできなそうな人がやることなのでしょうか。プロフェッショナルはlua_settop(0)
なんていちいちやりませんか?
9:デフォルトの名無しさん
09/05/25 23:22:12
>>8
「かならず」などと言う杓子定規なスタイルで
プロフェッショナルになれるとは思えない。常識的に考えて。
10:デフォルトの名無しさん
09/05/25 23:56:40
新しいクマスレはここですか?
11:デフォルトの名無しさん
09/05/26 01:49:16
いいえ、ケフィアです
12:デフォルトの名無しさん
09/05/26 07:32:04
>>2
このスレは既に鯖移転してる物が含まれてるぞ。
プログラム板はpc12鯖だぞ。
13:デフォルトの名無しさん
09/05/26 09:04:08
>>8
場合によって異なる。バインダの一部として実装するときは
settopによる副作用(必要だった値がスタックから蒸発するなど)の方が心配なので、
それ無しでも正しく動作するよう慎重に実装するべき。
一方、本体側からスクリプト側のコードを呼び出す際は大抵は戻り値は不要なので
削除しても差し支えない。だからsettopを呼び出す方法もアリ。
もちろん、エラーや例外がスタックに入っている場合もあるのでその対応は必要。
同じ仮想スタック型言語であるSquirrelでもまったく同じことが言えるだろう。
14:デフォルトの名無しさん
09/05/26 09:10:19
>>7
公式サイトへのリンクだけでもいいから作ってあげてください( ´・ω・`)
15:デフォルトの名無しさん
09/05/26 12:22:10
luaでhoge=0xFF8888FF のあとに return hogeと書いてある関数があって、
この戻り値をlua_tostring() でとったときに0xff8888ffの10進数表記である
"4287138047"が得られることを期待していたのですが、
なぜか1インクリメントされた"4287138048"が入ってきてしまいます。
しかもコンパイル→実行しなおすとちゃんと "4287138047" が入ってたり、
あれ?と思ってもう一度やると "4287138048" だったりで、よくわかりません。
この現象についてなにか心当たりありますか?
16:デフォルトの名無しさん
09/05/26 21:07:59
luaスクリプト内をステップ実行して、挙動を眺めれば済む話じゃないか。
17:デフォルトの名無しさん
09/05/28 15:31:55
バグです
18:デフォルトの名無しさん
09/05/28 15:54:05
doubleの丸めかね?
19:デフォルトの名無しさん
09/05/29 00:19:33
>>16見て、GUIのデバッガ欲しいよなーって思って検索してたんだけど、
これって使ってみた人いる?
URLリンク(wikiwiki.jp)
20:デフォルトの名無しさん
09/06/03 22:12:04
SqPlusで複数VMが扱えなくて悩んでたのですが、
もしかしてSquirrelって基本的にVM一個だけ作るのが普通なの?
21:デフォルトの名無しさん
09/06/03 22:25:58
>>20
そんなこたー無い。sqplus が設計古いだけ
でも、実際問題として、VM複数扱うと、初期化処理とかめんどくさくね?
実行処理を複数保留するだけならスレッドつかえばいいわけで。
22:デフォルトの名無しさん
09/06/03 22:28:48
>>20
オレも以前そう思ってざっとソースを見たが、
VMが複数インスタンス動いたときに
static変数で干渉しそうなところは
エラーメッセージ関係くらいだった。
グローバル変数は探しにくいので確証は無い。
実際のところ、Tclなんかと違って複数VM間の通信手段が限られてるから
あまり使い勝手はよくないと思うよ。
23:デフォルトの名無しさん
09/06/04 02:00:12
>>20の言う複数VMって、STGでたとえると、
(1)敵1匹ずつにVMを持たせて個別に処理をさせる
(2)使う関数が異なる、背景のみの処理をするVMと、敵の出現パターンを管理するVMとを同時に動かす
のどっち?
24:デフォルトの名無しさん
09/06/04 05:22:10
sq_threadで派生VMを作ってスレッドで回したことはあったけど、
独立した複数VMを動かすのはちょっと用途が思いつかないなぁ
是非>>20のSquirrelの用途が知りたいなぁ。ゲーム以外なの?
25:デフォルトの名無しさん
09/06/04 08:10:20
23の2かな。
同じプログラムの中に、ゲーム用と3Dモデル変換などのツール用の2系統あって、
混在して使うことがないので分けたいなと思いました。
26:デフォルトの名無しさん
09/06/04 11:15:30
なるほど完全分離してる部分か。それなら納得。
C++ 側で HSQOBJECT でデータ保持するオブジェクトとかを組む場合にちょっとややこしいことになるね>複数VM
たしか sqplus はそのあたりの処理がすごく変なことになってた気がする。本当にまともに動くかどうか怪しい。
scrat はきっちり書いてあると思う。
それにもからんで、C++インスタンスからベースVMにアクセスしたくなる局面がたまにでてくるんだけど、
複数VM×複数スレッド使ってるとそこで困る。コンストラクタ含むメンバ呼び出しで引数に渡ってくるVMは、
あくまでスレッドのVMで、ベースVMじゃない。単独VMなら必殺技グローバル変数が使えるけど
複数VMだとそれでは特定できない。
この問題は sq_getforeignptr/sq_setforeignptr を使えばたぶん解決する。
sq_newthread で生成されたスレッドVMに、ベースVM の値をこれをつかって隠しパラメータと
して持たせるようにして、インスタンスからはこれで取り出して使うようにすればいい。
squirrel 側を拡張して、VMの親子関係を取得できるAPIを増設かなと一瞬思ったけど、
squirrel の構造的には、新規生成したスレッドVMと元のVMは完全に同格 (親子じゃなくて友達)
なので、この get/setforeignptr で正解だと思う。
27:デフォルトの名無しさん
09/06/05 02:32:54
>>26
SqPlusは変というか、VM本体に対して余計なことをしている。
new()で作り捨てたクラスにVMのハンドルを管理させるようなことをしてるから、
main()関数を抜けた後でしかSquirrelの開放処理が行われなくなる。
こんな動作だと、フレームワーク解放前にリリースしないといけないC++側のオブジェクトの開放ができなくなる。
既に指摘はしてるんだが、開発者はその重要性がわかってないようだ。
一応複数のVMの対応はされてるように見えるが、実際に動かしてみないとなんとも。
scratはきっちり書いてあるんでなく、なにもやってないだけ。
こっちは試しに動かしてみたが、まだまだ完成度が足りない。
指摘したら開発者黙り込んじゃった。
SQBindのほうがややましかな。ちょこちょこといじれば何とか使えるレベル。
28:デフォルトの名無しさん
09/06/05 03:18:56
fork しちゃいなよ
29:デフォルトの名無しさん
09/06/05 03:20:24
Sq++か
30:デフォルトの名無しさん
09/06/05 03:42:02
>>27
ああ、なにもやってないの重要というか、オブジェクト保持用のクラスは明示的に
VM 指定の口をもってて取り回しするように書かれてるから、これなら完全に
ユーザの管理下におけるね、と思ったんだ。
SQPlus のほうはいきなり中の見えないとこで VM 管理してるグローバルな変数を
呼び出したりしてるから、いろいろ切り替えたりいじったりしてるうちに間違いなく
破綻すると思う。切り替え処理がグローバル変数に代入とか怖すぎる。
まあ、実はぱっと全体眺めただけで全然使ってみてはないんだけどね > sqrat
とりあえずあのメンバ変数の処理機構はいろいろ難ありだなーと思う。
あとインスタンス返す処理あたりもなんか微妙
sqbind はぱっとみ泥くさかったのであんままじめに見てない
31:デフォルトの名無しさん
09/06/05 03:56:50
>>30
そう。VMのハンドルはユーザーの管理下におき、ユーザーの望むタイミングで
開放処理( sq_close() )が行えるようになってないと正しく終了できないじゃないか。
Sqratはなかなか筋がいいが、まだ作者がSquirrelの仕組みをよく理解できてないみたい。
メンバ変数の登録・呼び出しだけど、あれが普通だと思うよ。
この辺はSqratもSqBindもSqPlusも大差ないはず。(_get/_set乗っ取り)
SqBindはスレの進行である程度バグが直ってるのでまあ使えないことも無い。
しかし事実上SqBindクラスしか使えない構造になっていて、
意外にバインダ自体のカスタマイズの自由度が低い。
私自身はjkBindを買っていて、あのboost式の書き方はなかなかいけてると思うんだが、
(特にバインドするC++クラスのコンストラクタの登録の仕方が出色の出来)
ドキュメント・ユーザーが皆無なのでいまさら使ってくれる人がいるかどうか。
以前、数日かけてSquirrel-2.2.2-stableまでに追加された仕様にあわせた
追加実装をして、フォーラムに貼り付けたんだが。
32:デフォルトの名無しさん
09/06/05 04:48:08
>>31
sqplus は、メンバ変数を登録しようとするまで _get/_set のっとったりしないのでその点は許容範囲w
sqrat はたしか問答無用でもってかれるよね。
個人的には、スクリプト側での継承性を重視してて、メンバは 必ず getter/setter の形の
メソッドとして squirrel 側に登録する形にしてるんだ。
C++ 側で getter/setter がなくて public なメンバーになってる場合でも、
その場でテンプレートで struct 内に static な参照用関数つくってそれを登録してしまう形にする。
だから、そのあたりのバインダの今の機構はまるごといらない。
ちなみに_get/_set 自体は、メンバが存在してなかったら、その名前に合致した
getter/setter を探してそれを呼び出すって形の機能を組んで使ってる。
jkBind はどんなだったかよく覚えてないや^^; 当時はまだテンプレートよくわかってなかったし、
なんかややこしいなと思って放置したような……
今、自分がメインでさわってる範囲だと、C++ のクラスのほうの形を固定化してる
ので、わりと手作業部分が多い形の簡単なバインダ書いてつかってるんだけど、
よそからもってきたライブラリの接続用に、もっと汎用的になってるのがほしくて、
一応 sqplus 使ってたんだけど、ちょっとなぁってことでもろもろ乗り換え検討中。
sqrat がとりあえずの筋はよさそうなので改造して使おうかなぁ。
33:デフォルトの名無しさん
09/06/05 07:12:40
>>32
オレの場合、setter/getterは原則用意しない。
メンバ変数のみのstruct的なもの、メソッドのみのclass的なものに大抵は分かれる。
その説明だとC++メソッドをどう登録するかの説明が無いみたいなんだけど……?
それから、SqBindの場合、_get/_setはバインドしたメンバが無い場合は
キャンセルされてSquirrel側に制御が戻る。
だからバインドした後でSquirrel側から登録したものを呼び出したり(これは確認)、
継承したりも有効(これはたぶん)
オレはバインドされたC++側のインターフェイスの固定さ加減を自分で信用してないので、
バインドしたSquirrelクラスをさらに継承したりはしないようにしている。
そうするときは包含にするね。
そういや、Squirrelはプロパティがほしいかも。
34:デフォルトの名無しさん
09/06/05 10:34:09
何かややこしそうなので俺はAngelScriptを使うぜ!
35:デフォルトの名無しさん
09/06/05 11:50:44
実際ややこしいだろ
自動生成したコードを手動でデバッグするんだからな
36:デフォルトの名無しさん
09/06/05 12:15:10
あー、つまり
ボトルネックじゃない所を自動化しちゃってる可能性もあるわけだ。
37:デフォルトの名無しさん
09/06/05 12:56:24
>>33
普通だよ~ > C++ メソッド
関数ポインタとか必要な情報をクロージャにバインドさせておいてそれをつかって
呼び出す。sqplus とかとでやってるのと同じ。
後から登録したのが有効なのは順番が逆だよ。_get/_set がスルーしてるんじゃなくて、
squirrel 的に見つからなかったときに初めて _get/_set が呼ばれてる。
_set/_get でスルーした後は、squirrel 側ではメンバ見つからなかったよ例外になるだけ。
squirrel のメンバは常時上書き処理でつぶされるので、メンバの継承はできない。
C++ 側の継承概念を一貫性をもってひきこむにはメソッド化するしかない。
_get/_set で C++のメンバ参照を実現してる場合、そのメタメソッドを直接呼び出せば
元のC++のメンバは見れるけどそれは継承じゃないだろうと。
あと、メタメソッドは機構上、必ずインスタンスに張り付いてるそれが呼び出されるようで、
メタメソッドを上書きしてから親クラスのそれをよびだそうとしても自分のそれが
呼び出されて無限ループになるって罠もあったり <はまった
バインドされた C++ クラスの扱いは、まあ、好みの問題ってことで。
おいらは、squirrel だけで書いたクラスと同感覚で使いたい人
>そういや、Squirrelはプロパティがほしいかも。
↓これがプロパティもどき
>ちなみに_get/_set 自体は、メンバが存在してなかったら、その名前に合致した
>getter/setter を探してそれを呼び出すって形の機能を組んで使ってる
setter / getter 両方あれば読み書き可能プロパティ、getter だけなら
読み込み専用プロパティ、setter だけなら書き込み専用プロパティ、でまあ、ちゃんと
それっぽくできてる。その機構用に使ってるからバインダは勝手につかわんでくれってのもある
38:デフォルトの名無しさん
09/06/05 13:14:13
ボトルネックじゃないところを自動化してもらえるんなら大いに結構じゃないか。
39:デフォルトの名無しさん
09/06/05 13:47:55
>>37
あれ? すると、ちょっと解せない動作があるな。
C++側で定義したPointクラスをSquirrelにバインドしているんだが
このインスタンスに対する加算を
function Point::_add(point)
の形でSquirrelスクリプトの中で追加登録している。
この状態でインスタンスに対して加算を行われると、いったんSqBindのgetterを呼び出して失敗してから
_addが呼ばれているように見えるんだな。
メタメソッドは元から通常のメンバ・メソッドとは違う扱いになっているからそれでかなぁ。
# 例えばインスタンスに対してforeachをかけても登録したメタメソッドを検出できない。
40:デフォルトの名無しさん
09/06/05 15:34:28
>>39
あー、なんかわかった。俺の理解はおかしかった
>あと、メタメソッドは機構上、必ずインスタンスに張り付いてるそれが呼び出されるようで、
>メタメソッドを上書きしてから親クラスのそれをよびだそうとしても自分のそれが
>呼び出されて無限ループになるって罠もあったり <はまった
これ間違い
メタメソッドは登録時に特殊処理されてて、クラスオブジェクト内の専用のテーブルに格納されてて、
メソッドとしてそもそも生えてない模様。 (class オブジェクトの _metamethods につっこまれてる)
クラスオブジェクトにメソッドが生えてないから、当然インスタンス側にもコピーされてきてない。
インスタンスでのメタメソッド呼び出し処理は、VM内から直接クラスオブジェクト内の _metamethods を見に行ってる
こんなかんじで呼び出そうとしてたんだけど(ちょっとうろおぼえコード)
function _get(name) {
if (自前処理) {
return XXX;
} else { // みつからないので親に投げる
return Parent::_get(name);
}
}
1. Parent::_get はそもそも存在してない(メタメソッドなのでクラスにも生えてない)
2. Parent::hoge のようなクラスメソッド呼び出しは、VM側がコンテキストをすり替えて this コンテキストで呼び出し開始されてる
3. 存在してないから今のコンテキストの _get が "_get" を探すために呼び出し開始される
4. 無限ループ
こんなオチではないかと
そちらのほうだと、Point::_add() をよびだそうとした時点で同じことがおこってるんじゃないかな。たぶん。
その先がちょっとわからんのだけど、もしかしたら SqBind がさらにテーブルから検索して呼び出すとか
そういう処理が入ってたりするのかな?
どちらにしても大変気持ち悪いことになってるってことになるんじゃないかと…
41:デフォルトの名無しさん
09/06/05 15:57:59
>>40
スクリプト言語的にはメタメソッドも通常のメンバのように見えているべきなんだけど、
おそらく動作効率上の問題でそうなっているんだろうね。
メタメソッドの存在チェックはAPIが存在しないかもしれない。
Sqratがちょうどそんな実装で、バインドしたメンバの一覧に_getで呼び出されたメンバ名が存在しない場合、
エラーを返さずに何もしないものだから、
Squirrelインタプリタは返ってきたnullに対してメタメソッドの呼び出しをかけようとして失敗してる、んだったかな。
とにかくバインダ側で登録する_getは、管轄外メタメソッド呼び出しに対してはfalseまたは例外を返してあげないといけない。
Squirrelインタプリタの実装側ももうちょっとやりようがありそうな気がするけどね。
42:デフォルトの名無しさん
09/06/10 14:06:39
androidでlua使える
URLリンク(code.google.com)
43:デフォルトの名無しさん
09/06/11 00:03:37
久しぶりにRSS更新キターと思ったらそのニュースでちょとガッカリ。
44:デフォルトの名無しさん
09/06/11 00:14:17
Google AndroidはカスタマイズされたLinuxそのものなんだから、
元から使えて当たり前だもんなぁ。
45:デフォルトの名無しさん
09/06/11 04:03:51
Cにさ、lua 組み込んでるとさ、luaのソースみたときに、どの識別子が
Cから参照されていて、どれがローカルだけで使用されているのかわからなくなる場合があるよね。
命名規則とか、やってる?
一応、Cから呼ばれる関数と変数名は全て __ で始まるようにしてる。
でも大文字で始まっているのが全てCから参照される識別子 って規則の方がほうが
わかりやすいのかな。どうだろう。 __ で始まるのは、間違いが無い気がする。
大文字で始める識別子って、けっこううっかりつけそうな気がする
46:デフォルトの名無しさん
09/06/11 08:39:16
>>45
local宣言しないとローカルにならないし
requireもあるから問題無いよ
47:デフォルトの名無しさん
09/06/11 13:06:52
>>46
それでは45に対する答えになってないだろ。
答えは、「区別する必要はない」だな。
後始末が必要ならファイナライザでも書いてあげれば済むことだ。
48:デフォルトの名無しさん
09/06/11 23:07:53
馬鹿っぽいこときくかも知れないけど
C言語レベルのプリプロセッサのライブラリってあるの?
軽量スクリプト言語の、さらに前処理用。
自作しろといわれりゃ相応の時間をかければ作れそうだけど、
こういう泥臭いのは必要な人は自分で作るのかなあ。
49:デフォルトの名無しさん
09/06/11 23:18:36
>>48
CPP32ってC/C++プリプロセッサがVectorにあるよ。
あとboost::waveとか。
50:デフォルトの名無しさん
09/06/11 23:22:52
URLリンク(spirit.sourceforge.net)
このへん? ライセンスは boost
51:48
09/06/11 23:33:12
どうもありがとう。見てみます
52:デフォルトの名無しさん
09/06/12 03:19:25
プリプロセッサはなぁ……。
有用さは認めるし、実際プリプロセッサを活用したゲームの処理系は見たことあるわけだが、
結局ソースコードが爆発してコンパイラ・インタプリタ側に負担がかかるのが落ちなので、
オレはあまり賛成はしかねる。
C++とC#のビルド速度の差を思うとな。
53:デフォルトの名無しさん
09/06/12 10:40:09
あらかじめプリプロセッサを通してスクリプトを変換し、それをプログラムに読み込ませるという手もあるよ。
ただ、Luaでそれやるとコンパイルエラー出まくりだったと思う。
AngelScriptは問題なし、Squirrelもたぶん問題ないと思う。
ただ、外部スクリプトであったらいいなと思うプリプロセッサの機能は#includeだけのような気がする。
54:デフォルトの名無しさん
09/06/12 19:42:57
lua でソース分割したいとき(というよりも、ソースを複数のluaスクリプトで共有したいとき)
ってどうすればいいの?
Luaファイルをロードしてライブラリとして登録みたいな関数がある?
55:デフォルトの名無しさん
09/06/13 01:09:49
マクロプロセッサといえばm4
>>54
requireかdofileじゃだめ?
56:デフォルトの名無しさん
09/06/15 19:46:26
Luaに名前空間ってあるんですか?
同名関数が別ファイルにあったばあいどうするんですか?
57:デフォルトの名無しさん
09/06/15 21:48:03
あまりに糞なライブラリなら捨てて再構築するのもいいんじゃないか。
軽量スクリプト言語なんだし
58:デフォルトの名無しさん
09/06/15 22:05:45
>>56
グローバル変数を参照または代入する際に呼ばれるメタメソッドを設定できるよ
59:デフォルトの名無しさん
09/06/16 19:09:48
>>58
同名関数が有った場合の挙動の設定ができる、
という意味でしょうか。
同名関数のあるLuaファイル2つを
C++側で開いた時、どうしても呼び分けられない・・・・
60:デフォルトの名無しさん
09/06/16 20:21:26
>>59
というか、LuaもSquirrelも関数はファーストクラスオブジェクトなんだから、
2回定義したら最初のやつは消えちゃうでしょ?
オーバーロードとかはそのままではできんわなー
61:デフォルトの名無しさん
09/06/16 20:28:08
>>56
テーブルで名前空間っぽいものが実現できる。
-- A.lua
A = {}
function A.hoge()
...
end
みたいに書いてCからは
lua_getglobal(L, "A");
lua_getfield(L, "hoge");
lua_call(L, 0, 0);
で呼び出せる。
62:デフォルトの名無しさん
09/06/16 23:17:00
>>60-61
ありがとうございます!
成功しました!
63:デフォルトの名無しさん
09/06/24 09:22:21
LuaってluaL_loadbufferして
lua_pcallしたあと、
luaL_loadbufferのバッファって捨てられないんかな?
loadbufferしてpcallすると
実際のバイナリサイズの二倍くらいメモリを食っているようなんで
pcall後のloadbufferのチャンクは
感覚的にはいらないように感じるんだけど……。
64:デフォルトの名無しさん
09/06/25 00:55:31
lua 5.1.4 を Mac OS X 10.5.7 で動かしてるのですが、バイナリモードでファイル書き込みが出来ません。
v = 1
fh = io.open("samplefile", "wb")
if fh ~= nil then
fh:write(v)
fh:close()
end
を実行すると、samplefileの中身は0x01では無く0x31です。
バイナリモードの書き込みはどうすればいいのかご存知の方教えて下さい。
65:デフォルトの名無しさん
09/06/25 11:58:28
>>64
v = "\1"
66:デフォルトの名無しさん
09/06/25 12:01:56
C# にIronPythonを組み込んで色々といじってみてるところなんだが、
C#のクラスをPython側で使うときの便利さが神すぎるな。
なんせ、バインダ用のコードなんて一行も書く必要なく、
Python側で通常のモジュールのようにimportするだけで普通に作ったり殺したりできるんだから。
(当然ながら触れるのはC#側でpublicに指定している部分のみ)
いやはや。.NET Frameworkはすばらしい。
反面、Python側のコードをC#側から呼び出すのはちょっとしたおまじないが必要だが、
これはまあ型のある言語から型の無い言語の機能を呼び出すのに手間がかかるのはしょうがないかなぁ。
67:デフォルトの名無しさん
09/06/25 12:13:04
64です。
liolib.cをみたら、g_write()の中で
if (lua_type(L, arg) == LUA_TNUMBER) {
/* optimization: could be done exactly as for strings */
status = status &&
fprintf(f, LUA_NUMBER_FMT, lua_tonumber(L, arg)) > 0;
}
な事してるので文字にしちゃうんですね。バイナリで書き出すのはやめときます。
68:デフォルトの名無しさん
09/06/25 12:15:48
>>65
ありがとうございます。なるほど、たしかにそれだと0x01が書き出されました。
69:デフォルトの名無しさん
09/06/25 12:18:33
>>67
ファイルIOくらい、簡単に自作してしまえばどう?
Squirrelの標準ライブラリはバイナリファイルしかろくに読めない代物なので、
通常の読み書きは自作のクラスを使ってるよ。
C/C++で書いてバインドしてしまえばいい。
70:デフォルトの名無しさん
09/06/25 13:18:56
>>69
64です。
そうですね、頑張ってみる事にします。
まだlua始めて間もないので、もう少し慣れてからですかね。
アドバイスありがとうございます。
71:デフォルトの名無しさん
09/06/26 06:38:29
>>66
.netのいいところは、同じ.netの言語の相互運用が従来の組み込み言語より格段に楽なところだよなー。
俺が何をいいたいかというと、IronRuby頑張ってくれっていう
72:デフォルトの名無しさん
09/06/26 09:28:58
Google V8を組み込み言語として使ってみた人いる?
速度的にはどんなもん?
73:デフォルトの名無しさん
09/06/26 14:25:35
うは。IronPythonのスクリプトをアセンブリ(DLL)にコンパイルして、普通に実行できてしまった。
すごすぎるwww
まあ逆コンパイルして眺めてみたら明らかにC#より無駄なコードが多いから
何でもかんでもこれというわけにはいかないけどね。
74:デフォルトの名無しさん
09/06/26 15:59:41
.NETが凄いんじゃなくて、IronPythonを実装した人が凄いと思う。
あの人、元々は.NETを否定する論文書くために実装してたのにw
75:デフォルトの名無しさん
09/06/26 16:06:03
論文書いてるうちに、こうやったらできるんじゃね?と思って作ってみたらナイスにうごいちゃったんだっけか。たしかw
76:デフォルトの名無しさん
09/06/28 18:20:03
もうちょっと踏み込んで、Squirrelみたいにスタックレス実装にしたらできることも
色々増えるんだけどねぇ>IronPython
まあSquirrelのパフォーマンスを考えると、
その分処理能力が落ちちゃうのかと思わないでもないが。
77:デフォルトの名無しさん
09/07/01 07:23:03
久しぶりの更新きた
Squirrel 2.2.3 stable
June 30, 2009
-added sq_getfunctioninfo
-added compile time flag SQUSEDOUBLE to use double precision floats
-added global slot _floatsize_ int the base lib to recognize single precision and double precision builds
-sq_wakeupvm can now resume the vm with an exception
-added sqstd_format
-generators can now be instantiated by calling sq_call() or closure.call()
-fixed a bug in sqstd_printcallstack(thx takayuki_h)
-fixed modulo by zero(thx jup)
-fixed negative enums and constants
-fixed generator crash bug if invoked as tail call (thx Mr.Accident)
-fixed some minor bug
78:デフォルトの名無しさん
09/07/01 10:46:11
すごい久々だね
開発続いてるのがありがたい
79:デフォルトの名無しさん
09/07/01 12:02:12
Squirrelの作者さんは答えてくれるときはとても誠実に返答してくれるんだが、
要望出しても無視されてそのまま終わっちゃうことが多いんだよな。(フォーラムにて)
直接メールを出したほうがいいのかなぁ。
80:デフォルトの名無しさん
09/07/01 13:29:07
squirrelってまだ一人で開発してるん?
81:デフォルトの名無しさん
09/07/01 19:46:32
そういえばRMSがC#は危険だと言ったらしいが
pythonとsquirrelも2.xの開発がいつまで続くか気になるなあ
82:デフォルトの名無しさん
09/07/01 22:39:03
RMSはGNUにとってC#およびMonoが特許侵害を踏まないかという点で危惧してるだけで、
C#の開発者がいなくなるとかそういう話ではない。
83:デフォルトの名無しさん
09/07/03 02:58:05
>>66とか>>73がRhino使ったらどんな反応するのか気になる所だが
そもそも組み込みでjsてエディタのマクロ言語とかしか見たことなかった・・・。
84:デフォルトの名無しさん
09/07/07 21:29:11
質問。今sqratテストしてるのですがバインドする関数が
int f(int a, int b=1) {return a+b;}
のように引数のデフォルト値持ってた時はどうしてますか。理想を言うなら
RootTable(vm).Func<int (*)(int, Optional<int,1>)>(_SC("f"),&f);
のような感じに綺麗に書けるといいんだけど自分の実力じゃうまく実装できないw
ちなみにフォーラムにある5/31付けのsqratの修正版使ってみたら、
エラーメッセージが_SC()で括ってないのでコンパイルエラーになりました。
うぷ主はJITの人みたいけど、あれは使わないで様子見の方がいいのかな。
85:デフォルトの名無しさん
09/07/07 22:33:38
>>84
いやー、sqratの作者さんはJITの人とは別人ですよ。レスは書きましたがー。
一旦2引数の関数として登録して様子を見る、かな。
Squirrelのデフォルト引数はインタプリタが自前でやってるので
バインダ側で自動的に取得って言うのは無理っぽいんじゃないかなぁ。
理屈上はデフォルト引数をテンプレート型の
オブジェクトとして渡してあげればいけそうですが。
ともあれC/C++は関数型言語ではないし、あまり突っ込んで実装するほどのことではない気がします。
86:デフォルトの名無しさん
09/07/08 00:36:42
>>85
そうですね。諦めてSquirrel側で関数定義しようかな。
DXライブラリというのを丸ごとバインドしようとしているのですが、ライブラリのAPIの仕様と
Squirrel上の関数の定義が一致していないとC++のソースからプログラム持ってくるのが
ややこしくなるので、ディフォルト引数定義しないわけにもいかない事情でして。
Squirrel JIT、オリジナル2.1.2の人と改造版2.2.2の人が別なのを忘れておりました。すいません。
URLリンク(squirrel-lang.org) の 05-31-2009, 1:04 PM のZIPです。
最初の"I tried to bind with Sqrat-0.6."(オレはSqrat-0.6で固まろうとした)あたりから不安だったり...
87:デフォルトの名無しさん
09/07/08 01:26:52
>>86
投稿している改変版ではフォーラムのレスであげている不具合は修正されてるよ。
ただ、自分のプロジェクトで正常に動かなかったのは本当。
もーちょっと色々動かしてほしいところだね。
88:デフォルトの名無しさん
09/07/08 23:11:57
不具合の2個目の方は、文法的におかしな英文で意味不明なんですが
このスレを読むと、どうも>>41の人が言ってる話の関連のようですね。
ありがたく使わせてもらうことにします。レス下さった方ありがとうございました。
89:デフォルトの名無しさん
09/07/09 00:41:06
>>88
>Cannot call method appended at Squirrel script as members of the class
> to binded C++ Classes includes meta-methods[_add/_mul/...].
> The hook getter [_get] should return false if the key is unknown.
直訳:
呼び出すことができない、メソッドを、それはSquirrelスクリプトで追加された、
メンバとして、それはクラスの、それはバインドされたC++クラスであり、
メタメソッド『_add/_mul/...』を含む。
hook getterである『_get』はfalseを返すべきである、もしkeyが未知ならば。
意訳:
Squirrelスクリプトで(クラスに)追加したメソッドを呼び出すことができない。
これ(クラス)はC++のクラスをバインドしたものでメタメソッド『_add/_mul/...』を含む。
もしもしkeyが未知の場合、hook getterである『_get』はfalseを返すべきである。
90:デフォルトの名無しさん
09/07/09 00:52:42
bindedKansu
readedMojisu
91:デフォルトの名無しさん
09/07/09 01:30:25
直訳:
クラスらのメンバーらとしてのSquirrelスクリプトの一点に呼び出しメソッドを
メタメソッド[_add/_mull/...]を含むbinded C++クラスへ追加されられない。
もし例のキーが未知ならば例のフックを取得する関数[_get]はfalseを返すべきだ。
methodにtheがない、bindの過去分詞はbound、hookをゲットする、その他もろもろ…
92:デフォルトの名無しさん
09/07/09 03:08:02
もしかして もしかして
lua にはインクリメント演算子がないのか..!?
93:デフォルトの名無しさん
09/07/09 03:19:05
>>92
URLリンク(www.23ch.info)
94:デフォルトの名無しさん
09/07/10 00:38:39
newEnv = {};
defaultEnv = getfenv(0);
for k, v in pairs(_G) do
newEnv[k] = v;
end
setfenv(0, newEnv);
hoge = 10;
setfenv(0, defaultEnv);
print(hoge);
書き換えたグローバル環境(newEnv)にhoge=10を書き込んでるはずなのに
Lua5.0/5.1でこれで出力がnilにならないのなんでよ
"グローバル環境テーブル"=グローバル変数が属してるテーブルってのが間違い?
95:デフォルトの名無しさん
09/07/10 14:54:20
>>92
シェルスクリプトにもLispにもTclにもRubyにもPythonにも、
インクリメント演算子なんて無いんだよ。
96:デフォルトの名無しさん
09/07/10 17:25:55
Luaの変数をC側から取得する前に、
実際に変数が存在するかの確認ってできませんか?
97:デフォルトの名無しさん
09/07/10 21:46:15
>>94
setfenv(0,env)だと現在のスレッドの環境が変わる。
現在実行中の関数の環境を変えるにはsetfenv(1,env)で。
適当にまとめてみた
・グローバル変数の参照・代入…実行中の関数の環境
・getfenv(0)/setfenv(0,env)…スレッドの環境
・getfenv(1)/setfenv(1,env)…実行中の関数の環境
・関数の中で作られた関数は親の環境を受け継ぐ
例:
function f()
local g = function() end
return g
end
-- fは実行中のチャンクの環境を受け継ぎ、gはfの環境を受け継ぐ。
・load*系で作った関数はスレッドの環境を受け継ぐ
例:
local t = setmetatable({hoge="t"},{__index=_G})
hoge="main"
print(t,hoge)
setfenv(0,t) -- スレッドの環境が変更される
print(getfenv(1),getfenv(0),hoge) -- 実行中の関数はそのまま
loadstring[[
print(getfenv(1),getfenv(0),hoge)
]]()
98:デフォルトの名無しさん
09/07/11 07:26:02
>>97
詳しいサンプルテラthx
スレッドの環境が問題なるのはload*系だけなのねorz
99:デフォルトの名無しさん
09/07/12 13:04:59
Lua Performance Tips - Radium Software
URLリンク(d.hatena.ne.jp)
> Lua Programming Gems は, Lua のプログラミングテクニックについてまとめた,
> いわゆる「Gems本」だ。公式ページでは第2章 "Lua Performance Tips" を
> サンプルとして無料公開しており, PDF 形式でダウンロードして読むことができる。
> この内容がなかなか面白い。
> 最も基本的なポイントであるグローバル変数とローカル変数の違いから,
> table における配列とハッシュの扱いについて,文字列の内部的な扱いについて,
> 等々, Lua におけるパフォーマンスの要点について触れている。
> (略)
続きはサイトで
100:デフォルトの名無しさん
09/07/12 22:06:29
sqrat0.7
101:デフォルトの名無しさん
09/07/13 15:25:37
>>96
URLリンク(sugarpot.sakura.ne.jp)
102:デフォルトの名無しさん
09/07/13 23:27:37
>>100
うほっ。更新内容見てフイタ。
IronPythonは事実上.NET側のオーバーロードをサポートできてないみたいだな。
明示的に書けば読めないことも無いようだが、
これで実用になるとはとても信じられない。
URLリンク(blogs.msdn.com)
103:デフォルトの名無しさん
09/07/14 01:06:33
>>102
MessageBoxあたりで試せばすぐわかるが普通に呼べんぞ?
てゆーかなんでいきなりIronPython?
104:デフォルトの名無しさん
09/07/14 09:26:14
>>95
Lisp には演算子っていう概念がないからちょっと違うけど、inc ならあるよ。
Lua の代入文の = も演算子じゃないんだよな。代入文は式じゃないから。
>>96
Lua は変数の値が nil なら定義されていないっていう意味になるので、
値を取得してみて nil かどうかを調べればいいんじゃないかな。
厳密には、グローバル変数はテーブルのフィールドとして定義されていて、
値が nil ならそのキーは存在しないことと同値なので。
105:デフォルトの名無しさん
09/07/14 10:16:10
>>103
MessageBoxは試してなかったけど、確かにそうだよなぁ。
IronPython呼び出し用に再定義してあげないといけないかも。
オレ、以前はSquirrel党だったんだけど今はIronPython方面に。
組み込みスクリプトとしてはアリだと思うんだけど、どうだろう。
106:デフォルトの名無しさん
09/07/14 15:38:04
Lua > Python:
PythonはC関数を登録してスクリプトから呼び出すのが結構めんどくさい。
コルーチンに制限がある。同じ関数内でしか yieldできないし、yield で引数や戻り値の指定ができない。
独自のローダーを使った import 実装がとにかく面倒。 lua なら lua_load に自分定義のロード関数わたすだけでOK
Pyhton > Lua:
スタックではなく、C上でLua変数はすべて PyObject として表現されるのでCソースの可読性が高い。
関数も整数も全部 PyObject としてC側の変数に保存する事ができる。
環境が充実。
ゲーム用途で組み込んでいる自分としては、コルーチンの使いやすさと、
自作ローダーでのロードが楽(ゲーム用の圧縮ファイルから直接スクリプトを呼び出す必要がある)
な点でLua圧勝。
もしツールに組み込むんだったらソースの読みやすさ+ライブラリ充実さで断然 Python
Eclipse + PyDevが使いやすいのも勝ち点。
107:デフォルトの名無しさん
09/07/14 18:43:12
わざわざ.NETやMonoに依存したくない
108:デフォルトの名無しさん
09/07/14 21:40:20
>>100
2日で0.71に上がってるからバグでもあったのかと思ったら、
バインドしたC++の関数の引数にSquirrel関数を渡せるようにしてほしいと
要望もらって一日で作ってきてるんですね。
Kanryuさんのパッチも入ったし仕事はやいぞ。
109:デフォルトの名無しさん
09/07/15 00:50:51
AngelScript|Д`)<俺らの話題全然ないな
GameMonkey|Д`)<全くだ
CRIScript|Д`)<全くだ
110:デフォルトの名無しさん
09/07/15 01:41:13
URLリンク(www.chaiscript.com)
> ChaiScript | Easy to use scripting for C++
111:デフォルトの名無しさん
09/07/15 02:24:00
チャイってミルクティーやん
と思ったらロゴがほんとにミルクティーだw
112:デフォルトの名無しさん
09/07/15 02:28:39
Squirrelってリスやん
113:デフォルトの名無しさん
09/07/15 06:59:47
Luaを組み込んである字幕作成ソフトAegisub
URLリンク(www.aegisub.net)
URLリンク(g-mark.jpn.org)
字幕スクリプトの整形やエフェクトにLuaを利用してる
ライセンスはBSD、ソースは、
URLリンク(svn.aegisub.net)
114:デフォルトの名無しさん
09/07/15 19:21:30
>>106
Python のyield は引数や戻り値の指定できるよ
Stackless Python なら同じ関数でしかyield使えないという制限もなかった気がするけどうろ覚え
115:デフォルトの名無しさん
09/07/16 10:35:29
>>114
レスを見てジェネレータ関係を触ってみたら、
Pythonのバージョンによる挙動の差異が如実に出ててビビッた。
3.0系はprint文が関数化されて書式に互換性が無いとか、
ジェネレータのnext()メソッドが使えなくなってるとか。
IronPythonの現行版はまだ2.5系で、今年中に2.6系互換になる予定なのか。
オレには3.0はまだ新しすぎたようだ!
116:デフォルトの名無しさん
09/07/16 13:54:53
>Python のyield は引数や戻り値の指定できるよ
URLリンク(www.python.jp)
本当だ、気づかなかった.... orz
117:デフォルトの名無しさん
09/07/29 10:08:15
lua_newthread だとグローバル変数が共有されちゃうけど、
グローバル変数を独立させるようにできないの?
コードを共有して変数だけ独立させたいんだけど。
... って書いてて思ったけど、結局関数もグローバル変数と同じなんだから
lua_newstate でいいのか。
118:デフォルトの名無しさん
09/07/30 02:48:48
LUAのコルーチンの中から、C++側で定義された構造体を取得し、
そのメンバの値を変更したいのですが、変更するコードをスクリプトに
記述した場合、そのコルーチンをresumeするLUAの関数をC++から何度か呼ぶと
luabind::detail::unrefというところで例外が出てしまいます
struct Test { int a; Test(){} }; という構造体があって、luabindで
luabind::module(L) [
luabind::class_<Test>("Test")
.def(luabind::constructor<>())
.def_readwrite("a", &Test::a)
として、コルーチンの中で t=Test() t.a=0 の2行を書くと例外になります
この2行をコメントアウトすると、何度呼んでも例外が出ません
また、この2行をコルーチンでない普通の関数に記述してC++から呼んでも
例外が出ません
なぜコルーチン内から構造体を使用するコードを書くと例外が出るのでしょうか
119:デフォルトの名無しさん
09/07/30 06:10:29
luabind は使ったことがないので想像ですが、
コルーチンから C の関数が呼ばれるときは lua_State(L の値)が違うから、
それが問題になってたりしないかな?
120:デフォルトの名無しさん
09/07/30 07:27:21
>>119
ありがとうございます
すみません、質問しておいて何ですが、以下のフォーラムの記事に
よるとどうやらluabindにバグがあったみたいで、仰るとおりlua_Stateの
値が関係してるようです(英語がよく分からないので間違っているかもしれません)
それでluabind/detail/ref.hppを記事の下にあるものに置き換えたところ、
今のところ例外が出ずに動いています。。
URLリンク(www.nabble.com)
121:デフォルトの名無しさん
09/07/31 16:36:17
lua_resume(ls, ...) で中断しているスクリプトがあるんだけど、
再開するのではなく、リセットして最初から実行しなおしたい場合がある。
このとき、どうすればいい?
マニュアルには lua_newthread で作ったスレッドは解放しなくていい、
GCが管理すると書いてあるけど、さすがにいきなり
ls = lua_newthread(..);
って上書きするんだと、いつまでたっても古い ls の内容が削除されないよね?
だってLua側からしてみれば、古い ls はあくまでも中断してるのであって、
いつ再開されるかわからないからGCで回収できないし、
古い ls はもはや不要になったよー ってことをまったく Lua 側に知らせてないし。
かといって、明示的に ls が不要になったことを伝えるために
lua_close(ls);
ls = lua_newthread(...);
lua_resume(ls, ...);
とやってみると、lua_newthread で内部エラーが発生する(メモリ違反ぽい)
どうすればいいですか?
122:デフォルトの名無しさん
09/07/31 18:37:55
>>121
>いつ再開されるかわからないからGCで回収できない
んな事はない。
スレッドでも他のデータでも、参照できなくなったらGCで回収される
という事に変わりはない。
123:デフォルトの名無しさん
09/07/31 18:56:50
>>122
でも C のレベルでは、参照されているかどうかってわからないんじゃない?
つまり、lua_newthread() した直後は、
Lua のオブジェクトからは参照されていない thread ができるわけですよね。
逆にいうと、lua_newthread() しただけだとどこからも参照されていない事になるから、
lua_setglobal か何かを使って、どこかから参照してあげないといけないとか?
124:デフォルトの名無しさん
09/07/31 19:50:44
どこのlua_newthreadの解説読んでるのか知らんが、
「新しいスレッドを"スタックに積み"……」って書いてないか?
125:デフォルトの名無しさん
09/07/31 19:59:52
URLリンク(www.lua.org)
ここみてますけど、でもさすがに、スタックに積んだままじゃほかのことできないでしょ。
元の質問された方がどういう風に使っていたかによるけど。
126:デフォルトの名無しさん
09/07/31 20:09:46
lua_newthreadの直後はC関数のスタックから「参照」されてるし
そのあとLuaで参照したいなら戻り値なりグローバル環境なりに押し込めばいいし
C側だけで管理したいならレジストリ+luaL_refとか使えばいいだろ
何がしたいんだかわかんねーよ
127:デフォルトの名無しさん
09/07/31 20:12:10
新しいスレッドを積むのはいいんだけど、
古いスレッドが不要になったということをどうやってLUAに知らせるの?
最初に
ls = lua_newthread(...);
lua_resume(ls, ...)
を実行したとして、ls は中断状態のまま残っていると。
で、中断状態をやめて、最初から実行したいということで、いきなり
ls = lua_newthread(...);
lua_resume(ls, ...)
をもう一度呼び出すと、古い ls が上書きされるけど、古い ls への参照も、
なにもかもまったくいじっておらず、ただ単に新しいスレッドを追加しただけにすぎないわけで。
古い ls の参照カウンタをデクリメントするなり、古い ls への参照を
削除するなりの処理がまったく入っていないと。
128:デフォルトの名無しさん
09/07/31 20:38:13
C++とLuaスクリプトの連携をしたいお年頃なんですが、
toluaとluabindだったらどちらが安定してる感じですか?
129:デフォルトの名無しさん
09/07/31 21:20:37
>>127
だから削除したいならスレッドの参照を潰せばいいだけでしょ?
自分で最後に答え書いてるじゃん!
中断中のコルーチンが参照されなくなった場合に GC 対象になるかどうかは
マニュアルにも明言されてない、どっちなの? って質問なら確かにわかりにくいとは思うが。
int main(int argc, char* argv[])
{
lua_State* L = lua_open();
luaL_openlibs(L);
lua_State* thread = lua_newthread(L);
luaL_loadstring(thread, "print('co1'); coroutine.yield(); print('co2');");
lua_resume(thread, 0);
//lua_settop(L, 0);
lua_gc(L, LUA_GCCOLLECT, 0);
lua_resume(thread, 0);
lua_close(L);
return 0;
}
lua_newthreadで積んだスレッドを潰す処理であるlua_settopの行のコメントを削除すると
二回目のlua_resumeの時点で落ちるところから「GC対象になる」が正解みたいやね。
130:デフォルトの名無しさん
09/07/31 21:27:07
>>127 は根本的なところを理解してないようだ。スタックにあるんだからpop すればいいんだよ。
まず
lua_State *base = lua_newstate();
lua_State *ls = lua_newthread(base);
は、
lua_State *base = lua_newstate();
lua_newthread(base);
lua_State *ls = lua_tothread(base, -1)
と意味的には等価ね。
ここで ls は、あくまでスタック上にあるスレッドの情報を、
直接ポインタとして参照してるだけで、別にリファレンスを持ってるわけではない
lua_newthread がこれを返してるのは、単に便利だからにすぎない
この状態で、lua_pop(base,1) することで、スタックの末尾にあるもの=さっき作ったスレッドが
破棄されて解放されることになる。これでスレッドが破棄された後に ls にアクセスすると、
実体がなくなってるポインタの参照になるから誤動作を引き起こす
一般的には、スレッドをスタックにつんだままにしとくのはわけわかになるので、
>>126の言ってる通りに管理することになる
131:デフォルトの名無しさん
09/07/31 21:52:47
>>129
お前も使い方間違ってるよ・・・
132:131
09/07/31 21:59:29
と思ったけど、俺が間違ってる気がしてきた・・・
メインスレッドのスタックに、新しいスレッドと関数と引数を積んでlua_resumeを呼ぶ
と思ったけど、違うのか
133:デフォルトの名無しさん
09/07/31 22:01:02
>>131
え? それだけ言われてもわかんない、どこどこ、教えて!
134:デフォルトの名無しさん
09/07/31 22:04:32
>>132
ってなんじゃいゴルァ!w
いやそこは合ってるはずだよ、とゆーかみんなCで組み込むなら標準ライブラリのソース読もうぜ
組み込みの基本からトリッキーなものまで一通りそろってるぜ
135:デフォルトの名無しさん
09/08/01 20:41:44
lbaselib.cのauxresume(L, co, narg)の所を見るとlua_resume(co, narg)となっている。
1番目の引数がLではなくcoだということがマニュアルを読んだだけではわからなかった。
136:デフォルトの名無しさん
09/08/10 17:41:02
C++でPython組み込んでて
例えば
Pythonのソースにスペルミスがあったとして
それをC++側で知る方法が全く分からない
どなたか分かりませんか
137:デフォルトの名無しさん
09/08/10 17:52:13
∩_
〈〈〈 ヽ
〈⊃ }
∩___∩ | |
| ノ ヽ ! !
/ ● ● | /
| ( _●_) ミ/ Lua!!
彡、 |∪| /
/ __ ヽノ /
(___)
138:デフォルトの名無しさん
09/08/10 17:57:43
>>136
Pythonスクリプトのコンパイルエラーやら実行時エラーを取得したいっていうこと?
139:デフォルトの名無しさん
09/08/10 18:02:39
>>138
そのとおりです。
PyErr_Print () の出力先を変えればいいのだと思うのですが。。。うまくいきません
140:デフォルトの名無しさん
09/08/10 18:44:19
>>139
PyErr系はstdoutに出力するけど、これはcで定義されたstdoutではなく
python で定義されたsys.stdout を呼んでいるので、その変数を上書きすれば良い。
sys.stdout 変数を書き換えるコードを最初に実行する。
const char *s = "\
import sys\n\
sys.stdout = MyStdout\n\
class MyStdout:\n\
def write(s):\n\
call_c_function(s)\n";
てやって s を実行すれば、Python側の sys.stdoutが自作クラスで上書きされる。
もちろんあらかじめ自作C関数を call_c_function で呼び出せるように登録しておく。
141:デフォルトの名無しさん
09/08/10 21:11:59
>>139
PyErr_Occurred で存在を確認して、PyErr_Fetch で取得
142:デフォルトの名無しさん
09/08/10 22:22:23
AngelScript2.17記念カキコ
143:デフォルトの名無しさん
09/08/10 23:09:19
>>140-141
ありがとうございます
出来ました
144:デフォルトの名無しさん
09/08/11 07:43:44
∩_
〈〈〈 ヽ
〈⊃ }
∩___∩ | |
| ノ ヽ ! !
/ ● ● | /
| ( _●_) ミ/ Lua!!
彡、 |∪| /
/ __ ヽノ /
(___)
145:デフォルトの名無しさん
09/08/13 01:25:43
IronPython……。
開発効率はそんなに悪くないんだが、
スクリプトで書いたメソッドの実行のレスポンスが悪いような気がするなぁ。
最初の実行時に引っかかる感じ。2回目以降は問題ないんだが……。
146:tor1.digineo.de
09/08/17 17:46:38
Q. 自動保守#K9K?_D[L とは一体何なのか?
A. 外部サイトへの突撃大好きな真性厨房
韓国突撃でお馴染みの自動保守
最近は自動焼人 ★として2ちゃんねるのボランティアにも精を出す日々
だがそんな彼にも、人間らしい部分はあったのだ…
名言集
『アパッチ砲はワシが作った』
『お前が規制系キャップ取れるか審査してやるよ』
『いつもサボってばかりのキャップがウゼえ』
『俺、100人規模の集団サイバーテロの主犯だったこともあるんだぜ』
『俺の経歴カックイイだろ?』
最近のニュース
8月15日の韓国突撃の際に歴史的大敗を喫する。ラジオでの敗戦宣言のときに声が震えていた
本人は体調不良と言っているが…
----------------------------------------------
この自動焼人 ★メールマガジンの配信停止をご希望される方は
スレリンク(sec2chd板)
にて自動焼人 ★までご連絡ください
147:デフォルトの名無しさん
09/08/19 22:37:23
Xtalが 1.0.0.0になった気配
148:デフォルトの名無しさん
09/08/19 22:48:59
\ l´⌒\⌒\ \\ \
\ ヽ ) ) \\ \\
( \ \∩___∩ \\
\ \ ⌒⌒| ノ ヽ \\
\ \ / ● ● ト、\ \\\
\ Y | ( _●_) ミ\ \\\
\ / 彡、_ |∪| ノ \ \\\
(____)―ヽノ' ヽ  ̄ ̄ ヽ\\
\, j l l .l }
Lua! l (_ノノノノ
149:デフォルトの名無しさん
09/08/20 00:02:36
なん・・・だと・・・
150:デフォルトの名無しさん
09/08/20 08:49:22
修正点まだあるみたいだね
151:デフォルトの名無しさん
09/08/20 13:51:23
XtalってC++以外からは使いにくくない?
っていうか使えるんだろうか
152:デフォルトの名無しさん
09/08/20 14:17:00
>>151
バインド部分がテンプレートべったりなんだから、そのままではC++以外で使えるわけがない。
ぼやき。
Squirrelを.NET向けに移植しようかと考えたこともあったが、
この分野ではIronPythonが便利すぎてやる気が失せた。
起動が重過ぎる点を除けば処理速度以外は特に不満点はない。
Luaに関しては.NET判処理系のNuaがあるみたいね。
153:デフォルトの名無しさん
09/08/20 16:54:28
>>152
ですよねー
もうちょい汎用的なバインド方法が欲しいところだ
154:デフォルトの名無しさん
09/08/20 19:43:09
>>151
試してないけど
extern "C" {}
でC言語リンケージに変換してみるとか。
155:デフォルトの名無しさん
09/08/26 05:27:30
IronRubyも0.6まで着てたな。Ruby on Railsが動くまでになったらしい。
Rubyも楽に組み込めるといいんだけどね。例えば、スクレイピングの部分だけまかせるとかさ
156:デフォルトの名無しさん
09/09/07 08:56:09
IGDAで Xtal を扱う勉強会があるみたい。
URLリンク(www.igda.jp)
157:デフォルトの名無しさん
09/09/07 11:13:19
Xtalっておいしいの?
158:デフォルトの名無しさん
09/09/07 11:31:58
食わず嫌いはいけませんよ
159:デフォルトの名無しさん
09/09/07 11:45:23
4時間で6テーマか。
Xtalに特に興味があるなら別のイベントに期待って感じかな。
160:デフォルトの名無しさん
09/09/07 12:08:05
JITコンパイルでC並の速度で動く組み込み言語とかない?
161:デフォルトの名無しさん
09/09/07 12:19:50
AngelScriptがJITコンパイルできるようになったらしいが、やり方がわからない…
162:デフォルトの名無しさん
09/09/07 12:24:07
>>160
言語じゃないけど、NativeClient
163:デフォルトの名無しさん
09/09/08 00:34:11
昔は高速な組み込み言語はLispだったな。
JITコンパイルじゃないが。
164:デフォルトの名無しさん
09/09/08 12:15:39
>>160
URLリンク(www.compuphase.com)
165:デフォルトの名無しさん
09/09/08 23:51:16
>>164
これ良さそうだけど人気ないのかな
166:164
09/09/09 02:11:46
164 書いた後で発見
URLリンク(pawn.my-sv.net)
167:デフォルトの名無しさん
09/09/11 08:52:36
現状Pythonの組み込みで満足してるというのに、他の言語を検討する必要性をまったく感じない……。
168:デフォルトの名無しさん
09/09/11 11:08:55
>>167
帰れ
169:デフォルトの名無しさん
09/09/12 12:24:04
>>160
LuaJIT 速いらしいよ。
C ほどじゃないだろうけど、Python には大体勝ってるみたい。
URLリンク(shootout.alioth.debian.org)
170:デフォルトの名無しさん
09/09/12 14:17:34
Lua は JIT じゃなくても python より速いよ
171:デフォルトの名無しさん
09/09/12 14:30:54
IronPythonはLuaより倍ほど速いがな。(2.0.1)の場合。
2.6系ならさらに速くなってる。
ただし速いのは数値計算で、文字列計算などはPythonより遅かったりするが。
172:デフォルトの名無しさん
09/09/12 15:36:57
組み込み言語って
「Cで書いた (だから速い)」と喧伝しながらこっそりと組み込むものではないのか?
173:デフォルトの名無しさん
09/09/12 15:43:13
たぶn Luaやリス使っている人はゲームの組み込みが多いと思われるのですが、
Pythonを組み込みに使っている人は、どんなアプリに使ってますか?
174:デフォルトの名無しさん
09/09/12 17:14:54
>>171
マジで!? IronPython スゴイんだな。
数値計算に関してなら、以前に計測したとき Lua は Python より2~5倍速かったんだけど。
数値計算については .NET すごいということなのかな?
175:デフォルトの名無しさん
09/09/12 19:32:49
LuaJITとかCに比べたら桁違いに遅いんじゃない?
176:デフォルトの名無しさん
09/09/12 19:37:08
というか、Cで各プログラムと速度面で執拗に比較するやつがいるが、意味が分からない。
C/C++にスクリプト言語の動作を追加するのは柔軟性を増やすことで
開発・運用を容易にするためであって速度のためではない。
スクリプト言語で実装した部分が重いなら改めてC/C++側に移植することを考えればいいだけのこと。
177:デフォルトの名無しさん
09/09/12 19:43:51
ユーザがプログラムを拡張するのに使えるだろ
178:デフォルトの名無しさん
09/09/12 19:55:55
組込み言語に今注目してる業界にゲーム業界があるが、
ユーザによる拡張をばりばり推進するぜ派(洋ゲー、リアルタイム物メイン)と、
そんなもん完全にアウトオブ眼中だぜ派(和ゲー、アドベンチャー系メイン)で、
まっぷたつですな。
179:デフォルトの名無しさん
09/09/12 20:10:01
社風の違いだからどうにもならない。
プログラマの部長級が開放的という幸運なケースであってさえ、
総務営業やら会社も巻き込むとやっぱり日本的感覚で
ゲームの内情を客に見せるのは御法度になるね。
プログラマ出身のワンマン社長のところしかありえないでしょう。
180:デフォルトの名無しさん
09/09/13 09:18:47
プラットフォームの違いもある。
洋ゲーと言えども、360やPS3でMODを許しているものは少ないだろう。
>>178の(和ゲー、アドベンチャー系メイン)ってPCのエロゲ・ギャルゲのことを
指してるんだろうけど、俺としては違和感があるなぁ。
181:デフォルトの名無しさん
09/09/15 23:34:31
URLリンク(www.amazon.co.jp)プログラミング言語Lua公式解説書-Roberto-Ierusalimschy/dp/4048677977/
この本持ってる人いる?
luaを始めて見ようと思ってamazonで検索して出てきて最新ぽいから買おうと思ってるんだけど
182:デフォルトの名無しさん
09/09/16 21:34:58
>>181
読んでみようと思って大きな本屋まで行ってきたが、
SQLiteの本とDirectXの本読んでたら満足しちゃってそのまま帰ってきてしまった。
183:デフォルトの名無しさん
09/09/17 05:14:33
>>181
リファレンスマニュアルの日本語訳も収録してるなら長く使えそうかも。
リファレンス読んでよくわからないところを本文で確認とかできそうだし。
URLリンク(sugarpot.sakura.ne.jp)
よくここにお世話になるんだけど、内容が古いのか、
本家の英語版にくらべると結構抜けがあるんだよね。
184:デフォルトの名無しさん
09/09/17 10:12:06
>>182
おいw
185:デフォルトの名無しさん
09/09/17 18:27:44
URLリンク(blog-imgs-26.fc2.com)
このSSで使用してるソフトご存知の方いたら教えていただけませんか
186:デフォルトの名無しさん
09/09/17 21:15:21
URLリンク(mystone.jp)
URLリンク(tibid.seesaa.net)
187:186
09/09/17 21:23:49
もしかしてエディタの方なら
URLリンク(www.vector.co.jp)
188:デフォルトの名無しさん
09/09/17 21:23:50
>>185
NoEditor
189:デフォルトの名無しさん
09/09/18 12:39:47
ご回答ありがとうごじあましたー
190:デフォルトの名無しさん
09/09/25 16:57:06
メインアプリ起動後に裏で常にLuaを複数同時に動かして
プラグインのようなことをさせたいのですが
何か参考になるサイトやソースコードはないでしょうか?
191:デフォルトの名無しさん
09/09/26 06:26:45
>>190
メインと切り離す必要が本当にあるならプロセス間通信。
メインの内部で別スレッドを作って回すだけでいいならマルチスレッド。
192:デフォルトの名無しさん
09/09/26 09:17:46
マルチスレッドだと今度はリソースのロックとかがめんどくさいから、
コルーチンで協調的マルチスレッドにするとかどうですか?
193:デフォルトの名無しさん
09/09/26 09:51:46
>>191-192
貴重な意見ありがとうございます
コルーチンで実装してみて上手く行かないようなら
マルチスレッドを試す方向で行こうと思います
194:デフォルトの名無しさん
09/09/26 14:57:40
オレの場合、最初はコルーチンで実装してたが早々にCPUリソースが足りなくなって
マルチスレッドに移行したがな。
ゲームで使用するリソースを開始前に一括してロードするような
FPS的な仕様にしないと単独スレッドの実装は難しい。
195:デフォルトの名無しさん
09/09/28 13:19:32
>>190が言ってるような
一つのソフト上で同時に複数の
Luaスクリプトを動かす事って可能なの?
変数やスタックがバッティングしそうな気もするし
実際そういうことをしてるアプリ見たことないな
196:デフォルトの名無しさん
09/09/28 13:21:09
lua_Stateを複数作ってそれぞれ別管理すればいいだけじゃ?
197:デフォルトの名無しさん
09/09/28 13:59:39
ですね。
Luaはインタプリタの状態がグローバルにならない作りになってる。
198:デフォルトの名無しさん
09/09/28 21:44:36
V8も以前は・・・
199:デフォルトの名無しさん
09/09/29 09:55:14
Lua Programming Gems に、
Lua のコルーチンを改造してマルチスレッドにするという記事があるみたい。
URLリンク(www.lua.org)
本は読んでないけど、サンプルコードがダウンロードできる。
Enhanced Coroutines in Lua
Patrick Rapin
200:デフォルトの名無しさん
09/09/29 14:32:03
何かが引っかかると思ったら、コルーチンでLuaを複数回して
更にLua内でもコルーチンを使うからか
なんか富豪だな
201:デフォルトの名無しさん
09/09/29 15:38:36
総合的な処理速度はSquirrelとLuaではどちらが上ですか?
202:デフォルトの名無しさん
09/09/29 15:49:56
>>201
単純な数値計算ではLuaの方が倍くらい早い。
が、いずれにせよCなどの静的型付言語よりは10分の1以下のスピードなので、
あまりヘビーな処理はさせないようにすること。
とはいえ、80:20の法則で大部分のコードはスクリプト側に移行できるはず。
処理能力が足りなくなったら下回りからC/C++に再度移植していく。
203:デフォルトの名無しさん
09/09/29 15:55:21
>>202
そうですか、一見するとSquirrelはLuaの欠点を補い
構文もC/C++に近いなど利点ばかりかと思っていたけど
それなりに欠点があってゲーム用に改良された割には
未だ使用例が少ないのが現状みたいですね
204:デフォルトの名無しさん
09/09/29 16:14:07
>>203
いや、C++で書いてたころは普通にSquirrel使ってたよ。
とりあえず基本的なレベルでの不満はない。
オブジェクトの寿命は常に問題になるけどね。
今はもうC++でプログラムは書かないようにしてるから関係なくなった。
205:デフォルトの名無しさん
09/09/30 18:40:24
>>204
気になるなw
> 今はもうC++でプログラムは書かないようにしてるから関係なくなった。
今は何で書いてるんですか?
.NET系?
206:デフォルトの名無しさん
09/10/02 05:46:32
>>204
C#+IronPythonだ。レポはこのスレに何回も書いてるのでログを見てくれ。
しかし静的型付言語でいいならBooでもいいかも……(はっきり言ってこっちの方が速いし)
まあ今回は途中まで作ったからIronPythonでやってしまう予定だけど。
207:デフォルトの名無しさん
09/10/02 05:47:14
204 → 205
208:デフォルトの名無しさん
09/10/03 12:21:55
Luaステートを増やした(同時実行した)場合のGC負荷は
単純計算でステート数分増えるのかな?
検証してるサイトないか探したけど見当たらない
209:デフォルトの名無しさん
09/10/03 12:29:14
そりゃ当たり前のことを検証する人は居ないだろう
210:デフォルトの名無しさん
09/10/04 13:35:48
たまにLuaではcontinueやbreakは出来ないが
それを可能にするパッチがある、とあるけど
実際どこで配布されてます?
ここ数日ずっと探してるけど見つからず
211:デフォルトの名無しさん
09/10/04 16:57:50
breakはできるだろ
continueは
URLリンク(lua-users.org)
とか
URLリンク(lua-users.org)
だな。
212:デフォルトの名無しさん
09/10/04 18:56:28
初心者な質問なのですが、
VC++6.0でLua環境を構築しています。
「スクリプト言語による効率的ゲーム開発- C/C++へのLua組込み実践」 の中で
紹介されているtolua++を適応しています。
あるクラスの関数をtolua++を用いてLuaに公開しようと実装したのですが、
extern宣言した関数がリンカエラーでビルドする事が出来ません。
やりたい事は下記の様な感じです。
class CHoge
{
public:
char* GetName( CHage* pHage );
};
このGetName関数をtolua++でグルーコードに出力して、
VCのプロジェクトに登録しています。
出力したグルーコードに記述されている、GetName関数がリンカエラーになってしまいます。
*今はグローバル関数にして、extern宣言で対応しています。
クラスの関数をLuaに公開するには何か特別な方法が必要なのでしょうか?
上記の本にはクラスの関数の場合について記述されていない様なので質問しました。
宜しくお願いします。
213:デフォルトの名無しさん
09/10/04 20:20:58
>>211
thx、無事適用完了しました
214:デフォルトの名無しさん
09/10/06 04:29:51
>>212
URLリンク(www.codenix.com)
ここみると、クラスごとバインドするしかなさそう。
あるいは、登録したい関数をクラスメソッド(static 宣言)にするといいのかな。
215:デフォルトの名無しさん
09/10/06 17:54:33
Luaでチャンクの区切りを改行ではなく ; (セミコロン)にしたいのだけど
それを可能にするパッチとか出てたりします?
自分で改造しようにも手に負えなくて
216:デフォルトの名無しさん
09/10/06 18:01:45
配列を0から扱えるように悪銭苦闘したオレに似てるな
オレの場合は自力でやったけど複雑過ぎて無理だった orz
Luaってなんで配列が1からなのかね
いまでもムズムズ、どうにかならないものか
217:デフォルトの名無しさん
09/10/06 18:28:12
lparser.cのstatement()のswitch文のreturnの前に
check(ls, ';');
って書けばいいんじゃないかな
218:デフォルトの名無しさん
09/10/06 22:06:32
社会常識は1からだからな。
219:デフォルトの名無しさん
09/10/06 23:39:10
マジでLuaの配列を0から扱えるようにするpatchありませんかね?
220:デフォルトの名無しさん
09/10/07 01:28:23
>>214
回答ありがとうございます。
クラスのバインドで試してみます。
221:デフォルトの名無しさん
09/10/07 12:03:44
>>216
ニューメリカルレシピ・イン・C っていう本にその逆のことが書いてあったな。
一般的な数学では添え字は 1 からはじまるのに C だと 0 からだから困ると。
で、その本では添え字を 1 から始めるように、配列のポインタを 1 つ前にずらしてた。
つまり、int arr[10] みたいな配列をつくったら、
int *arr1 = arr - 1 と定義しておけば、arr1[1]、arr1[2]、……、arr1[10]
っていうふうにアクセスできる。
222:デフォルトの名無しさん
09/10/07 12:29:33
Fortranな人のための小ワザだけど、
厳密には、配列の範囲から外れたところを指してるポインタに
まつわる動作は未定義なので、仕様に煩い人には不評。
(C FAQ より URLリンク(c-faq.com) )
223:デフォルトの名無しさん
09/10/07 13:11:48
>>215
>>219
SquirrelとかAngelScriptじゃダメなの?
224:デフォルトの名無しさん
09/10/07 13:16:16
そもそも0とか1とかいうマジックナンバーを使ってはいけない。
パッチではなく、リファクタリングするべき。
#define FIRST 1
225:デフォルトの名無しさん
09/10/07 13:16:36
言語はそのままの仕様で使うのが無難ではあるよなー
226:デフォルトの名無しさん
09/10/07 13:21:29
>>223
Lua以外にするとメモリ消費や処理速度が劣ってしまうのが嫌で
やっぱり仕様に従って使うしかないですか
227:デフォルトの名無しさん
09/10/07 14:04:47
∩∩ ;
;|ノ||` ┬-∥
__,/●●| __ | | ∥ L...Lua..
| ; |`(_●)/ ミ . Y ∥
| .彡|∪||、 , .| | ∥
/:~ ̄ ̄ ̄ ̄:/.| | ∥
,|:::::. .......::/>> / ∥
/.::::: .. ...::::::|'(/\_/ ∥
../:.::: .. :.:::/.:/ /∥\
/.:::. ....:::..:::/.:/
' ̄ ̄ ̄ ̄ ̄ _/
|_| ̄ ̄ ̄ ̄|_|
228:デフォルトの名無しさん
09/10/07 18:31:00
BASICでも配列作ると0からなのに・・・・
229:デフォルトの名無しさん
09/10/07 18:57:15
ここは中間をとって0.5に
230:デフォルトの名無しさん
09/10/07 19:28:51
BASIC はたいていの実装が OPTION BASE とかで配列の開始インデックスを変更できるぜ
231:デフォルトの名無しさん
09/10/07 20:37:21
もう連想配列だけにしちゃおうぜ
232:デフォルトの名無しさん
09/10/07 23:24:33
>>230
なつかしすぎてどっかから鼻血でたわw
233:デフォルトの名無しさん
09/10/07 23:41:07
0からってのはポインタ的な発想で好かんわ
234:デフォルトの名無しさん
09/10/08 13:50:08
Pythonでシステム組んでるが、配列のインデクスが何番からかほとんど意識することないな。
for文ではそのままイテレータをまわしてしまうし。
235:デフォルトの名無しさん
09/10/09 19:50:43
Lua標準だと1ステートあたりのスタックサイズは1Kだけど
消費を抑えたくて手動設定する場合
どれくらいの値がベストだろう?
236:デフォルトの名無しさん
09/10/09 23:42:36
デフォで使用メモリ量が80MBを越える俺の構築した処理系からすれば、
数十キロバイトの仮想スタックなんて小さな問題だ。
237:デフォルトの名無しさん
09/10/11 01:41:47
新しい必殺技を思いついた
>>236 に捧ぐ
"O"zapper!!
238:デフォルトの名無しさん
09/10/11 03:42:20
次こそはうまくやりますコンピューター!
239:デフォルトの名無しさん
09/10/11 19:42:49
>>232
「どっかから」てお前はケツから鼻血がでるのかよw
>>236
RubyでフレームワークとしてRailsを搭載したかのようなメモリ消費量だなおいw
240:デフォルトの名無しさん
09/10/11 19:52:53
>>239
IronPythonがもりもりメモリ食うからな。
ほんと環境にやさしくないスクリプトエンジンだぜ。
まあ、C#で組むにはこれが一番「普通」なスクリプティングエンジンなので。
241:デフォルトの名無しさん
09/10/11 21:24:50
IronPythonすげえwそんなにメモリ食いすぎなのかw
242:デフォルトの名無しさん
09/10/14 02:42:38
luaについてちょっと質問なんだけど、
乱数を表示させたあとに、もう一度同じプログラムを実行すると
シード値が変わらずにまったく同じ乱数が表示されてしまう。
どうすればこのシード値を初期化して、実行するたびに違う乱数を
表示させられるの?
243:デフォルトの名無しさん
09/10/14 02:54:44
それこそシード値を「適当に」初期化してやればいい。
一般的には、タイマーの値とか、ユーザ入力の時間差を測定したりして、それを srand() につっこんで対応する。
244:デフォルトの名無しさん
09/10/14 03:04:26
>>243
レスありがとう
まだはじめたばっかりでホームページさがしながらの手探り状態なんだけど、
math.random()で()の中に1から10までの値をいれるよね?
そしたらそれ以外にmath.randomseedを書けばいいってこと?
245:デフォルトの名無しさん
09/10/14 03:16:42
そう。
プログラムの頭で math.randomseed(os.time()) とでもしておきなされ。
246:デフォルトの名無しさん
09/10/14 03:22:08
できました!
本当にありがとうございました。
これからもっと勉強してきます
247:デフォルトの名無しさん
09/10/14 13:48:26
実行中のLuaスクリプトを停止させるには
lua_errorで強制的に例外を発生させる方法以外に
何かありませんか?
1つのスクリプトを実行する一般的な使い方なら問題ないのですが
スレッド毎で同時に複数のスクリプトを実行させる場合
リソースの保護をしても違うスレッドからスクリプト(ステート)を閉じようとすると
原因不明のエラーで強制終了してしまいます
248:デフォルトの名無しさん
09/10/14 14:52:00
>>247
コルーチン化していつでも終了できるように作っておくのがLWL流 :)
249:デフォルトの名無しさん
09/10/14 14:57:04
つlua_yield
250:デフォルトの名無しさん
09/10/14 15:03:25
>>248
肝心な部分を説明し忘れてました
私が今作ってるのは>>190の方が言われたような
luaを同時実行させてプラグイン機能を実現するもので
それをコルーチンでやるとなると実質スレッド1つで
全処理をすることになるのでCPUリソースの消費が激しく
ステートも一つだから変数の重複などが問題になって
それらを回避するためにマルチスレッド上で
それぞれスクリプトを動かす必要があるのです
しかしあるプラグインでエラーが起こり
それに関連するスクリプトを全部停止(解放)したい時
現スレッドから他スレッドのステートを閉じようとすると
強制終了につながるエラーが起きてしまう状況で
251:デフォルトの名無しさん
09/10/14 15:35:28
>>250
ちがうよー。
コルーチンというのはプログラマが入力した任意のタイミングで
動作を中断できるようにした仕組み(yield)のことであって、
それを使って複数の仕事を1スレッドで同時に実行というのは二次的なものに過ぎないんだよ。
したがって複数のスレッドで実行しても(エンジンの実装に問題が無いなら)問題ない。
で、中断されて制御が戻ってきたタイミングでそのまま開放してあげればいい。
252:デフォルトの名無しさん
09/10/14 15:54:24
>CPUリソースの消費が激しく
>変数の重複などが問題
↓
>強制終了につながるエラーが起きてしまう状況
戦況が悪化してるが、今さら撤退する気はない
典型的なパターンですね
253:デフォルトの名無しさん
09/10/14 16:07:52
>>250
lua はスレッドセーフじゃないから、別スレッドからの制御は根本的にできないよ
コルーチンでうごかせってのは、呼び出しに lua_call を使うんじゃなくて、lua_resume と while
ループでスクリプトを駆動させて、スクリプト側では定期的に yield するようにすれば、
その区切りで安全に実行中断できるよ、ってこと。
それぞれのスクリプトはそれぞれのスレッドで立ち上げて、ほかのスレッドから停止させるときは
フラグをたてておいて、そのフラグがたってたらwhileを抜けて速やかにスレッドを自滅させる
ような書き方にする。
コルーチン駆動&記述が面倒ってことなら、裏技チックだけど、lua_sethook を使って、
関数呼び出し、ないしは行ごとに終了フラグチェックさせて、もしフラグたってたら
lua_error で速やかにスクリプトを abort させるという手もある。
残念ながらhookにユーザパラメータは存在してないので、変数かレジストリに
参照するフラグのCポインタを格納しておく、とかの小ざかしいテクが必要。
254:デフォルトの名無しさん
09/10/14 16:12:26
なるほど
Luaスクリプトを同時実行する際は
マルチスレッドのみでの制御は無理ということですか
改めてコルーチンについて勉強し直してきます
どうも助かりました
255:デフォルトの名無しさん
09/10/14 17:04:30
スレッドって名前が紛らわしいな。
関係ないかもしれないが、非推奨な手法を使いにくくするとかいう話を思い出した。
256:デフォルトの名無しさん
09/10/14 23:15:46
Luaは普通の呼び出しと、lua_yieldで一時停止して再度呼び出す場合とで使う関数が違うのが面倒くさくて逃げちゃったな俺…
AngelScriptだと同じ呼び出し方でOKなんだよなぁ…
257:デフォルトの名無しさん
09/10/15 05:43:27
>>256
coroutine.wrap をつかえば、普通の関数呼び出しと同じように resume もできるよ。
258:デフォルトの名無しさん
09/10/15 11:25:20
変態文法&バイトコードがエンディアン依存なluaを広めるのやめようぜ
手間が増えてスクリプトにしてる意味がねえよ
259:デフォルトの名無しさん
09/10/15 11:27:46
luaって、oracleにアクセスするライブラリないですか?
260:デフォルトの名無しさん
09/10/15 22:50:58
JavaからLuaを使うことってできる?
261:デフォルトの名無しさん
09/10/15 23:24:54
JavaからC言語を使うことってできる?
262:デフォルトの名無しさん
09/10/16 10:56:47
>>259
URLリンク(www.keplerproject.org)
Lua for Windows についてくるよ。使ったことないけど。
URLリンク(luaforwindows.luaforge.net)
263:デフォルトの名無しさん
09/10/16 11:14:25
>>259
というかそんな『重い』プロダクトを扱うなら、
素直にPythonやRubyなんかのライブラリの整備されたスクリプト言語使ったほうがよくなくね?
264:デフォルトの名無しさん
09/10/16 11:16:27
まあそんなこといいつつ、俺もPythonで軽量なDBラッパー探したら見つからなかったので
ActiveRecord互換のORMライブラリを自作したんだがな。
265:デフォルトの名無しさん
09/10/16 11:24:25
>>258
Luaの速度に魅力を感じてる人がなんとなく多い気がするね。
あとは、リスとかに比べるとドキュメントの多さなんかが人気の秘訣?
266:デフォルトの名無しさん
09/10/16 11:27:28
某MMORPGで使っているからだったりして。
267:デフォルトの名無しさん
09/10/16 12:17:07
ああ、別にROに限らず採用実績っていうのは使う基準に十分なるだろうし。
268:デフォルトの名無しさん
09/10/16 12:25:08
組み込みに求められるのは速度と少ないメモリ消費だから
多少なりと癖があろうとlua使っちゃうんだよね
他に比べて採用例も多い分、多言語との連携も充実してるし
269:デフォルトの名無しさん
09/10/16 12:53:36
ORMの次は、C/C++とスクリプトのマッピングだ、というアナロジーだけで
動いてるやつがいるような気がしてきた
270:デフォルトの名無しさん
09/10/16 13:04:45
>>組み込みに求められるのは速度と少ないメモリ消費だから
なんで? 別にそれは前提条件にならないと思うけど。
オレはゲームシステムを組んでいるところだが別にメモリ消費量は大して気にしてないぞ。
速度は大切だが、どうせ1スレッドでは間に合わなくなるのでマルチスレッド化するし、
ボトルネックはスクリプト部分ではないので問題ない。
271:デフォルトの名無しさん
09/10/16 13:14:26
ヤマハ RTX1200 に Lua 実行機能搭載だってさ
URLリンク(www.rtpro.yamaha.co.jp)
272:デフォルトの名無しさん
09/10/16 13:17:06
AngelScript使おうぜ
273:デフォルトの名無しさん
09/10/16 13:37:08
まぁ、なんだかんだでluaが一番なんだけどね
274:デフォルトの名無しさん
09/10/16 13:58:37
>>273
俺はそうは思わないけどな……。
触ったことあるけど文法がちょっと癖あるし、整数型がないし。
Pythonの方がよっぽどいい。
275:デフォルトの名無しさん
09/10/16 14:01:01
>>274
いやいや、個人的にではなく一般的にね
上でも出てるけど書籍や採用例が多いとかさ
276:デフォルトの名無しさん
09/10/16 16:06:28
このスレはIronPython使いと、AngelScript使いが一人ずつ常駐してるんだなw
277:デフォルトの名無しさん
09/10/16 17:20:01
こんだけで組み込み言語として使えるわけで、
URLリンク(alpha.mixi.co.jp)
でもphpに組み込みってなんだ。
URLリンク(www.mediawiki.org)
まあPECL拡張は2年前で止まってるみたいだけど
278:デフォルトの名無しさん
09/10/17 00:50:19
PHPはインタプリタを組み込めないライセンスだからなー。
この制限さえなければ今までなかった用途が色々できると思うんだけど。
279:デフォルトの名無しさん
09/10/17 15:11:07
>>278
??どういうこと?
280:デフォルトの名無しさん
09/10/17 15:38:39
>>279
うう~ん……。問われたので改めて調べてみたが、どうやら間違った認識が一部あったようだ。
PHPインタプリタ本体はPHP License 3.01で配布されていて、
こいつは
・配布するソースコードまたはドキュメントに著作権表示、ラインセンス本文を記載すること
・PHP Groupから許可を得ずにPHPという名前を使用しないこと
(PHP Fooやphpfooはだめ。Foo for PHPはOK)
・文言の表示強制("This product includes PHP, freely available from <URLリンク(www.php.net)")
だけだな。インタプリタ自体を内蔵することは問題なさそう。
契約なしに内蔵できないのはZendライブラリなんだそうな。
(Zend Frameworkは修正BSDライセンス。Zendライブラリとは何ぞや?)
281:デフォルトの名無しさん
09/10/17 23:30:49
ここでzlibライセンスのSquirrelとAngelScriptの出番ですね!
282:デフォルトの名無しさん
09/10/18 01:54:10
luaスクリプト上でコルーチンを作成をした場合は
明確的に破棄する方法はないようなのだけどC側から
//コルーチンを実行するのスレッド(ステート)を作る
lua_State *L = lua_newthread(luaL_newstate());
//C側からコルーチンの操作
//コルーチンのスレッドを閉じる
lua_close(L);
とした場合はコルーチンを実行する為に確保されたメモリは解放されますよね?
283:デフォルトの名無しさん
09/10/18 03:54:02
そいや、Ioって言語はどうよ?
シンプル、軽量というのが売りらしいが。
284:デフォルトの名無しさん
09/10/18 09:02:18
>>282
lua_newthreadで作成したコルーチンはlua_closeしちゃ駄目だよ。
開放はGCにまかせる。>>121あたりから同じ様な質問出てるから見てみ。
285:デフォルトの名無しさん
09/10/18 09:33:44
>>284
指摘ありがとうございます
つまりスタックに積まれたコルーチンのスレッドを
lua_popで削除すればいいのですか
でもそれだとGCまかせでスグにコルーチン破棄はされないので
>>282のを
//コルーチンを実行するのスレッド(ステート)を作る
lua_State *L = luaL_newstate();
lua_State *T = lua_newthread(L);
//C側からコルーチンの操作
//ステートを閉じる
lua_close(L);
とすれば閉じるのはコルーチンのステートではないものの
lua_newthread は元のステートのオブジェクトを共有するみたいなので
コルーチンで確保されたメモリも同時に解放されますよね?
286:デフォルトの名無しさん
09/10/18 10:07:08
>コルーチンで確保されたメモリも同時に解放されますよね?
まぁ、そらそうだが。
任意開放ならlua_gcじゃ駄目な理由でもあるの?
287:デフォルトの名無しさん
09/10/18 10:29:55
駄目な理由はないのだけど
GCという目に見えない物に頼るより
自分で明確的に管理したくて
288:デフォルトの名無しさん
09/10/18 10:37:32
つまりC#くそくらえってことですね
289:デフォルトの名無しさん
09/10/18 10:43:50
(#^ω^)
290:デフォルトの名無しさん
09/10/18 11:14:07
(C#^ω^)
291:デフォルトの名無しさん
09/10/18 11:22:19
(Ruby#^ω^)
292:デフォルトの名無しさん
09/10/18 11:27:18
>>287
Luaでは文字列もテーブルも関数もuserdataもGCで管理されてる訳だが、そういうのも自分で管理したいの?
293:デフォルトの名無しさん
09/10/18 11:31:28
>>292
そこまではこだわってないです
それらはスクリプトに自分で定義しないと生成されないから
ある程度は管理出来るので
294:デフォルトの名無しさん
09/10/18 11:54:51
>>285
元のステートごと閉じてたら、そのコストがでかすぎて全然うれしくないと思われ。
GCいやな人は lua 使うな、が精神的には正しい。squirrel にしときなされ。
295:デフォルトの名無しさん
09/10/18 12:06:48
>>283
遅い
検索しづらい
296:デフォルトの名無しさん
09/10/18 12:07:49
>>283
言語としては面白いよ
組み込みも簡単に出来るし
でもWinの開発環境を整えるの面倒
297:デフォルトの名無しさん
09/10/18 12:26:45
ネットでの検索しやすいのさは大切だよね
iPhone 3G S もジョブスが発表後に iPhone 3GS に改名させたそうだ
298:デフォルトの名無しさん
09/10/18 12:28:16
> ネットでの検索しやすいのさは大切だよね
「ネットでの検索のしやすさ」の間違いです…
自分でワロタ
299:デフォルトの名無しさん
09/10/18 12:37:33
>>294
>元のステートごと閉じてたら、そのコストがでかすぎて
具体的にkwsk
300:デフォルトの名無しさん
09/10/18 13:09:55
>>299
や、普通にグローバルな関数や変数も全部毎回順次解放&登録しなおすハメになるじゃん
そういったコストを下げるために共有させる仕組みなのに本末転倒だろう
それぞれのスレッドが完全独立で頻繁に起動するものでもないのなら止めはしない。
301:デフォルトの名無しさん
09/10/18 13:17:45
>>285を見る限りコルーチンを実行し終わった時に
不要になったのを解放するのだから問題ないでしょ
302:デフォルトの名無しさん
09/10/18 14:09:07
実際にはluaL_openlibsが必要だからコストが大きいよ
擬似コードにはいちいち書かないだろうけど
擬似コードを書くとどうしても、目に見えない物に頼りがちだよね
303:デフォルトの名無しさん
09/10/18 16:00:28
ちょっと前にLuaで乱数を作っていたものだけど
今度は重複しない乱数を表示させたいと思っている。
でも何度やってもできない。。。
ヒントだけでも教えてください
304:デフォルトの名無しさん
09/10/18 16:05:01
そもそも重複しないものは乱数とは言わない。もはや lua とは関係ない話なので手頃なアルゴリズム系の質問スレに移るのをオススメする
ヒント:シャッフル
305:デフォルトの名無しさん
09/10/18 16:19:02
>>304
レスありがとう
ということは、最初に規定量の数値を指定しておいてそれをシャッフルすればいいってことか!
ありがとう。
306:デフォルトの名無しさん
09/10/18 16:59:56
個人情報が流出しても、ニュー速民は困る人いないよね?
スレリンク(news板)
307:デフォルトの名無しさん
09/10/18 23:54:16
(C#^ω^)
308:デフォルトの名無しさん
09/10/23 14:27:21
以下のようなプログラムで
クリティカルセクションの所有権を放棄し
それぞれのスレッド、スクリプトの実行を
安全に終了させるにはどうしたらいいでしょうか?
-- test.lua
while true do
foo()
end
-- test2.lua
while true do
foo()
end
-- main.cpp
void thread1(){
・・・
if(luaL_dofile(L,"test.lua")){
・・・
}
void thread2(){
・・・
if(luaL_dofile(L,"test2.lua")){
・・・
}
int foo(luaState* L){
EnterCriticalSection(&CriticalSection);
// 少し重めの処理
LeaveCriticalSection(&CriticalSection);
}
309:デフォルトの名無しさん
09/10/24 00:21:40
1つ1つのLuaステートをLua_yield使って個別に動かすのはダメなの?
310:デフォルトの名無しさん
09/10/24 00:42:33
あれ もしかしてAngelScriptって結構良いんじゃね?
名前が可愛いからちょっと舐めてたわ
311:デフォルトの名無しさん
09/10/24 00:51:08
>>310
できたら、どの辺りが気に入ったか詳しく
312:デフォルトの名無しさん
09/10/24 06:30:35
ついでに、このスレに常駐しているAngelScript信者の方にお聞きしたいのだが、
LuaやSquirrelと比べて優れている点は何がありまんすか?
313:デフォルトの名無しさん
09/10/24 06:39:49
//
/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ AngelScript!!
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
314:デフォルトの名無しさん
09/10/24 07:09:44
AngelScriptの@がよくわからん。
オブジェクトの参照なのか?
Hoge@ hoge;
みたいなの。
C++みたいに、インスタンス入れる変数と参照がわかれているのか?(C++詳しくないからなんtねいったらいいかわからん)
LLなのに面倒な言語だな…
全部、デフォで参照でいいと思うんだが
315:デフォルトの名無しさん
09/10/24 12:38:48
>>314
スクリプト言語の癖に静的型付言語だからなぁ。
それって本当に意味あるのか? って思ってしまう。
Booとかも触ってみてその動作速度は認めるけど、スクリプトの記述が面倒に感じる。
316:デフォルトの名無しさん
09/10/24 13:28:09
ActionScript3.0 もいちおうスクリプト言語だけど、静的型付言語。
まぁ、インタプリタじゃないけどね。
317:デフォルトの名無しさん
09/10/24 23:43:43
>>312
・文法がC++まんまなので書きやすい
・C++との連携が簡単
・クラスとかほぼそのまま使える
・const~やenumなど、定数定義が可能
・#includeも可能
こんなところか?
>>314
その例だと、「Hogeクラスの参照型」って扱いになる。
C++のHoge &という記述に近い。
318:デフォルトの名無しさん
09/10/25 00:41:08
スクリプトを自分で改造して使いたいんですが、ライセンスが緩くて
ソースが読みやすく短い組み込みライブラリのお勧めを教えてもらえませんか?
今のところLuaが最有力候補だと思ってます。
319:デフォルトの名無しさん
09/10/25 01:10:08
Squirrelがソース短いんじゃなかったっけ。読みやすさは知らんが。
320:デフォルトの名無しさん
09/10/25 05:11:42
>>319
実質としてはそんなに悪いコードではないが、しかし決して良いコードではない。
そして、SqPlusは絶対に読むな。頭が痛くなること請け合い。
それはそうと、Xtalのコードは大変いいと思うぞ。
言語自体の仕様は首を傾げたくなるところがあるが。
321:デフォルトの名無しさん
09/10/25 08:12:58
\ l´⌒\⌒\ \\ \
\ ヽ ) ) \\ \\
( \ \∩___∩ \\
\ \ ⌒⌒| ノ ヽ \\
\ \ / ● ● ト、\ \\\
\ Y | ( _●_) ミ\ \\\
\ / 彡、_ |∪| ノ \ \\\
(____)―ヽノ' ヽ  ̄ ̄ ヽ\\
\, j l l .l }
Lua! l (_ノノノノ
322:デフォルトの名無しさん
09/10/25 17:53:23
>>320
Xtalのコードは俺の頭じゃ解析不可能だからLua読んでます。
323:デフォルトの名無しさん
09/10/25 18:55:12
SqPlus使おうと思ったらもう全然更新してないのか
いったいどれにすれバインダ
324:デフォルトの名無しさん
09/10/25 20:22:51
そもそもSquirrel自体全然盛り上がってないというか終わってるというか
始まる前に終わっちゃったよ的な
325:デフォルトの名無しさん
09/10/25 20:29:35
Lua 5.2まだー
326:デフォルトの名無しさん
09/10/25 22:01:57
>>323
SqPlusはダメすぎる、忘れましょう、使ってる人はたぶんいません
squirrelのバインダは自分で使い易いように自分で書いた方が1024倍マシよ
327:デフォルトの名無しさん
09/10/25 22:15:15
そこでバインダとか無くても全然問題のないAngelScriptの出番だな
328:デフォルトの名無しさん
09/10/25 22:36:22
>>326
ごめん、動いてるものはさわるな原則にのっとって使い続けてる^^;
一部手はいれてあるけど。
時間あったら新しいバインダにしたいんだけどなかなか……
329:デフォルトの名無しさん
09/10/25 23:08:08
スクエニのゲームはSqPlus使ってるって
cedecのスライドに書いてあったよね。
330:318
09/10/26 01:03:53
SquirrelとXtal読んでみます。
ありがとうございました。
331:デフォルトの名無しさん
09/10/26 02:05:58
こうなったらLuaとSquirrelとAngelScriptの合わせ技でいくか
332:デフォルトの名無しさん
09/10/26 14:10:36
angelscript初めて知った。いいなこれ!!
スタックゴニョゴニョしなくていいからコード読みやすいし
なによりデフォルトでメモリ上から「のみ」スクリプトコードをロードできるってのがイイ!
ゲーム開発だと裸のままスクリプトファイルが置いてあることなんてないからね。。。
モジュールのロードとかもオブジェクト指向で非常に素直に書けるぽいし
さっそくLuaを破棄して組み込んでみよう
333:デフォルトの名無しさん
09/10/26 14:25:29
AngelScript つかう場合は、これ C++ だけでよくね?という思考に陥らないように注意な
334:デフォルトの名無しさん
09/10/26 16:01:05
まんまC++なのがメリットでありデメリットでもある
335:デフォルトの名無しさん
09/10/26 20:39:28
>>AngelScript つかう場合は、これ C++ だけでよくね?という思考に陥らないように注意な
前使おうとして陥った
ちょっと聞きたいんだが、AngelScriptを使っている人や使わなくなった人(他の言語に移った人)は
なんで使っている、使わなくなった?
C++そのままというか継承に制限があるのが大きくてSquirrelに移ろうと思ってるんだけど、
他の人はどう思ってるのか気になる
アプリ実行時にちょこちょこ書き直したり、コンパイル/リンク時間の省略とかスクリプト自体の
メリットは分かるんだが…