【Lua】組み込み系言語総合 その2【Squirrel】
at TECH
1:デフォルトの名無しさん
09/05/25 09:11:41
LuaやSquirrelなどアプリケーションへの組み込み用途で
使われるプログラミング言語についてのスレッドです
まとめwiki(なにか質問する前に必ずみること!)
URLリンク(wikiwiki.jp)
その他の参考URLは>2から
■前スレ
【Lua】組み込み系言語総合【Squirrel】
スレリンク(tech板)
■過去スレ
その3 スレリンク(tech板)
その2 スレリンク(tech板)
その1 URLリンク(pc5.2ch.net)
2:デフォルトの名無しさん
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対象になる」が正解みたいやね。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4274日前に更新/247 KB
担当:undef