【Lua】組み込み系言語総合 その2【Squirrel】
■よく分からないので前スレからコピペ
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(だれも使ってなさそうな、組み込み言語)
ttp://www.compuphase.com/pawn/pawn.htm NullLogic Embedded Scripting Language
ttp://sourceforge.net/projects/nesla/ ※テンプレ以上※
1乙
次から AngelScript も足してあげていいんじゃないかとちょっとオモタ
luaでlua_call する前に関数と引数をプッシュしますよね。そういう作業の前には
かならずlua_settop(L, 0)したほうがいいんですか?
lua処理の前後でちゃんとスタック深さが一致するようにプログラムを心がけていれば
不要なものなのでしょうか。
何かする前に必ずlua_settop(L, 0)するクセを付けておいたほうがいいのか、
それともそれはCでグローバル変数を必ず=NULLや=0で初期化しないときがすまないような、
ちょっとできなそうな人がやることなのでしょうか。プロフェッショナルはlua_settop(0)
なんていちいちやりませんか?
>>8 「かならず」などと言う杓子定規なスタイルで
プロフェッショナルになれるとは思えない。常識的に考えて。
新しいクマスレはここですか?
いいえ、ケフィアです
>>2 このスレは既に鯖移転してる物が含まれてるぞ。
プログラム板はpc12鯖だぞ。
>>8 場合によって異なる。バインダの一部として実装するときは
settopによる副作用(必要だった値がスタックから蒸発するなど)の方が心配なので、
それ無しでも正しく動作するよう慎重に実装するべき。
一方、本体側からスクリプト側のコードを呼び出す際は大抵は戻り値は不要なので
削除しても差し支えない。だからsettopを呼び出す方法もアリ。
もちろん、エラーや例外がスタックに入っている場合もあるのでその対応は必要。
同じ仮想スタック型言語であるSquirrelでもまったく同じことが言えるだろう。
>>7 公式サイトへのリンクだけでもいいから作ってあげてください( ´・ω・`)
luaでhoge=0xFF8888FF のあとに return hogeと書いてある関数があって、
この戻り値をlua_tostring() でとったときに0xff8888ffの10進数表記である
"4287138047"が得られることを期待していたのですが、
なぜか1インクリメントされた"4287138048"が入ってきてしまいます。
しかもコンパイル→実行しなおすとちゃんと "4287138047" が入ってたり、
あれ?と思ってもう一度やると "4287138048" だったりで、よくわかりません。
この現象についてなにか心当たりありますか?
luaスクリプト内をステップ実行して、挙動を眺めれば済む話じゃないか。
バグです
doubleの丸めかね?
SqPlusで複数VMが扱えなくて悩んでたのですが、
もしかしてSquirrelって基本的にVM一個だけ作るのが普通なの?
>>20 そんなこたー無い。sqplus が設計古いだけ
でも、実際問題として、VM複数扱うと、初期化処理とかめんどくさくね?
実行処理を複数保留するだけならスレッドつかえばいいわけで。
>>20 オレも以前そう思ってざっとソースを見たが、
VMが複数インスタンス動いたときに
static変数で干渉しそうなところは
エラーメッセージ関係くらいだった。
グローバル変数は探しにくいので確証は無い。
実際のところ、Tclなんかと違って複数VM間の通信手段が限られてるから
あまり使い勝手はよくないと思うよ。
>>20の言う複数VMって、STGでたとえると、
(1)敵1匹ずつにVMを持たせて個別に処理をさせる
(2)使う関数が異なる、背景のみの処理をするVMと、敵の出現パターンを管理するVMとを同時に動かす
のどっち?
sq_threadで派生VMを作ってスレッドで回したことはあったけど、
独立した複数VMを動かすのはちょっと用途が思いつかないなぁ
是非
>>20のSquirrelの用途が知りたいなぁ。ゲーム以外なの?
23の2かな。
同じプログラムの中に、ゲーム用と3Dモデル変換などのツール用の2系統あって、
混在して使うことがないので分けたいなと思いました。
なるほど完全分離してる部分か。それなら納得。
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 で正解だと思う。
>>26 SqPlusは変というか、VM本体に対して余計なことをしている。
new()で作り捨てたクラスにVMのハンドルを管理させるようなことをしてるから、
main()関数を抜けた後でしかSquirrelの開放処理が行われなくなる。
こんな動作だと、フレームワーク解放前にリリースしないといけないC++側のオブジェクトの開放ができなくなる。
既に指摘はしてるんだが、開発者はその重要性がわかってないようだ。
一応複数のVMの対応はされてるように見えるが、実際に動かしてみないとなんとも。
scratはきっちり書いてあるんでなく、なにもやってないだけ。
こっちは試しに動かしてみたが、まだまだ完成度が足りない。
指摘したら開発者黙り込んじゃった。
SQBindのほうがややましかな。ちょこちょこといじれば何とか使えるレベル。
fork しちゃいなよ
Sq++か
>>27 ああ、なにもやってないの重要というか、オブジェクト保持用のクラスは明示的に
VM 指定の口をもってて取り回しするように書かれてるから、これなら完全に
ユーザの管理下におけるね、と思ったんだ。
SQPlus のほうはいきなり中の見えないとこで VM 管理してるグローバルな変数を
呼び出したりしてるから、いろいろ切り替えたりいじったりしてるうちに間違いなく
破綻すると思う。切り替え処理がグローバル変数に代入とか怖すぎる。
まあ、実はぱっと全体眺めただけで全然使ってみてはないんだけどね > sqrat
とりあえずあのメンバ変数の処理機構はいろいろ難ありだなーと思う。
あとインスタンス返す処理あたりもなんか微妙
sqbind はぱっとみ泥くさかったのであんままじめに見てない
>>30 そう。VMのハンドルはユーザーの管理下におき、ユーザーの望むタイミングで
開放処理( sq_close() )が行えるようになってないと正しく終了できないじゃないか。
Sqratはなかなか筋がいいが、まだ作者がSquirrelの仕組みをよく理解できてないみたい。
メンバ変数の登録・呼び出しだけど、あれが普通だと思うよ。
この辺はSqratもSqBindもSqPlusも大差ないはず。(_get/_set乗っ取り)
SqBindはスレの進行である程度バグが直ってるのでまあ使えないことも無い。
しかし事実上SqBindクラスしか使えない構造になっていて、
意外にバインダ自体のカスタマイズの自由度が低い。
私自身はjkBindを買っていて、あのboost式の書き方はなかなかいけてると思うんだが、
(特にバインドするC++クラスのコンストラクタの登録の仕方が出色の出来)
ドキュメント・ユーザーが皆無なのでいまさら使ってくれる人がいるかどうか。
以前、数日かけてSquirrel-2.2.2-stableまでに追加された仕様にあわせた
追加実装をして、フォーラムに貼り付けたんだが。
>>31 sqplus は、メンバ変数を登録しようとするまで _get/_set のっとったりしないのでその点は許容範囲w
sqrat はたしか問答無用でもってかれるよね。
個人的には、スクリプト側での継承性を重視してて、メンバは 必ず getter/setter の形の
メソッドとして squirrel 側に登録する形にしてるんだ。
C++ 側で getter/setter がなくて public なメンバーになってる場合でも、
その場でテンプレートで struct 内に static な参照用関数つくってそれを登録してしまう形にする。
だから、そのあたりのバインダの今の機構はまるごといらない。
ちなみに_get/_set 自体は、メンバが存在してなかったら、その名前に合致した
getter/setter を探してそれを呼び出すって形の機能を組んで使ってる。
jkBind はどんなだったかよく覚えてないや^^; 当時はまだテンプレートよくわかってなかったし、
なんかややこしいなと思って放置したような……
今、自分がメインでさわってる範囲だと、C++ のクラスのほうの形を固定化してる
ので、わりと手作業部分が多い形の簡単なバインダ書いてつかってるんだけど、
よそからもってきたライブラリの接続用に、もっと汎用的になってるのがほしくて、
一応 sqplus 使ってたんだけど、ちょっとなぁってことでもろもろ乗り換え検討中。
sqrat がとりあえずの筋はよさそうなので改造して使おうかなぁ。
>>32 オレの場合、setter/getterは原則用意しない。
メンバ変数のみのstruct的なもの、メソッドのみのclass的なものに大抵は分かれる。
その説明だとC++メソッドをどう登録するかの説明が無いみたいなんだけど……?
それから、SqBindの場合、_get/_setはバインドしたメンバが無い場合は
キャンセルされてSquirrel側に制御が戻る。
だからバインドした後でSquirrel側から登録したものを呼び出したり(これは確認)、
継承したりも有効(これはたぶん)
オレはバインドされたC++側のインターフェイスの固定さ加減を自分で信用してないので、
バインドしたSquirrelクラスをさらに継承したりはしないようにしている。
そうするときは包含にするね。
そういや、Squirrelはプロパティがほしいかも。
何かややこしそうなので俺はAngelScriptを使うぜ!
実際ややこしいだろ
自動生成したコードを手動でデバッグするんだからな
あー、つまり
ボトルネックじゃない所を自動化しちゃってる可能性もあるわけだ。
>>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 だけなら書き込み専用プロパティ、でまあ、ちゃんと
それっぽくできてる。その機構用に使ってるからバインダは勝手につかわんでくれってのもある
ボトルネックじゃないところを自動化してもらえるんなら大いに結構じゃないか。
>>37 あれ? すると、ちょっと解せない動作があるな。
C++側で定義したPointクラスをSquirrelにバインドしているんだが
このインスタンスに対する加算を
function Point::_add(point)
の形でSquirrelスクリプトの中で追加登録している。
この状態でインスタンスに対して加算を行われると、いったんSqBindのgetterを呼び出して失敗してから
_addが呼ばれているように見えるんだな。
メタメソッドは元から通常のメンバ・メソッドとは違う扱いになっているからそれでかなぁ。
# 例えばインスタンスに対してforeachをかけても登録したメタメソッドを検出できない。
>>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 がさらにテーブルから検索して呼び出すとか
そういう処理が入ってたりするのかな?
どちらにしても大変気持ち悪いことになってるってことになるんじゃないかと…
>>40 スクリプト言語的にはメタメソッドも通常のメンバのように見えているべきなんだけど、
おそらく動作効率上の問題でそうなっているんだろうね。
メタメソッドの存在チェックはAPIが存在しないかもしれない。
Sqratがちょうどそんな実装で、バインドしたメンバの一覧に_getで呼び出されたメンバ名が存在しない場合、
エラーを返さずに何もしないものだから、
Squirrelインタプリタは返ってきたnullに対してメタメソッドの呼び出しをかけようとして失敗してる、んだったかな。
とにかくバインダ側で登録する_getは、管轄外メタメソッド呼び出しに対してはfalseまたは例外を返してあげないといけない。
Squirrelインタプリタの実装側ももうちょっとやりようがありそうな気がするけどね。
久しぶりにRSS更新キターと思ったらそのニュースでちょとガッカリ。
Google AndroidはカスタマイズされたLinuxそのものなんだから、
元から使えて当たり前だもんなぁ。
Cにさ、lua 組み込んでるとさ、luaのソースみたときに、どの識別子が
Cから参照されていて、どれがローカルだけで使用されているのかわからなくなる場合があるよね。
命名規則とか、やってる?
一応、Cから呼ばれる関数と変数名は全て __ で始まるようにしてる。
でも大文字で始まっているのが全てCから参照される識別子 って規則の方がほうが
わかりやすいのかな。どうだろう。 __ で始まるのは、間違いが無い気がする。
大文字で始める識別子って、けっこううっかりつけそうな気がする
>>45 local宣言しないとローカルにならないし
requireもあるから問題無いよ
>>46 それでは45に対する答えになってないだろ。
答えは、「区別する必要はない」だな。
後始末が必要ならファイナライザでも書いてあげれば済むことだ。
馬鹿っぽいこときくかも知れないけど
C言語レベルのプリプロセッサのライブラリってあるの?
軽量スクリプト言語の、さらに前処理用。
自作しろといわれりゃ相応の時間をかければ作れそうだけど、
こういう泥臭いのは必要な人は自分で作るのかなあ。
>>48 CPP32ってC/C++プリプロセッサがVectorにあるよ。
あとboost::waveとか。
51 :
48:2009/06/11(木) 23:33:12
どうもありがとう。見てみます
プリプロセッサはなぁ……。
有用さは認めるし、実際プリプロセッサを活用したゲームの処理系は見たことあるわけだが、
結局ソースコードが爆発してコンパイラ・インタプリタ側に負担がかかるのが落ちなので、
オレはあまり賛成はしかねる。
C++とC#のビルド速度の差を思うとな。
あらかじめプリプロセッサを通してスクリプトを変換し、それをプログラムに読み込ませるという手もあるよ。
ただ、Luaでそれやるとコンパイルエラー出まくりだったと思う。
AngelScriptは問題なし、Squirrelもたぶん問題ないと思う。
ただ、外部スクリプトであったらいいなと思うプリプロセッサの機能は#includeだけのような気がする。
lua でソース分割したいとき(というよりも、ソースを複数のluaスクリプトで共有したいとき)
ってどうすればいいの?
Luaファイルをロードしてライブラリとして登録みたいな関数がある?
マクロプロセッサといえばm4
>>54 requireかdofileじゃだめ?
Luaに名前空間ってあるんですか?
同名関数が別ファイルにあったばあいどうするんですか?
あまりに糞なライブラリなら捨てて再構築するのもいいんじゃないか。
軽量スクリプト言語なんだし
>>56 グローバル変数を参照または代入する際に呼ばれるメタメソッドを設定できるよ
>>58 同名関数が有った場合の挙動の設定ができる、
という意味でしょうか。
同名関数のあるLuaファイル2つを
C++側で開いた時、どうしても呼び分けられない・・・・
>>59 というか、LuaもSquirrelも関数はファーストクラスオブジェクトなんだから、
2回定義したら最初のやつは消えちゃうでしょ?
オーバーロードとかはそのままではできんわなー
>>56 テーブルで名前空間っぽいものが実現できる。
-- A.lua
A = {}
function A.hoge()
...
end
みたいに書いてCからは
lua_getglobal(L, "A");
lua_getfield(L, "hoge");
lua_call(L, 0, 0);
で呼び出せる。
LuaってluaL_loadbufferして
lua_pcallしたあと、
luaL_loadbufferのバッファって捨てられないんかな?
loadbufferしてpcallすると
実際のバイナリサイズの二倍くらいメモリを食っているようなんで
pcall後のloadbufferのチャンクは
感覚的にはいらないように感じるんだけど……。
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です。
バイナリモードの書き込みはどうすればいいのかご存知の方教えて下さい。
C# にIronPythonを組み込んで色々といじってみてるところなんだが、
C#のクラスをPython側で使うときの便利さが神すぎるな。
なんせ、バインダ用のコードなんて一行も書く必要なく、
Python側で通常のモジュールのようにimportするだけで普通に作ったり殺したりできるんだから。
(当然ながら触れるのはC#側でpublicに指定している部分のみ)
いやはや。.NET Frameworkはすばらしい。
反面、Python側のコードをC#側から呼び出すのはちょっとしたおまじないが必要だが、
これはまあ型のある言語から型の無い言語の機能を呼び出すのに手間がかかるのはしょうがないかなぁ。
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;
}
な事してるので文字にしちゃうんですね。バイナリで書き出すのはやめときます。
>>65 ありがとうございます。なるほど、たしかにそれだと0x01が書き出されました。
>>67 ファイルIOくらい、簡単に自作してしまえばどう?
Squirrelの標準ライブラリはバイナリファイルしかろくに読めない代物なので、
通常の読み書きは自作のクラスを使ってるよ。
C/C++で書いてバインドしてしまえばいい。
>>69 64です。
そうですね、頑張ってみる事にします。
まだlua始めて間もないので、もう少し慣れてからですかね。
アドバイスありがとうございます。
>>66 .netのいいところは、同じ.netの言語の相互運用が従来の組み込み言語より格段に楽なところだよなー。
俺が何をいいたいかというと、IronRuby頑張ってくれっていう
Google V8を組み込み言語として使ってみた人いる?
速度的にはどんなもん?
うは。IronPythonのスクリプトをアセンブリ(DLL)にコンパイルして、普通に実行できてしまった。
すごすぎるwww
まあ逆コンパイルして眺めてみたら明らかにC#より無駄なコードが多いから
何でもかんでもこれというわけにはいかないけどね。
.NETが凄いんじゃなくて、IronPythonを実装した人が凄いと思う。
あの人、元々は.NETを否定する論文書くために実装してたのにw
論文書いてるうちに、こうやったらできるんじゃね?と思って作ってみたらナイスにうごいちゃったんだっけか。たしかw
もうちょっと踏み込んで、Squirrelみたいにスタックレス実装にしたらできることも
色々増えるんだけどねぇ>IronPython
まあSquirrelのパフォーマンスを考えると、
その分処理能力が落ちちゃうのかと思わないでもないが。
久しぶりの更新きた
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
すごい久々だね
開発続いてるのがありがたい
Squirrelの作者さんは答えてくれるときはとても誠実に返答してくれるんだが、
要望出しても無視されてそのまま終わっちゃうことが多いんだよな。(フォーラムにて)
直接メールを出したほうがいいのかなぁ。
squirrelってまだ一人で開発してるん?
そういえばRMSがC#は危険だと言ったらしいが
pythonとsquirrelも2.xの開発がいつまで続くか気になるなあ
RMSはGNUにとってC#およびMonoが特許侵害を踏まないかという点で危惧してるだけで、
C#の開発者がいなくなるとかそういう話ではない。
>>66とか
>>73がRhino使ったらどんな反応するのか気になる所だが
そもそも組み込みでjsてエディタのマクロ言語とかしか見たことなかった・・・。
質問。今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の人みたいけど、あれは使わないで様子見の方がいいのかな。
>>84 いやー、sqratの作者さんはJITの人とは別人ですよ。レスは書きましたがー。
一旦2引数の関数として登録して様子を見る、かな。
Squirrelのデフォルト引数はインタプリタが自前でやってるので
バインダ側で自動的に取得って言うのは無理っぽいんじゃないかなぁ。
理屈上はデフォルト引数をテンプレート型の
オブジェクトとして渡してあげればいけそうですが。
ともあれC/C++は関数型言語ではないし、あまり突っ込んで実装するほどのことではない気がします。
>>85 そうですね。諦めてSquirrel側で関数定義しようかな。
DXライブラリというのを丸ごとバインドしようとしているのですが、ライブラリのAPIの仕様と
Squirrel上の関数の定義が一致していないとC++のソースからプログラム持ってくるのが
ややこしくなるので、ディフォルト引数定義しないわけにもいかない事情でして。
Squirrel JIT、オリジナル2.1.2の人と改造版2.2.2の人が別なのを忘れておりました。すいません。
ttp://squirrel-lang.org/forums/1/3314/ShowThread.aspx の 05-31-2009, 1:04 PM のZIPです。
最初の"I tried to bind with Sqrat-0.6."(オレはSqrat-0.6で固まろうとした)あたりから不安だったり...
>>86 投稿している改変版ではフォーラムのレスであげている不具合は修正されてるよ。
ただ、自分のプロジェクトで正常に動かなかったのは本当。
もーちょっと色々動かしてほしいところだね。
不具合の2個目の方は、文法的におかしな英文で意味不明なんですが
このスレを読むと、どうも
>>41の人が言ってる話の関連のようですね。
ありがたく使わせてもらうことにします。レス下さった方ありがとうございました。
>>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を返すべきである。
bindedKansu
readedMojisu
直訳:
クラスらのメンバーらとしてのSquirrelスクリプトの一点に呼び出しメソッドを
メタメソッド[_add/_mull/...]を含むbinded C++クラスへ追加されられない。
もし例のキーが未知ならば例のフックを取得する関数[_get]はfalseを返すべきだ。
methodにtheがない、bindの過去分詞はbound、hookをゲットする、その他もろもろ…
もしかして もしかして
lua にはインクリメント演算子がないのか..!?
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にならないのなんでよ
"グローバル環境テーブル"=グローバル変数が属してるテーブルってのが間違い?
>>92 シェルスクリプトにもLispにもTclにもRubyにもPythonにも、
インクリメント演算子なんて無いんだよ。
Luaの変数をC側から取得する前に、
実際に変数が存在するかの確認ってできませんか?
>>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)
]]()
>>97 詳しいサンプルテラthx
スレッドの環境が問題なるのはload*系だけなのねorz
Lua Performance Tips - Radium Software
http://d.hatena.ne.jp/KZR/20090712/p1 > Lua Programming Gems は, Lua のプログラミングテクニックについてまとめた,
> いわゆる「Gems本」だ。公式ページでは第2章 "Lua Performance Tips" を
> サンプルとして無料公開しており, PDF 形式でダウンロードして読むことができる。
> この内容がなかなか面白い。
> 最も基本的なポイントであるグローバル変数とローカル変数の違いから,
> table における配列とハッシュの扱いについて,文字列の内部的な扱いについて,
> 等々, Lua におけるパフォーマンスの要点について触れている。
> (略)
続きはサイトで
sqrat0.7
>>102 MessageBoxあたりで試せばすぐわかるが普通に呼べんぞ?
てゆーかなんでいきなりIronPython?
>>95 Lisp には演算子っていう概念がないからちょっと違うけど、inc ならあるよ。
Lua の代入文の = も演算子じゃないんだよな。代入文は式じゃないから。
>>96 Lua は変数の値が nil なら定義されていないっていう意味になるので、
値を取得してみて nil かどうかを調べればいいんじゃないかな。
厳密には、グローバル変数はテーブルのフィールドとして定義されていて、
値が nil ならそのキーは存在しないことと同値なので。
>>103 MessageBoxは試してなかったけど、確かにそうだよなぁ。
IronPython呼び出し用に再定義してあげないといけないかも。
オレ、以前はSquirrel党だったんだけど今はIronPython方面に。
組み込みスクリプトとしてはアリだと思うんだけど、どうだろう。
Lua > Python:
PythonはC関数を登録してスクリプトから呼び出すのが結構めんどくさい。
コルーチンに制限がある。同じ関数内でしか yieldできないし、yield で引数や戻り値の指定ができない。
独自のローダーを使った import 実装がとにかく面倒。 lua なら lua_load に自分定義のロード関数わたすだけでOK
Pyhton > Lua:
スタックではなく、C上でLua変数はすべて PyObject として表現されるのでCソースの可読性が高い。
関数も整数も全部 PyObject としてC側の変数に保存する事ができる。
環境が充実。
ゲーム用途で組み込んでいる自分としては、コルーチンの使いやすさと、
自作ローダーでのロードが楽(ゲーム用の圧縮ファイルから直接スクリプトを呼び出す必要がある)
な点でLua圧勝。
もしツールに組み込むんだったらソースの読みやすさ+ライブラリ充実さで断然 Python
Eclipse + PyDevが使いやすいのも勝ち点。
わざわざ.NETやMonoに依存したくない
>>100 2日で0.71に上がってるからバグでもあったのかと思ったら、
バインドしたC++の関数の引数にSquirrel関数を渡せるようにしてほしいと
要望もらって一日で作ってきてるんですね。
Kanryuさんのパッチも入ったし仕事はやいぞ。
AngelScript|Д`)<俺らの話題全然ないな
GameMonkey|Д`)<全くだ
CRIScript|Д`)<全くだ
110 :
デフォルトの名無しさん:2009/07/15(水) 01:41:13
チャイってミルクティーやん
と思ったらロゴがほんとにミルクティーだw
Squirrelってリスやん
>>106 Python のyield は引数や戻り値の指定できるよ
Stackless Python なら同じ関数でしかyield使えないという制限もなかった気がするけどうろ覚え
>>114 レスを見てジェネレータ関係を触ってみたら、
Pythonのバージョンによる挙動の差異が如実に出ててビビッた。
3.0系はprint文が関数化されて書式に互換性が無いとか、
ジェネレータのnext()メソッドが使えなくなってるとか。
IronPythonの現行版はまだ2.5系で、今年中に2.6系互換になる予定なのか。
オレには3.0はまだ新しすぎたようだ!
lua_newthread だとグローバル変数が共有されちゃうけど、
グローバル変数を独立させるようにできないの?
コードを共有して変数だけ独立させたいんだけど。
... って書いてて思ったけど、結局関数もグローバル変数と同じなんだから
lua_newstate でいいのか。
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++から呼んでも
例外が出ません
なぜコルーチン内から構造体を使用するコードを書くと例外が出るのでしょうか
luabind は使ったことがないので想像ですが、
コルーチンから C の関数が呼ばれるときは lua_State(L の値)が違うから、
それが問題になってたりしないかな?
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 で内部エラーが発生する(メモリ違反ぽい)
どうすればいいですか?
>>121 >いつ再開されるかわからないからGCで回収できない
んな事はない。
スレッドでも他のデータでも、参照できなくなったらGCで回収される
という事に変わりはない。
>>122 でも C のレベルでは、参照されているかどうかってわからないんじゃない?
つまり、lua_newthread() した直後は、
Lua のオブジェクトからは参照されていない thread ができるわけですよね。
逆にいうと、lua_newthread() しただけだとどこからも参照されていない事になるから、
lua_setglobal か何かを使って、どこかから参照してあげないといけないとか?
どこのlua_newthreadの解説読んでるのか知らんが、
「新しいスレッドを"スタックに積み"……」って書いてないか?
lua_newthreadの直後はC関数のスタックから「参照」されてるし
そのあとLuaで参照したいなら戻り値なりグローバル環境なりに押し込めばいいし
C側だけで管理したいならレジストリ+luaL_refとか使えばいいだろ
何がしたいんだかわかんねーよ
新しいスレッドを積むのはいいんだけど、
古いスレッドが不要になったということをどうやってLUAに知らせるの?
最初に
ls = lua_newthread(...);
lua_resume(ls, ...)
を実行したとして、ls は中断状態のまま残っていると。
で、中断状態をやめて、最初から実行したいということで、いきなり
ls = lua_newthread(...);
lua_resume(ls, ...)
をもう一度呼び出すと、古い ls が上書きされるけど、古い ls への参照も、
なにもかもまったくいじっておらず、ただ単に新しいスレッドを追加しただけにすぎないわけで。
古い ls の参照カウンタをデクリメントするなり、古い ls への参照を
削除するなりの処理がまったく入っていないと。
C++とLuaスクリプトの連携をしたいお年頃なんですが、
toluaとluabindだったらどちらが安定してる感じですか?
>>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対象になる」が正解みたいやね。
>>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の言ってる通りに管理することになる
132 :
131:2009/07/31(金) 21:59:29
と思ったけど、俺が間違ってる気がしてきた・・・
メインスレッドのスタックに、新しいスレッドと関数と引数を積んでlua_resumeを呼ぶ
と思ったけど、違うのか
>>131 え? それだけ言われてもわかんない、どこどこ、教えて!
>>132 ってなんじゃいゴルァ!w
いやそこは合ってるはずだよ、とゆーかみんなCで組み込むなら標準ライブラリのソース読もうぜ
組み込みの基本からトリッキーなものまで一通りそろってるぜ
lbaselib.cのauxresume(L, co, narg)の所を見るとlua_resume(co, narg)となっている。
1番目の引数がLではなくcoだということがマニュアルを読んだだけではわからなかった。
C++でPython組み込んでて
例えば
Pythonのソースにスペルミスがあったとして
それをC++側で知る方法が全く分からない
どなたか分かりませんか
∩_
〈〈〈 ヽ
〈⊃ }
∩___∩ | |
| ノ ヽ ! !
/ ● ● | /
| ( _●_) ミ/ Lua!!
彡、 |∪| /
/ __ ヽノ /
(___)
>>136 Pythonスクリプトのコンパイルエラーやら実行時エラーを取得したいっていうこと?
>>138 そのとおりです。
PyErr_Print () の出力先を変えればいいのだと思うのですが。。。うまくいきません
>>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 で呼び出せるように登録しておく。
>>139 PyErr_Occurred で存在を確認して、PyErr_Fetch で取得
AngelScript2.17記念カキコ
∩_
〈〈〈 ヽ
〈⊃ }
∩___∩ | |
| ノ ヽ ! !
/ ● ● | /
| ( _●_) ミ/ Lua!!
彡、 |∪| /
/ __ ヽノ /
(___)
IronPython……。
開発効率はそんなに悪くないんだが、
スクリプトで書いたメソッドの実行のレスポンスが悪いような気がするなぁ。
最初の実行時に引っかかる感じ。2回目以降は問題ないんだが……。
Q. 自動保守#K9K?_D[L とは一体何なのか?
A. 外部サイトへの突撃大好きな真性厨房
韓国突撃でお馴染みの自動保守
最近は自動焼人 ★として2ちゃんねるのボランティアにも精を出す日々
だがそんな彼にも、人間らしい部分はあったのだ…
名言集
『アパッチ砲はワシが作った』
『お前が規制系キャップ取れるか審査してやるよ』
『いつもサボってばかりのキャップがウゼえ』
『俺、100人規模の集団サイバーテロの主犯だったこともあるんだぜ』
『俺の経歴カックイイだろ?』
最近のニュース
8月15日の韓国突撃の際に歴史的大敗を喫する。ラジオでの敗戦宣言のときに声が震えていた
本人は体調不良と言っているが…
----------------------------------------------
この自動焼人 ★メールマガジンの配信停止をご希望される方は
http://qb5.2ch.net/test/read.cgi/sec2chd/1250169591/ にて自動焼人 ★までご連絡ください
Xtalが 1.0.0.0になった気配
\ l´⌒\⌒\ \\ \
\ ヽ ) ) \\ \\
( \ \∩___∩ \\
\ \ ⌒⌒| ノ ヽ \\
\ \ / ● ● ト、\ \\\
\ Y | ( _●_) ミ\ \\\
\ / 彡、_ |∪| ノ \ \\\
(____)―ヽノ' ヽ  ̄ ̄ ヽ\\
\, j l l .l }
Lua! l (_ノノノノ
なん・・・だと・・・
修正点まだあるみたいだね
XtalってC++以外からは使いにくくない?
っていうか使えるんだろうか
>>151 バインド部分がテンプレートべったりなんだから、そのままではC++以外で使えるわけがない。
ぼやき。
Squirrelを.NET向けに移植しようかと考えたこともあったが、
この分野ではIronPythonが便利すぎてやる気が失せた。
起動が重過ぎる点を除けば処理速度以外は特に不満点はない。
Luaに関しては.NET判処理系のNuaがあるみたいね。
>>152 ですよねー
もうちょい汎用的なバインド方法が欲しいところだ
>>151 試してないけど
extern "C" {}
でC言語リンケージに変換してみるとか。
IronRubyも0.6まで着てたな。Ruby on Railsが動くまでになったらしい。
Rubyも楽に組み込めるといいんだけどね。例えば、スクレイピングの部分だけまかせるとかさ
Xtalっておいしいの?
食わず嫌いはいけませんよ
4時間で6テーマか。
Xtalに特に興味があるなら別のイベントに期待って感じかな。
JITコンパイルでC並の速度で動く組み込み言語とかない?
AngelScriptがJITコンパイルできるようになったらしいが、やり方がわからない…
>>160 言語じゃないけど、NativeClient
昔は高速な組み込み言語はLispだったな。
JITコンパイルじゃないが。
166 :
164:2009/09/09(水) 02:11:46
現状Pythonの組み込みで満足してるというのに、他の言語を検討する必要性をまったく感じない……。
Lua は JIT じゃなくても python より速いよ
IronPythonはLuaより倍ほど速いがな。(2.0.1)の場合。
2.6系ならさらに速くなってる。
ただし速いのは数値計算で、文字列計算などはPythonより遅かったりするが。
組み込み言語って
「Cで書いた (だから速い)」と喧伝しながらこっそりと組み込むものではないのか?
たぶn Luaやリス使っている人はゲームの組み込みが多いと思われるのですが、
Pythonを組み込みに使っている人は、どんなアプリに使ってますか?
>>171 マジで!? IronPython スゴイんだな。
数値計算に関してなら、以前に計測したとき Lua は Python より2〜5倍速かったんだけど。
数値計算については .NET すごいということなのかな?
LuaJITとかCに比べたら桁違いに遅いんじゃない?
というか、Cで各プログラムと速度面で執拗に比較するやつがいるが、意味が分からない。
C/C++にスクリプト言語の動作を追加するのは柔軟性を増やすことで
開発・運用を容易にするためであって速度のためではない。
スクリプト言語で実装した部分が重いなら改めてC/C++側に移植することを考えればいいだけのこと。
ユーザがプログラムを拡張するのに使えるだろ
組込み言語に今注目してる業界にゲーム業界があるが、
ユーザによる拡張をばりばり推進するぜ派(洋ゲー、リアルタイム物メイン)と、
そんなもん完全にアウトオブ眼中だぜ派(和ゲー、アドベンチャー系メイン)で、
まっぷたつですな。
社風の違いだからどうにもならない。
プログラマの部長級が開放的という幸運なケースであってさえ、
総務営業やら会社も巻き込むとやっぱり日本的感覚で
ゲームの内情を客に見せるのは御法度になるね。
プログラマ出身のワンマン社長のところしかありえないでしょう。
プラットフォームの違いもある。
洋ゲーと言えども、360やPS3でMODを許しているものは少ないだろう。
>>178の(和ゲー、アドベンチャー系メイン)ってPCのエロゲ・ギャルゲのことを
指してるんだろうけど、俺としては違和感があるなぁ。
>>181 読んでみようと思って大きな本屋まで行ってきたが、
SQLiteの本とDirectXの本読んでたら満足しちゃってそのまま帰ってきてしまった。
187 :
186:2009/09/17(木) 21:23:49
ご回答ありがとうごじあましたー
メインアプリ起動後に裏で常にLuaを複数同時に動かして
プラグインのようなことをさせたいのですが
何か参考になるサイトやソースコードはないでしょうか?
>>190 メインと切り離す必要が本当にあるならプロセス間通信。
メインの内部で別スレッドを作って回すだけでいいならマルチスレッド。
マルチスレッドだと今度はリソースのロックとかがめんどくさいから、
コルーチンで協調的マルチスレッドにするとかどうですか?
>>191-192 貴重な意見ありがとうございます
コルーチンで実装してみて上手く行かないようなら
マルチスレッドを試す方向で行こうと思います
オレの場合、最初はコルーチンで実装してたが早々にCPUリソースが足りなくなって
マルチスレッドに移行したがな。
ゲームで使用するリソースを開始前に一括してロードするような
FPS的な仕様にしないと単独スレッドの実装は難しい。
>>190が言ってるような
一つのソフト上で同時に複数の
Luaスクリプトを動かす事って可能なの?
変数やスタックがバッティングしそうな気もするし
実際そういうことをしてるアプリ見たことないな
lua_Stateを複数作ってそれぞれ別管理すればいいだけじゃ?
ですね。
Luaはインタプリタの状態がグローバルにならない作りになってる。
V8も以前は・・・
Lua Programming Gems に、
Lua のコルーチンを改造してマルチスレッドにするという記事があるみたい。
http://www.lua.org/gems/ 本は読んでないけど、サンプルコードがダウンロードできる。
Enhanced Coroutines in Lua
Patrick Rapin
何かが引っかかると思ったら、コルーチンでLuaを複数回して
更にLua内でもコルーチンを使うからか
なんか富豪だな
総合的な処理速度はSquirrelとLuaではどちらが上ですか?
>>201 単純な数値計算ではLuaの方が倍くらい早い。
が、いずれにせよCなどの静的型付言語よりは10分の1以下のスピードなので、
あまりヘビーな処理はさせないようにすること。
とはいえ、80:20の法則で大部分のコードはスクリプト側に移行できるはず。
処理能力が足りなくなったら下回りからC/C++に再度移植していく。
>>202 そうですか、一見するとSquirrelはLuaの欠点を補い
構文もC/C++に近いなど利点ばかりかと思っていたけど
それなりに欠点があってゲーム用に改良された割には
未だ使用例が少ないのが現状みたいですね
>>203 いや、C++で書いてたころは普通にSquirrel使ってたよ。
とりあえず基本的なレベルでの不満はない。
オブジェクトの寿命は常に問題になるけどね。
今はもうC++でプログラムは書かないようにしてるから関係なくなった。
>>204 気になるなw
> 今はもうC++でプログラムは書かないようにしてるから関係なくなった。
今は何で書いてるんですか?
.NET系?
>>204 C#+IronPythonだ。レポはこのスレに何回も書いてるのでログを見てくれ。
しかし静的型付言語でいいならBooでもいいかも……(はっきり言ってこっちの方が速いし)
まあ今回は途中まで作ったからIronPythonでやってしまう予定だけど。
204 → 205
Luaステートを増やした(同時実行した)場合のGC負荷は
単純計算でステート数分増えるのかな?
検証してるサイトないか探したけど見当たらない
そりゃ当たり前のことを検証する人は居ないだろう
たまにLuaではcontinueやbreakは出来ないが
それを可能にするパッチがある、とあるけど
実際どこで配布されてます?
ここ数日ずっと探してるけど見つからず
初心者な質問なのですが、
VC++6.0でLua環境を構築しています。
「スクリプト言語による効率的ゲーム開発- C/C++へのLua組込み実践」 の中で
紹介されているtolua++を適応しています。
あるクラスの関数をtolua++を用いてLuaに公開しようと実装したのですが、
extern宣言した関数がリンカエラーでビルドする事が出来ません。
やりたい事は下記の様な感じです。
class CHoge
{
public:
char* GetName( CHage* pHage );
};
このGetName関数をtolua++でグルーコードに出力して、
VCのプロジェクトに登録しています。
出力したグルーコードに記述されている、GetName関数がリンカエラーになってしまいます。
*今はグローバル関数にして、extern宣言で対応しています。
クラスの関数をLuaに公開するには何か特別な方法が必要なのでしょうか?
上記の本にはクラスの関数の場合について記述されていない様なので質問しました。
宜しくお願いします。
Luaでチャンクの区切りを改行ではなく ; (セミコロン)にしたいのだけど
それを可能にするパッチとか出てたりします?
自分で改造しようにも手に負えなくて
配列を0から扱えるように悪銭苦闘したオレに似てるな
オレの場合は自力でやったけど複雑過ぎて無理だった orz
Luaってなんで配列が1からなのかね
いまでもムズムズ、どうにかならないものか
lparser.cのstatement()のswitch文のreturnの前に
check(ls, ';');
って書けばいいんじゃないかな
社会常識は1からだからな。
マジでLuaの配列を0から扱えるようにするpatchありませんかね?
>>214 回答ありがとうございます。
クラスのバインドで試してみます。
>>216 ニューメリカルレシピ・イン・C っていう本にその逆のことが書いてあったな。
一般的な数学では添え字は 1 からはじまるのに C だと 0 からだから困ると。
で、その本では添え字を 1 から始めるように、配列のポインタを 1 つ前にずらしてた。
つまり、int arr[10] みたいな配列をつくったら、
int *arr1 = arr - 1 と定義しておけば、arr1[1]、arr1[2]、……、arr1[10]
っていうふうにアクセスできる。
そもそも0とか1とかいうマジックナンバーを使ってはいけない。
パッチではなく、リファクタリングするべき。
#define FIRST 1
言語はそのままの仕様で使うのが無難ではあるよなー
>>223 Lua以外にするとメモリ消費や処理速度が劣ってしまうのが嫌で
やっぱり仕様に従って使うしかないですか
∩∩ ;
;|ノ||` ┬-‖
__,/●●| __ | | ‖ L...Lua..
| ; |`(_●)/ ミ . Y ‖
| .彡|∪||、 , .| | ‖
/:~ ̄ ̄ ̄ ̄:/.| | ‖
,|:::::. .......::/>> / ‖
/.::::: .. ...::::::|'(/\_/ ‖
../:.::: .. :.:::/.:/ /‖\
/.:::. ....:::..:::/.:/
' ̄ ̄ ̄ ̄ ̄ _/
|_| ̄ ̄ ̄ ̄|_|
BASICでも配列作ると0からなのに・・・・
ここは中間をとって0.5に
BASIC はたいていの実装が OPTION BASE とかで配列の開始インデックスを変更できるぜ
もう連想配列だけにしちゃおうぜ
0からってのはポインタ的な発想で好かんわ
Pythonでシステム組んでるが、配列のインデクスが何番からかほとんど意識することないな。
for文ではそのままイテレータをまわしてしまうし。
Lua標準だと1ステートあたりのスタックサイズは1Kだけど
消費を抑えたくて手動設定する場合
どれくらいの値がベストだろう?
デフォで使用メモリ量が80MBを越える俺の構築した処理系からすれば、
数十キロバイトの仮想スタックなんて小さな問題だ。
新しい必殺技を思いついた
>>236 に捧ぐ
"O"zapper!!
次こそはうまくやりますコンピューター!
>>232 「どっかから」てお前はケツから鼻血がでるのかよw
>>236 RubyでフレームワークとしてRailsを搭載したかのようなメモリ消費量だなおいw
>>239 IronPythonがもりもりメモリ食うからな。
ほんと環境にやさしくないスクリプトエンジンだぜ。
まあ、C#で組むにはこれが一番「普通」なスクリプティングエンジンなので。
IronPythonすげえwそんなにメモリ食いすぎなのかw
luaについてちょっと質問なんだけど、
乱数を表示させたあとに、もう一度同じプログラムを実行すると
シード値が変わらずにまったく同じ乱数が表示されてしまう。
どうすればこのシード値を初期化して、実行するたびに違う乱数を
表示させられるの?
それこそシード値を「適当に」初期化してやればいい。
一般的には、タイマーの値とか、ユーザ入力の時間差を測定したりして、それを srand() につっこんで対応する。
>>243 レスありがとう
まだはじめたばっかりでホームページさがしながらの手探り状態なんだけど、
math.random()で()の中に1から10までの値をいれるよね?
そしたらそれ以外にmath.randomseedを書けばいいってこと?
そう。
プログラムの頭で math.randomseed(os.time()) とでもしておきなされ。
できました!
本当にありがとうございました。
これからもっと勉強してきます
実行中のLuaスクリプトを停止させるには
lua_errorで強制的に例外を発生させる方法以外に
何かありませんか?
1つのスクリプトを実行する一般的な使い方なら問題ないのですが
スレッド毎で同時に複数のスクリプトを実行させる場合
リソースの保護をしても違うスレッドからスクリプト(ステート)を閉じようとすると
原因不明のエラーで強制終了してしまいます
>>247 コルーチン化していつでも終了できるように作っておくのがLWL流 :)
つlua_yield
>>248 肝心な部分を説明し忘れてました
私が今作ってるのは
>>190の方が言われたような
luaを同時実行させてプラグイン機能を実現するもので
それをコルーチンでやるとなると実質スレッド1つで
全処理をすることになるのでCPUリソースの消費が激しく
ステートも一つだから変数の重複などが問題になって
それらを回避するためにマルチスレッド上で
それぞれスクリプトを動かす必要があるのです
しかしあるプラグインでエラーが起こり
それに関連するスクリプトを全部停止(解放)したい時
現スレッドから他スレッドのステートを閉じようとすると
強制終了につながるエラーが起きてしまう状況で
>>250 ちがうよー。
コルーチンというのはプログラマが入力した任意のタイミングで
動作を中断できるようにした仕組み(yield)のことであって、
それを使って複数の仕事を1スレッドで同時に実行というのは二次的なものに過ぎないんだよ。
したがって複数のスレッドで実行しても(エンジンの実装に問題が無いなら)問題ない。
で、中断されて制御が戻ってきたタイミングでそのまま開放してあげればいい。
>CPUリソースの消費が激しく
>変数の重複などが問題
↓
>強制終了につながるエラーが起きてしまう状況
戦況が悪化してるが、今さら撤退する気はない
典型的なパターンですね
>>250 lua はスレッドセーフじゃないから、別スレッドからの制御は根本的にできないよ
コルーチンでうごかせってのは、呼び出しに lua_call を使うんじゃなくて、lua_resume と while
ループでスクリプトを駆動させて、スクリプト側では定期的に yield するようにすれば、
その区切りで安全に実行中断できるよ、ってこと。
それぞれのスクリプトはそれぞれのスレッドで立ち上げて、ほかのスレッドから停止させるときは
フラグをたてておいて、そのフラグがたってたらwhileを抜けて速やかにスレッドを自滅させる
ような書き方にする。
コルーチン駆動&記述が面倒ってことなら、裏技チックだけど、lua_sethook を使って、
関数呼び出し、ないしは行ごとに終了フラグチェックさせて、もしフラグたってたら
lua_error で速やかにスクリプトを abort させるという手もある。
残念ながらhookにユーザパラメータは存在してないので、変数かレジストリに
参照するフラグのCポインタを格納しておく、とかの小ざかしいテクが必要。
なるほど
Luaスクリプトを同時実行する際は
マルチスレッドのみでの制御は無理ということですか
改めてコルーチンについて勉強し直してきます
どうも助かりました
スレッドって名前が紛らわしいな。
関係ないかもしれないが、非推奨な手法を使いにくくするとかいう話を思い出した。
Luaは普通の呼び出しと、lua_yieldで一時停止して再度呼び出す場合とで使う関数が違うのが面倒くさくて逃げちゃったな俺…
AngelScriptだと同じ呼び出し方でOKなんだよなぁ…
>>256 coroutine.wrap をつかえば、普通の関数呼び出しと同じように resume もできるよ。
変態文法&バイトコードがエンディアン依存なluaを広めるのやめようぜ
手間が増えてスクリプトにしてる意味がねえよ
259 :
デフォルトの名無しさん:2009/10/15(木) 11:27:46
luaって、oracleにアクセスするライブラリないですか?
JavaからLuaを使うことってできる?
JavaからC言語を使うことってできる?
>>259 というかそんな『重い』プロダクトを扱うなら、
素直にPythonやRubyなんかのライブラリの整備されたスクリプト言語使ったほうがよくなくね?
まあそんなこといいつつ、俺もPythonで軽量なDBラッパー探したら見つからなかったので
ActiveRecord互換のORMライブラリを自作したんだがな。
>>258 Luaの速度に魅力を感じてる人がなんとなく多い気がするね。
あとは、リスとかに比べるとドキュメントの多さなんかが人気の秘訣?
某MMORPGで使っているからだったりして。
ああ、別にROに限らず採用実績っていうのは使う基準に十分なるだろうし。
組み込みに求められるのは速度と少ないメモリ消費だから
多少なりと癖があろうとlua使っちゃうんだよね
他に比べて採用例も多い分、多言語との連携も充実してるし
ORMの次は、C/C++とスクリプトのマッピングだ、というアナロジーだけで
動いてるやつがいるような気がしてきた
>>組み込みに求められるのは速度と少ないメモリ消費だから
なんで? 別にそれは前提条件にならないと思うけど。
オレはゲームシステムを組んでいるところだが別にメモリ消費量は大して気にしてないぞ。
速度は大切だが、どうせ1スレッドでは間に合わなくなるのでマルチスレッド化するし、
ボトルネックはスクリプト部分ではないので問題ない。
AngelScript使おうぜ
まぁ、なんだかんだでluaが一番なんだけどね
>>273 俺はそうは思わないけどな……。
触ったことあるけど文法がちょっと癖あるし、整数型がないし。
Pythonの方がよっぽどいい。
>>274 いやいや、個人的にではなく一般的にね
上でも出てるけど書籍や採用例が多いとかさ
このスレはIronPython使いと、AngelScript使いが一人ずつ常駐してるんだなw
PHPはインタプリタを組み込めないライセンスだからなー。
この制限さえなければ今までなかった用途が色々できると思うんだけど。
>>279 うう〜ん……。問われたので改めて調べてみたが、どうやら間違った認識が一部あったようだ。
PHPインタプリタ本体はPHP License 3.01で配布されていて、
こいつは
・配布するソースコードまたはドキュメントに著作権表示、ラインセンス本文を記載すること
・PHP Groupから許可を得ずにPHPという名前を使用しないこと
(PHP Fooやphpfooはだめ。Foo for PHPはOK)
・文言の表示強制("This product includes PHP, freely available from <
http://www.php.net/>")
だけだな。インタプリタ自体を内蔵することは問題なさそう。
契約なしに内蔵できないのはZendライブラリなんだそうな。
(Zend Frameworkは修正BSDライセンス。Zendライブラリとは何ぞや?)
ここでzlibライセンスのSquirrelとAngelScriptの出番ですね!
luaスクリプト上でコルーチンを作成をした場合は
明確的に破棄する方法はないようなのだけどC側から
//コルーチンを実行するのスレッド(ステート)を作る
lua_State *L = lua_newthread(luaL_newstate());
//C側からコルーチンの操作
//コルーチンのスレッドを閉じる
lua_close(L);
とした場合はコルーチンを実行する為に確保されたメモリは解放されますよね?
そいや、Ioって言語はどうよ?
シンプル、軽量というのが売りらしいが。
>>282 lua_newthreadで作成したコルーチンはlua_closeしちゃ駄目だよ。
開放はGCにまかせる。
>>121あたりから同じ様な質問出てるから見てみ。
>>284 指摘ありがとうございます
つまりスタックに積まれたコルーチンのスレッドを
lua_popで削除すればいいのですか
でもそれだとGCまかせでスグにコルーチン破棄はされないので
>>282のを
//コルーチンを実行するのスレッド(ステート)を作る
lua_State *L = luaL_newstate();
lua_State *T = lua_newthread(L);
//C側からコルーチンの操作
//ステートを閉じる
lua_close(L);
とすれば閉じるのはコルーチンのステートではないものの
lua_newthread は元のステートのオブジェクトを共有するみたいなので
コルーチンで確保されたメモリも同時に解放されますよね?
>コルーチンで確保されたメモリも同時に解放されますよね?
まぁ、そらそうだが。
任意開放ならlua_gcじゃ駄目な理由でもあるの?
駄目な理由はないのだけど
GCという目に見えない物に頼るより
自分で明確的に管理したくて
つまりC#くそくらえってことですね
(#^ω^)
(C#^ω^)
(Ruby#^ω^)
>>287 Luaでは文字列もテーブルも関数もuserdataもGCで管理されてる訳だが、そういうのも自分で管理したいの?
>>292 そこまではこだわってないです
それらはスクリプトに自分で定義しないと生成されないから
ある程度は管理出来るので
>>285 元のステートごと閉じてたら、そのコストがでかすぎて全然うれしくないと思われ。
GCいやな人は lua 使うな、が精神的には正しい。squirrel にしときなされ。
>>283 言語としては面白いよ
組み込みも簡単に出来るし
でもWinの開発環境を整えるの面倒
ネットでの検索しやすいのさは大切だよね
iPhone 3G S もジョブスが発表後に iPhone 3GS に改名させたそうだ
> ネットでの検索しやすいのさは大切だよね
「ネットでの検索のしやすさ」の間違いです…
自分でワロタ
>>294 >元のステートごと閉じてたら、そのコストがでかすぎて
具体的にkwsk
>>299 や、普通にグローバルな関数や変数も全部毎回順次解放&登録しなおすハメになるじゃん
そういったコストを下げるために共有させる仕組みなのに本末転倒だろう
それぞれのスレッドが完全独立で頻繁に起動するものでもないのなら止めはしない。
>>285を見る限りコルーチンを実行し終わった時に
不要になったのを解放するのだから問題ないでしょ
実際にはluaL_openlibsが必要だからコストが大きいよ
擬似コードにはいちいち書かないだろうけど
擬似コードを書くとどうしても、目に見えない物に頼りがちだよね
ちょっと前にLuaで乱数を作っていたものだけど
今度は重複しない乱数を表示させたいと思っている。
でも何度やってもできない。。。
ヒントだけでも教えてください
そもそも重複しないものは乱数とは言わない。もはや lua とは関係ない話なので手頃なアルゴリズム系の質問スレに移るのをオススメする
ヒント:シャッフル
>>304 レスありがとう
ということは、最初に規定量の数値を指定しておいてそれをシャッフルすればいいってことか!
ありがとう。
306 :
デフォルトの名無しさん:2009/10/18(日) 16:59:56
(C#^ω^)
308 :
デフォルトの名無しさん:2009/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);
}
1つ1つのLuaステートをLua_yield使って個別に動かすのはダメなの?
あれ もしかしてAngelScriptって結構良いんじゃね?
名前が可愛いからちょっと舐めてたわ
>>310 できたら、どの辺りが気に入ったか詳しく
ついでに、このスレに常駐しているAngelScript信者の方にお聞きしたいのだが、
LuaやSquirrelと比べて優れている点は何がありまんすか?
//
/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ AngelScript!!
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
AngelScriptの@がよくわからん。
オブジェクトの参照なのか?
Hoge@ hoge;
みたいなの。
C++みたいに、インスタンス入れる変数と参照がわかれているのか?(C++詳しくないからなんtねいったらいいかわからん)
LLなのに面倒な言語だな…
全部、デフォで参照でいいと思うんだが
>>314 スクリプト言語の癖に静的型付言語だからなぁ。
それって本当に意味あるのか? って思ってしまう。
Booとかも触ってみてその動作速度は認めるけど、スクリプトの記述が面倒に感じる。
ActionScript3.0 もいちおうスクリプト言語だけど、静的型付言語。
まぁ、インタプリタじゃないけどね。
>>312 ・文法がC++まんまなので書きやすい
・C++との連携が簡単
・クラスとかほぼそのまま使える
・const〜やenumなど、定数定義が可能
・#includeも可能
こんなところか?
>>314 その例だと、「Hogeクラスの参照型」って扱いになる。
C++のHoge &という記述に近い。
スクリプトを自分で改造して使いたいんですが、ライセンスが緩くて
ソースが読みやすく短い組み込みライブラリのお勧めを教えてもらえませんか?
今のところLuaが最有力候補だと思ってます。
Squirrelがソース短いんじゃなかったっけ。読みやすさは知らんが。
>>319 実質としてはそんなに悪いコードではないが、しかし決して良いコードではない。
そして、SqPlusは絶対に読むな。頭が痛くなること請け合い。
それはそうと、Xtalのコードは大変いいと思うぞ。
言語自体の仕様は首を傾げたくなるところがあるが。
\ l´⌒\⌒\ \\ \
\ ヽ ) ) \\ \\
( \ \∩___∩ \\
\ \ ⌒⌒| ノ ヽ \\
\ \ / ● ● ト、\ \\\
\ Y | ( _●_) ミ\ \\\
\ / 彡、_ |∪| ノ \ \\\
(____)―ヽノ' ヽ  ̄ ̄ ヽ\\
\, j l l .l }
Lua! l (_ノノノノ
>>320 Xtalのコードは俺の頭じゃ解析不可能だからLua読んでます。
SqPlus使おうと思ったらもう全然更新してないのか
いったいどれにすれバインダ
そもそもSquirrel自体全然盛り上がってないというか終わってるというか
始まる前に終わっちゃったよ的な
Lua 5.2まだー
>>323 SqPlusはダメすぎる、忘れましょう、使ってる人はたぶんいません
squirrelのバインダは自分で使い易いように自分で書いた方が1024倍マシよ
そこでバインダとか無くても全然問題のないAngelScriptの出番だな
>>326 ごめん、動いてるものはさわるな原則にのっとって使い続けてる^^;
一部手はいれてあるけど。
時間あったら新しいバインダにしたいんだけどなかなか……
スクエニのゲームはSqPlus使ってるって
cedecのスライドに書いてあったよね。
330 :
318:2009/10/26(月) 01:03:53
SquirrelとXtal読んでみます。
ありがとうございました。
こうなったらLuaとSquirrelとAngelScriptの合わせ技でいくか
angelscript初めて知った。いいなこれ!!
スタックゴニョゴニョしなくていいからコード読みやすいし
なによりデフォルトでメモリ上から「のみ」スクリプトコードをロードできるってのがイイ!
ゲーム開発だと裸のままスクリプトファイルが置いてあることなんてないからね。。。
モジュールのロードとかもオブジェクト指向で非常に素直に書けるぽいし
さっそくLuaを破棄して組み込んでみよう
AngelScript つかう場合は、これ C++ だけでよくね?という思考に陥らないように注意な
まんまC++なのがメリットでありデメリットでもある
>>AngelScript つかう場合は、これ C++ だけでよくね?という思考に陥らないように注意な
前使おうとして陥った
ちょっと聞きたいんだが、AngelScriptを使っている人や使わなくなった人(他の言語に移った人)は
なんで使っている、使わなくなった?
C++そのままというか継承に制限があるのが大きくてSquirrelに移ろうと思ってるんだけど、
他の人はどう思ってるのか気になる
アプリ実行時にちょこちょこ書き直したり、コンパイル/リンク時間の省略とかスクリプト自体の
メリットは分かるんだが…
コルーチン
コルーチン
チンコール
∩_
〈〈〈 ヽ
〈⊃ }
∩___∩ | |
| ノ ヽ ! !
/ ● ● | /
| ( _●_) ミ/ Lua!!
彡、 |∪| /
/ __ ヽノ /
(___)
>>335 C++との連携が簡単、C++クラスをほぼそのままで使える、複数のコンテキスト(LuaStateに相当?)を同時に処理させるのも簡単、
定数定義や列挙型も使える、といった点が便利なんで使ってる。
特にC++との連携はLuaやSquirrelより簡単だし、マニュアルもサンプルも英語だけどわかりやすい。
コルーチン
AngelScriptに乗り換えようかな
細かいとこがc++と違和感無くて簡単だわ
そこで敢えてPawnという選択肢も
コルーチ
AngelScript と Luaって
メモリ消費や処理速度はどれほど違う?
/ヽ /ヽ
':' ゙''" `':,
ミ ・ω・ ;,
:; . っ ,つLua!
`:; ,;'
`( /'"`∪
これ見るとリス使いの俺涙目だわ
・メモリ消費低
・静的型付
・スレッドセーフ
・スタック操作なし(またはLuaより容易)
で選ぶとしたら
やっぱりAngelScriptがいいのかな〜
おなじくリス使いの俺涙目(笑)
まあ、リスはわかりやすいからいいんだよ!とか言ってみる。
でも Pawn の性能は魅力だな。とりあえず組み込みテストして
みてよさそうなら、静的スクリプト言語としての併用もかんがえてみよう
まあなんとかとかんとかはトレードオフってやつだな
Pawnはスクリプト内で日本語文字列を扱わなくてもいいならいいかも
353 :
デフォルトの名無しさん:2009/10/28(水) 18:17:32
リスのバグ発見。
setdebughookを仕掛けた状態で_callメタメソッドをコールすると死ぬ。(SQVMでぬるぽ発生)
ちなみにdebughook関数の中身を空にしても同様です。
公式フォーラムの垢を紛失してしまったので誰か報告たのむ
http://squirrel-lang.org/forums/7/ShowForum.aspx function debughook(event_type, sourcefile, line, funcname) {
local fname = funcname ? funcname : "unknown";
local srcfile = sourcefile ? sourcefile : "unknown";
::print(::format("%s:%d: [DEBUGHOOK:%c] %s\n", srcfile, line, event_type, fname));
}
::setdebughook(debughook);
class FOO {
function test() { ::print("FOO::test()\n"); }
function _call(orig_this) { ::print("FOO::_call()\n"); }
};
local foo = FOO();
foo.test();
::setdebughook(null);
foo();
::setdebughook(debughook);
foo(); // Segmentation fault (core dumped)
>>353 すんまそ、環境を書いてなかった。
Squirrel 2.2.3 stable
VisualC++, cygwin, Linux, 何れでも発生。
Squirrel 3はまだ試していません。
Pawn Language Guide っていうドキュメントみてみたけど、無名関数がつくれないっぽいね。
だとするとクロージャが作れないから、ちょっと不便かな。
状態遷移とかの記述に特化しているようだし、UnrealScript に似ているかも。
347のリンク先見て思ったが、GameMonkeyが何気に性能いいな。
>>353 拙い英語ですが報告しておきました。
temp_regがメタメソッドコール前にhookで使われるのが一因っぽいです。
Squirrel フォーラムに代理の報告をしてもらえるなら、 sq_mem.cpp をはじめ
メモリ確保失敗についてまったく考慮してないのを修正してくれ、と頼んでみて
もらえまいか?
組み込み言語としてリソースの乏しい環境で使うことを考えれば、メモリ確保が
失敗しないなどという前提で組まれるとツライものがある。
s/sq_mem/sqmem/
なんで自分で報告しないのん?
残念ながら英語で会話ができる自信がない。
リファレンスマニュアルを読む程度ならなんとかなるんだけど。
パッチ作って送れば英語できなくてもだいじょぶじゃないかな。
here is a patch for memory allocation error
とか一文だけ書いとけば通じると思う。
うーん。問題はコード全体に散らばってるんで、まずは全体的な方針をはっきり
決めてからじゃないとマズイ感じ。
sq_malloc や sq_realloc がいくつかのマクロを通して間接的に使われてるんだけど、
どれも呼び出し元で NULL が返ってくることが考慮されてない。
典型的なのは配列伸ばすのに p = SQ_REALLOC(p,oldsize,newsize) してるところ。
NULL 返したら元の領域がリークするうえに後続のコードでは確保成功したものとして
余裕でアクセスしてくる。
最初は、C++だからsqmem.cppの関数から例外投げろってことかと思ったんだけど、
呼び出し側で例外の発生も考慮されてないからまた別の理由でリークするし。
AngelScriptでマルチバイト文字列を使おうとする場合の不具合も報告したほうがよさそうなんだけどなぁ…
365 :
353:2009/10/30(金) 14:26:46
>>364 なんか不具合あるの?
AngelScript試してみようと思ってるんで気になる
UTF8扱いたいんだ
>>366 ライブラリをビルドする際にプリプロセッサでAS_DOUBLEBYTE_CHARSETを定義するんだけど、
それやるとビルドでエラーが出ちゃう。
しかもマルチバイト文字かシングルバイト文字かを判定するやり方もマズい。
最新版出るたびに毎回そこ修正してるよ。
それは本家に報告してあげればみんな幸せに
370 :
デフォルトの名無しさん:2009/10/31(土) 00:09:14
>>221 それ新しい版では修正されてたと思った。
AngelScriptでUTF8を使う場合、ソースの修正なくても、
asIScriptEngine *lpEngine=asCreateScriptEngine(ANGELSCRIPT_VERSION);
lpEngine->SetEngineProperty(asEP_SCRIPT_SCANNER, 1);
みたいな感じでエンジンの設定すれば大丈夫だったと思う。
あら、ありがと
AngelScript2.17.2で試してみた
UTF8はデフォルトでサポートしてるっぽく読めたんでDLしたまんまビルド
static const char* scriptString =
"void hellow()"
"{"
" Print( \"hellow world\" );"
" Print( \"UTF8テスト\" );"
"}";
とりあえずこれOKだった
ホストへstd::stringで渡せたり楽だわあ
次の更新でUTF16もサポートするみたいなことが書いてあるね
>>374 それできたらShitJIS対応の改造しなくて済むな。
Linuxでx64運用してるんだが、ファイルをHDD中でコピーするだけでファイルが壊れてしまう状態になって、
パーツを電源も含めて色々入れ換えてみたところ、
SATAケーブルをノイズに強いタイプに変更したら改善した。
残念ながら完全には直ってないようだけど、十分実用レベルには戻った。
資金に余裕ができたらHDD買い足してパーティションを作り直そう……。
おっと。スレ違いスマン。
pawnダウンロードして、マニュアル読みながらcmake使ってVC++用のプロジェクトファイル作るところまではできたんですが…
プロジェクト開いても、なんかファイル構成がよくわからないです。
もしかしてこれ、コンパイラとVMが別のプロジェクトファイルになっているんでしょうか?
luaみたいに、単純にヘッダファイルとlibファイルだけが欲しいんですが…
もしかしてDLLしかない??
>>378 pawnについていいなと思い試してみたはいいものの
詳しく使おうとするにつれてファイル構成が?で
投げ出した俺と同じ状態だね
確かにあれはわかりにくい
>>371 asEP_SCRIPT_SCANNER の設定で何がどう変わるのか AngelScript 2.17.2 の
ライブラリのソースを見てみたけど、単に 'あ' みたいなUTF-8の文字リテラルが
正しく読めるようになるだけっぽい。
"あいう" みたいな文字列リテラルは設定に関係なく1バイトずつ読んで処理してる。
ただし AS_DOUBLEBYTE_CHARSET プリプロセッサを有効にしてビルドしたライブラリで
asEP_SCRIPT_SCANNER の設定が 0 だと、マルチバイト文字を考慮する。
>>367が言っているように判定方法がマズいからShift_JISの半角カタカナを渡すと
おかしな挙動になるだろうけど。
あと AngelScript 2.17.2 での asEP_SCRIPT_SCANNER の既定値は 1 っぽい。
となると、マルチバイト判定用のコールバック関数を登録できるような改造した方がいいのかな。
2箇所いじれば大丈夫っぽいし。
>>381 Xtalはそんな感じのことをやってますね。
初期化関数に渡す Setting クラスインスタンスの ch_code_lib メンバに
文字コードクラス(例:SJISChCodeLib)のインスタンスを渡すことで好きな
文字コードを選択できるようになってます。
SJIS, EUC, UTF8, UTF16, UTF32 の文字コードクラスは標準で用意してある模様。
383 :
382:2009/11/10(火) 05:09:58
> SJIS, EUC, UTF8, UTF16, UTF32 の文字コードクラスは標準で用意してある模様。
…とはいっても別に内部で文字コード変換をしてくれるわけじゃないから、
Windowsのマルチバイト文字セットで使うなら基本的にSJISを選ぶことになるだろうけど。
Unicode文字セットで使うなら、XtalライブラリをUnicode文字セットでビルドして、
文字コードクラスは指定しない(=デフォのまま)ことで正しい挙動になりそう。
もちろんその場合のスクリプトはUnicodeで書く&渡す。
連投&AngelScriptと直接は関係ない話でゴメン。
試してないけどソース見る限り、UTF-16用の文字コードクラス使うと、
文字列長取得時にサロゲートペアのことも考慮してるようだ
他の文字コード用のも、一文字進めるとか比較とかも変えられるようにはしているようではあるが、
今のところ文字単位での文字列長取得しか違いはないようだ
AngelScript、TCHARとかにも対応できて、Unicodeとマルチバイトのどっちでもビルドできるようにしたいが、
かなりの大部分を修正しないとダメだなぁ…
Squirrelは最初から対応してるみたいだけど。
// .amxファイル(コンパイル済みPawnバイナリ)を実行するための最小コード。これをビルドするためには
// ダウンロードしてきたPawnのソースに含まれている amx.c, amx.h, amxaux.c, amxaux.h, amxcons.c, amxcore.c をプロジェクトに追加しておく
#include "amx.h"
#include "amxaux.h"
#include <stdio.h>
extern "C" AMX_NATIVE_INFO console_Natives[];
extern "C" AMX_NATIVE_INFO core_Natives[];
int main(int argc, char *argv[]) {
AMX amx;
cell ret = 0;
if (aux_LoadProgram(&amx, "test.amx", NULL) != AMX_ERR_NONE) exit(1);
if (amx_Register(&amx, console_Natives, -1)) exit(1);
if (amx_Register(&amx, core_Natives, -1)) exit(1);
if (amx_Exec(&amx, &ret, AMX_EXEC_MAIN)) exit(1);
printf("%ld\n", (long)ret);
aux_FreeProgram(&amx);
return 0;
}
Pawnコンパイラのビルド方法
--
CMakeダウンロードする
CMakeインストールする
CMake起動する
"Browse Source"をクリックし、実行環境をビルドするなら<pawn>\source\amxを指定する。Pawnコンパイラをビルドするなら<pawn>\source\compilerを指定する
"Browse Build"をクリックし、適当な出力フォルダを指定する(以下、<out> と表現する)
"Configure"をクリックし、VisualC++ネイティブを選択する。エラーが起きても、もう一度 ConfigureをクリックするとGenerateボタンが有効になる。
"Generate"をクリックしてファイルを生成する
<out>にVC++用のプロジェクトファイルができている
ソースに<pawn>\source\compilerを指定した場合、<out>にはpawnc.slnができている。それをVCで開いてビルドする。
..\bin\pawn.icoが存在しませんとかエラーがでたら、該当場所に適当なアイコンファイルを入れておく。
<out>\Debugにpawnc.dllとpawncc.exeができている。それがコンパイラ。
Goのビルドが早いらしいので期待age
そのGoって組み込みじゃないんじゃ・・・・
ゴルーチン
ttp://golang.org/doc/go_faq.html#Do_Go_programs_link_with_Cpp_programs There is a “foreign function interface” to allow safe calling of
C-written libraries from Go code. We expect to use SWIG to
extend this capability to C++ libraries.
There is no safe way to call Go code from C or C++ yet.
組み込みまだ出来なさそう。あとは、luaみたいに使える方向性があるか分からない。
現在の対応はdarwinのx86/x86_64とlinuxのx86/x86_64/armとnative clientのような気がする
you ain't gonna need it
GCサポートとあるけどc++好きにはウケナイ気がする
GC無しでc++的にガチガチに使えるなら使いたい
c++は0xも控えてるしGoは微妙な位置に落ち着きそう
そういや0xって後50日くらいで終了するんだなぁ
C++0xはコンセプトを捨てて再調整中で、まだ時間がかかるようだ
最近はC++1xと呼ばれている・・・
っていうか検索しにくさでDに勝負挑んでんの? って感じのネーミングなんだが……。
398 :
397:2009/11/13(金) 13:00:17
あ、ごめんなさい誤爆。Dスレに投げたつもりだった……。
Squirrelの画像検索のしにくさよりはましだろ
16進数だと思って欲しいだって
びょーん?さんのお知らせ
で、誰かPawnつかってみた? 激高速ぽいし、静的型付けで余計なバグも少なそうだし、かなり使えそうだけど…
>>388 GoはLinuxとMacにしか対応していません。
この手の組込スクリプトエンジンをShiftJIS対応させる場合、基本的にWindows用に組んじゃって大丈夫なのかな。
Unicode対応させる場合はWindowsだけじゃダメだよね?
修正を公開するつもりが無いならどうしたって構わないよ
#ifで切り分けるくらいはしておけばいいんじゃないか
#if (defined WIN32)
実装
#else
naiyo!!
#endif
これならWindows以外で使いたい人が中を見て、流用できそうならそうすることも出来るだろう
thx!
>>404 上手くいけば公開しようかなと思ってる。
ただ、Windowsでしかプログラム組んでないんで、Linuxでもちゃんと動くようにするための技法とかさっぱりわからないんだ。
ちなみにShiftJIS対応は簡単だけど、Unicode対応はソースあちこちいじらないとダメなんで無理かも…
UTF-8でもなければUCS2やUTF16でもなく、UNICODEと言っている時点で、
何にも分かってないのが丸わかりだからやめておけ。
/ヽ /ヽ
':' ゙''" `':,
ミ ・ω・ ;,
:; . っ ,つLua!
`:; ,;'
`( /'"`∪
ぅあたんおはよう
しかし、今時ShiftJISはねえなあw
WindowsだとまだShiftJIS現役だしなぁ…
WindowsのNTFSのファイル名とかUTF-8にする方法ある?
それ以前に一つ確認しておくが、NTFSのファイル名のエンコードがどうなっているのかは理解しているのか?
ICUとか無駄にでかいのを勧めてみる
そういう話じゃないんだろうけど、Windows依存の話はもう勘弁しておくれなんし
ファイル名ってUNICODEじゃなくてmbcsだろ
mbcsにUTF-8そのまま突っ込んでもファイルは出来るが
望みのものにはならない訳で
>>415 Windowsは内部的には全部 Unicode で NTFS もUnicode。
Win32 API的には、Uincode な API と MBCS な API が両方同時に存在していて任意に選んで使う。
原理的にはエンコードが UTF-8 な Locale を指定すれば MBCS なAPIでそのまま使えるはずだが、
あいにくそんなロケールは定義されてない。もっとも、UTF-8 から Unicode へは単純に変換できるので、
Unicode な API をラッピングして使えば良いだけなので自前プログラム上で問題になることは特にはない。
自分のプログラムで文字列を char ベースで扱ってるなら、MFC の CString のような char <-> wchar_t 変換
対応したクラスを作ってAPI に渡す時はそれを介するようにしておけば良い
一般的にこの手の組み込み言語の場合「Unicode対応 」ってのはワイドキャラ化のこと。変換は全部入出力部で
処理してしまって、内部は全部 char ではなく wchar_t で処理を行うようにする。英数字もひらがなかたかな
漢字も同じ「1文字」として扱えるので、もろもろ概念や処理が楽になる。そのかわりメモリを喰らう。
Windows だと、Unicode な APIがあるのでこれで作業するのが定番。
UNIX 系OSは、Unicode API は存在してないので、API に渡す必要がある部分(ファイル名など)は
逆にMBCS に変換する必要があってそれなりに面倒だったりするが、これが C言語系における正道
「SJIS対応」だとパーサの類をいじって、\ とかの特殊文字のエスケープ対応を行う対応になる。
また、文字列系のクラスに、専用の mblen とか mbsubstr とかSJISとして1文字単位で扱える
専用の処理を足さないと実用上困る。正規表現系をまじめに対応とかすると死ねる。
「UTF-8対応」や「EUC対応」はASCII 的に安全な文字コードなのでパーサ部は通常いじる必要がないが、
文字列処理用に専用の命令系を足さないと実用性が低いのは SJIS対応と同じ。
古いプログラムを wchar_t 化するのは大変だけど、Unicode は扱いたい、といった場合にUTF-8 対応が行われる。
ファイル名の場合、NFDにも注意ね
>>418 OSX はさっさと直せよと思う。まじで
Microsoftのコンパイラは wchar_t は2byteなので、全部一文字って訳にはいかないです
サロゲートペアに対応させようとかおもった場合は手動で処理してやらんとダメです。
少なくともVS2008時点では、_tcsincやCharNextといった ポインタを進める関数がサロゲートペアをちゃんと処理してくれない
(おそらくOSがサロゲートペアに対応する前のコードとの互換性を気にしてるのだろう)
もっとも、クロスプラットフォーム名コード書くなら、CharNextとか使わずに自前で処理してるだろうけど・・・
書かれてる事の意味が解らないままレスする人多すぎ
ここが組み込み系言語のスレな事も考えず読んでる人も多すぎ
>>420 落ち着いて考えるんだ。
組み込みスクリプトごときでサロゲートペアが関係してくるようなややこしい話がどれくらいある?
まあ、議論自体は有意義だとは思うが。
素直にTRONコードを使え
とりあえずVSで使う時に、文字セットを「Unicode文字セットを使用する」にしてちゃんと使えればそれでOkだな。
Squirrelはデフォでいけたが。
知れば知るほどVSなんぞ捨てた方がマシ
UTF8はBOM有り前提とか諸々腐ってるし(VS2005までしか知らんけど)
Windows環境で作業しなきゃならんなら
gcc、devc++、エディタ、こんだけでいいよ
>>425 お前……VisualStudioまともに使いこなせてないだけだろ?
UTF-8 BOM付きなんて使う機会ほとんどないぞ。
VSでエンコード付きテキストエディタを指定するとUTF-8はシグネチャ付きとなしと両方選べる。
つまりどっちも扱える。
IDEの方に問題は出ないが、VCのコンパイラ側がBOM無しだと、
文字コードの認識に失敗する。
Squirrel 2.2.4 stable来てるね
3.0もbeta1になった
おー、Squirrelのバージョンアップまじか
色々バグ修正されてるのかな
BuildとShift-JISパッチ入れるのめんどくさいけど、今夜試してみるわ
>>429 WEBの世界だとそれが標準だからだと思うよ>BOM無しUTF-8で保存可能
Visual Web Developper あわせの対応であって、VC はスルーされてるってことかと。
コンシューマ機が UTF-8 ベースに移ってるのでそれあわせでコード共有しようとするときに地味に困る > VC がUTF-8をまともに扱えない
BOM つけると今度は gcc がこけるんだぜ……
LuaでLua_Stateの解放をせずに、グローバル変数等の環境を個別に初期化する
サンプルはどこかにないでしょうか?
グローバル環境を空のテーブルに置き換えるのって
普通にできんかったっけ?
じゃあこんな感じで良いのかな?
Lua_State *L;
〜 一回load、callして使用 〜
lua_newtable(L);
lua_setfenv(L, LUA_GLOBALSINDEX); //グローバル変数だけ初期化される?
lua_gc(L, LUA_GCCOLLECT, 0); //念のためにGCも走らせるべき?
〜 Lにまたloadして再利用 〜
426の読解力に溜息が出るよ
>>429 UTF-8てそもそも既存のシステムに手をなるべく加えないで動かすための文字コードじゃないのか?
よくわからんな
そもそも文字列はハードコーディングするべきじゃない。
外部リソースとして、入出力時にコードを調整すればいいだけのこと。
print loadstring(0x34d3a6b8);
こんなプログラミングが歓迎されるんですね
>435 を試してみたのですが、lua_setfenvだとグローバル環境の操作は無理なようです。
グローバル環境テーブル全体に対する操作関数って無いのでは?
>>438 スクリプトを読み込んだ際に特定の文字コードに変換して、内部の処理はその文字コードで統一って感じかな?
だとすると、何に変換するのがいいんだろう。UTF16?
スクリプトファイルは基本UTF-8、
ネイティブに引き渡すときはUTF-16、面倒ならUCS2にするのが一番問題が少ない。
>>437 その恩恵にあやかれるのはASCIIコードしか使ってない欧米人だけだけどな。
非ASCIIコード圏は、既存のエンコード方式と区別ができないので余計に混乱する。
全てのプレーンテキストがUTF-8に置き換わるまでの過渡期は、BOM付きUTF-8が
一番無難な選択だと思うけどね。
俺はWindows上でgccとか使わないので、FTPクライアントにBOMの有無を変換する
機能さえついてくれればあまり問題ない。
もっとも、MSは独自にBOM付きUTF-8を強行するのではなく、非ASCIIコード圏で
過渡期にはBOMが必要であることを訴えて、規格に盛り込ませるべきだと思うが。
>>437 「ファイルの中身」自体が最大のレガシーシステム。だから UTF-8 が使われるようになってる。
日本人は一度 SJIS やら EUC やらで通った道をもっかい世界規模で通り直してるだけではある
>>438 なにが一番困るって、ファイル名中の「コメント」
コメントに日本語つかうな?ごもっとも(苦笑)
ファイル名中じゃねえ、ファイル中
>>443 > 全てのプレーンテキストがUTF-8に置き換わるまでの過渡期は、BOM付きUTF-8が
> 一番無難な選択だと思うけどね。
この上の記述はわかるし、それはよくわかるんだが、
実際はBOM付きでトラブることが多くて、俺は折れたわw
BOMなしで上手く行くようにすべき
あ、437 のいってること完全によみちがえてたや。すまん。
動作上は問題ないに決まってるんだから、ツールで対応できない意味がわからんってことだな。
既存エンコードと混在したのを自動判定する必然性は別にないんだから、
ツール側に「MBCSではなくUTF-8として扱う」スイッチだけつければすむことだ。
MS1社が対応するだけで世界は平和になるんだからさっさとそうしてくれってことだな
>>443 もう手遅れ
MSがいまだにSJISを強行している時点で終わってる
SJISを強行しているように見えるのはロケールを日本語にして使っているからなんだが、
なんでそんなに視野が狭いんだろう?
ちなみにOSのロケールを英語にすると、UTF-8も無しでコンパイルが通るぞ。
BOM無しで
thx!
おまいあたまいいな
ロケール変えて見た
こりゃええわw
まともなアプリと糞アプリの違いが一目瞭然になったw
やっぱりコマンドプロンプトは糞のままだったw
456 :
デフォルトの名無しさん:2009/11/20(金) 14:24:23
日記はチラ裏で
>>455 ブラウザの文字エンコードが正しく認識できないって、どこの田舎ものやねん……。
458 :
デフォルトの名無しさん:2009/11/20(金) 14:42:25
>>454 cmd.exeはフォントを日本語にすれば治る
cygwinのbashはスクロールがおかしくなるが英語ロケールでインストールし直すと治るのかもしれないがやっていない
しかしいかに日本のWindowsアプリケーションが日本語=SJISで決め打ち(mbcs)しているかが良くわかるね
本来はhogehogeW()を呼ばないといけないところをhogehogeA()で済ませちゃってるんだろうな
mbcsでもSJISだとそれで動いちゃうから日本語ロケールだと気付かないし気にならないんだね
正しいプログラムの作り方についてもう一度勉強しなおす(日本のMSががんばってアナウンスする)必要があるんじゃないかな
459 :
デフォルトの名無しさん:2009/11/20(金) 14:47:32
スレ違い
質問どうぞ
>>440 lua_replace(L, LUA_GLOBALSINDEX)
ならどう?
Luaのテーブルってキーを使ってアクセスするようになってますが、
キーが分からない場合に全ての項目を調べたい時のサンプルってありますか?
for k,v in pairs(t) do hoge(k,v) end
466 :
463:2009/11/21(土) 09:49:37
>462 でグローバル環境を空にはできましたが、
これだけだと再使用ができないような?
このあとlua_openlibsを使っても標準ライブラリが使用できません。
Lua_Stateをcloseせずに再使用するのは大変みたいですね。
>>465 thx
pairsやnextでなめれるんですね
lua_openlibは副作用でレジストリにも変更加えるからじゃね?
走らせたいチャンクを一旦スタックに積んで
そいつの環境を置き換えるのはどう?
>>468 具体的なやり方が今一思いつきません。
load〜で積んだあとに空の環境に置き換えるって意味じゃないですよね?
470 :
469:2009/11/21(土) 11:03:04
そもそもスクリプト側で使ったグローバル"変数"だけ初期化して
ライブラリ等のテーブルは使いまわせたらlua_Stateの再構築の
コストを減らせて、細かいスクリプトの連続呼び出しに良いのではと
考えていたんですが、Luaは変数も関数もその他色々もテーブル分けて
ないので、選択的に変数だけで消すのに無理がある気が・・・
何でデフォの宣言がglobalなんだろうかね・・・
>>469 いや、そういう意味。走らせるチャンク毎に独自の環境を差し込む。
luaL_openlibsに関しちゃ対象がグローバル環境決め打ちのサポート関数でしかないんで
どのみち使えないんだけど、そこはチャンクの環境に差し替えるテーブルの__indexにフックかけて
グローバル環境に委譲してしまうって感じでどうか。
これならlocalをつけない変数宣言はチャンク毎の独自の環境に登録されるだけなので
グローバル環境の汚染も防げる。やってることはmodule関数と大体いっしょ。
コード書いて検証したわけじゃないのでうまくいくかは知らんw
--ライブラリ等のテーブル_Gと、スクリプト側のenvironmentを分ける
local metatable = { __index = _G }
local chunk = loadfile(filename)
local environment = {}
setmetatable(environment, metatable)
setfenv(chunk, environment)
--Cを使えばなんでもできるので、ダイナミックリンク禁止
environment.require = function() end
environment.package = {}
return chunk()
474 :
469:2009/11/21(土) 13:11:20
>>473 なるほど、こうやるのですか。
ありがとう!
ゲーム内にN個のオブジェクトが存在する。
それぞれのオブジェクト固有の状態を保存するために、Cプログラム側でN個のテーブルを用意する。
オブジェクトの行動を定義したluaファイルをロードしてlua_Stateインスタンスを作る。
オブジェクトはN個だが、このインスタンスは1つしか作らない(みんな行動パターンは共通なので)
で、個々のオブジェクトの状態を更新するときに、そのオブジェクトに対応するテーブルを引数にして
lua関数を呼び出し、テーブルを更新させる。
というのをやりたいのですが、N個のテーブルを作るのが「?」です。
テーブル作ってスタックに積むのはいいんですが、なんせスタックに積むわけですから、
どこかの操作で勝手にPOPされたり、消えたりしませんかね??
>>475 そういう用途のためにレジストリとリファレンスの機構が存在する。
1. 任意のオブジェクト(この場合はテーブル)を作る
2. int table = luaL_ref(state, LUA_REGISTRYINDEX); でレジストリに該当テーブルを格納してリファレンスを取得。
オブジェクトはスタックからは解放されて、レジストリテーブルでのみ保持された状態になる。
リファレンス値は全体でユニークで、C 側でそのままオブジェクトを区別しつつ単純保持するのに使える
3. 使いたい場面(この場合は引数として渡す時)では、
lua_rawgeti(state, LUA_REGISTRYINDEX, table) としてレジストリからスタックに取り出してきて使う
4. 最後破棄する場合は luaL_unref(state, LUA_REGISRYINDEX, table) として解放させる
N個つくるならこんなかんじで
// テーブル確保
int table[N];
for (int i=0;i<N;i++) {
lua_newtable(state);
table[i] = luaL_ref(state, LUA_REGISTRYINDEX);
}
// 例えば table[0] をわたして関数を呼ぶ
lua_getfield(state, LUA_GLOBALSINDEX, "func"); // 関数取得
lua_rawgeti(state, LUA_REGISTRYINDEX, table[0]); // 引数としてつむ
lua_call(state, 1, 0); // 引数1戻り値無し
// テーブル解放
for (int i=0;i<N;i++) {
luaL_unref(state, LUA_REGISTRYINDEX, table[i]);
}
ちなみに squirrel だとオブジェクトのリファレンスを、直接C側から HSQOBJECT としてスタックから取得して
保持できる。概念としてはこっちのがシンプル。
ぶった切りすいません
luaは組み込みに最適だと思うんですが、
lua単独でGUIを表示してゲームを作り、実行ファイル(exe)に変換はできるのでしょうか?
もしできるなら、教えてください。
ぐぐっても探すことができなかったので・・・
自前で組み込むの前提の言語でそういうもの作ってもあまり嬉しくないのでだれも作ってないと思います
言ってることが良く分からないが、Lua単独ではGUIは無理だと言っておく
そもそもこのスレで紹介されてる言語は、用途を特定しないスクリプトであって組み込んでどのように動かすかはその人次第
そういう用途なら○○ツクールやHSPにしておきなさいな
厳密には単独ではないけど、Luaのモジュールか何かでSDL使うのとか無かったっけ?
自分でGUI処理の組み込み部分を作り、スクリプトリソースをリンクすれば、
単独exeに出来るだろ。
I think so.
484 :
477:2009/11/23(月) 16:28:01
みなさん、レスありがとうございます。
どうしてもluaでゲームを開発しなくてはいけない状況なのです。
ウィンドウの表示がわからないため、苦戦しています。
どの参考書を読んでも書いてなくて。
別の言語にウィンドウを作らせて、動作はLUAだけで、などでできますでしょうか?
>>485 レスありがとう
みんなやってないし、コマンドプロンプト上か
ほかの言語に組み込むだけのものかと思いまして・・・
参考書読んだのなら、Luaを使っている人がどのような目的と仕組みで走らせるのかは理解した?
あくまで組み込みスクリプトなんだよ?
ウィンドウズを表示するという関数を組み込んでもらって、
Luaにインターフェース提供してもらわないとprintやscanすらままならないよ
ゲーム開発でスクリプタとして働くのならLuaの言語仕様を覚えるのと、PGからバインドした関数一覧もらってこれば良いよ
レスありがとう
正直、大学のゼミでこの言語を使うということに決めたんです
いくつもある言語から選んで、luaを選んだのは自分だけ。
頼る人もいないので、本とネットで勉強してるかんじです。
>>487 サンプルをdlして参考にしていますが、難しい。
もっとじっくり読んでみます。
>>488 用途は理解しているつもりですが、これをメインにしてプログラムを組んでいかなくてはいけなくて・・・
やはり、ウィンドウを表示する関数をCなどで書いて、luaからその関数を持ってくることが一番楽なんですかね。
明日、学校でごめんなさいして
もっと詳しくて質問できる奴のいる言語で
最初からやり直す方がましのような気がする。
>>490 それはしたくないというか、結構この言語は気に入っているので辞めたくないんですよ
それでここきてなんとかしようなんてあますぎる
C側とのデータのやり取りがめんどいから余り良い言語とは・・・
>>489 > やはり、ウィンドウを表示する関数をCなどで書いて、luaからその関数を持ってくることが一番楽なんですかね。
Lua を使うと言って、こういったバインド系の作業はしたくないとか、意味がわからん。
もともとそうやって使う言語だろうに。
「みんなやってない」とか言ってるが、何個のプロジェクトを見て言ってるのか怪しいもんだ。
Luaの言語を理解して使えるようになる手間を1とすると、
ゲーム用のC/C++ライブラリを組むのが最低10倍〜ぐらい手間も時間かかるよ
Win32APIからDirectXかOpenGLまで使えるようにならないと話にならない
ゲームライブラリは既存のものでいいならC素人ならDXライブラリを組み込むのが多分もっとも最短だと思う
ゼミテーマが「組み込みスクリプト研究」で実例として「ゲーム」を選んだのなら、外部ライブラリにどっぷり頼っていったほうが幸せだとは思う
怒られたくなくて嘘を付いている幼児じゃあるまいし
無理せず諦めておけよ
>>493 つまりAngelScriptがいいって事ですね。
わかります。
自分の実力より遙かに上の事をやろうとしても無駄になるだけだぞ
ちょっと上ならともかく分不相応すぎ。諦めろ
Luaじゃ宿題スレも使えないしねえ。
(答える奴はどうせこのスレも見てる)
HSPスレに逝けよ
Lua for Windows: A batteries included Lua installation on Windows.
http://luaforwindows.luaforge.net/ これいっこダウンロードしてインストールすれば、
GUI から OpenGL から DB 接続までなんでもはじめから入ってるよ。
ウィンドウ作る程度なら、サンプルそのまま使える。
Pawn始める人への組み込みメモ(修正版)
// .amxファイル(コンパイル済みPawnバイナリ)を実行するための最小コード。
// 必要ファイル: amx.c/h amxaux.c/h amxcons.c/h amxcore.c osdefs.h
#include "amx.h"
#include "amxaux.h"
#include <stdio.h>
AMX_NATIVE_INFO console_Natives[];
AMX_NATIVE_INFO core_Natives[];
int main(int argc, char *argv[]) {
AMX amx;
cell ret = 0;
if (aux_LoadProgram(&amx, "test.amx", NULL) != AMX_ERR_NONE) exit(1);
if (amx_Register(&amx, console_Natives, -1)) exit(1);
if (amx_Register(&amx, core_Natives, -1)) exit(1);
if (amx_Exec(&amx, &ret, AMX_EXEC_MAIN)) exit(1);
printf("%ld\n", (long)ret);
aux_FreeProgram(&amx);
return 0;
}
// Pawnコンパイラの最小プロジェクト
// 必要ファイル: libpawnc.c lstring.c/h memfile.c/h sc1.c〜sc7.c sc.h sc5.scp sc7.scp scexpand.c sci18n.c sclist.c scmemfil.c scstate.c scvars.c svnrev.h
// それに加えて ../amx でアクセスできる場所に osdefs.h amxdbg.h が必要
// 実行時にsc1.cのsetconfig()あたりでNULLエラーが発生するなら[プロジェクトの設定->構成プロパティ->全般->文字セット]でUnicodeを無効にしておく
#include "sc.h"
int main(int argc, char *argv[])
{
return pc_compile(argc, argv);
}
luabindを使っていて気になったのですが、
//cpp
struct A {
int x;
};
A *ptr;
A& ref() { return *ptr; };
A a;
luabind::module(L) [
luabind::def("ref", &ref),
luabind::class_<A>("A")
.def_readwrite("x", &A::x)
];
];
--lua
v = ref()
v.x = 1 --参照なのでC側のaにアクセスできる
クラスのインスタンスの参照を渡すときに、上の様に一度staticかglobalな変数
(上の場合ptr)を経由させる方法しか思いつかなかったのですが、ダイレクトに
渡す方法は無いものでしょうか?
507 :
506:2009/11/25(水) 14:14:17
訂正
A a;
ptr = &a;
luabind::module(L) [
luabind::def("ref", &ref),
luabind::class_<A>("A")
.def_readwrite("x", &A::x)
];
Lua詳しくないんでアレだが、lua_pushlightuserdataではダメなの?
Luaで実行状態を全部ファイルに保存して、また復帰するようなことは可能ですか?
>>509 Lua側でioで記録、読み込みするコード書くしかないかも
Smalltalkなら可能です
>>508 試してみましたが、luabindではligthuserdataではなくuserdataを使用して
独自の型ID等を付加してチェックしているようで、無理でした。
luabindのソースを追ってみたところ、luabind::detail::convert_to_luaで
C++側の変数の参照をluaのスタックに積めることが分かったので、
これでどこかのテーブルに置くとか引数で渡すとかの方法が使えそうです。
luabindのドキュメントにもサンプルにも、こういったスタックを使う方法が
記載されていないので、本来の使い方とは違う気もしますが。
>>513 通常、スクリプトにはC++クラス型のインスタンスのポインタを渡してポインタで操作させる。
C++の参照はC++固有の機能なので他の言語では使えないと考えたほうがいい。
別の変数に代入した瞬間(参照で無く実体のコピーとして)にコピーコンストラクタが発動したって文句言えないぞ。
まあバインダがエラー吐いてコンパイルの段階で失敗すると思うが。
休止モードを呼び出せばいいんだよ。
>>514 bind側に参照を渡した場合は、ポインタに変換して管理してるみたいですね。
LuaでGUIムリだろと思ってたら、意外とバインダが出てくるもんだなw
お前ら優しすぎw
小学生に方程式ムリだろと思ってたら、意外と鶴亀算が出てくるようなもんだな
最近はメインループのかなりの部分まで組み込みスクリプトで作っちゃうのが主流になりつつあるのかな。
Luaだと入力補完のあるエディタが無いから
逆にやり難いと感じる俺
>>520 大半を組み込み言語化した結果、パフォーマンスの壁にぶちあたって
機能分離可能なところはどんどんC++化していく、ってのが定番だとオモ
サンプル:俺
まあ通常、動的(型付け)言語はネイティブコードと比べて10倍以上は遅いからな。
オレもスクリプトでゲーム開発環境を一通り書き上げたところだが、
60フレームまわしたらそれだけで意外にCPU食ってしまうので、ちと困ってる。
最低ラインがPentium 4 2.4GHzくらいになった。
JIT付き静的型付けスクリプト言語
穴場だから誰か作れば
有名になれるかもよ
>>524 すでにあるっちゅうねん。
.NET Framework向けだがな。
>>.NET Framework向けだがな。
駄目じゃん
作りたいと本気で思ってる俺が来ましたよ
もし作るならスクリプトで定義したクラスのインスタンスがC++から簡単に作れて、マルチスレッドとか使って同時に複数のインスタンスを参照してもおかしくならない仕様にしたいな
つAngelScriptJIT
ただしやり方は不明。
LuaJIT ってなかったっけ?
Luaは静的じゃないでしょ
ああごめん、静的を見落としてた
luaのlua_pcallのerrfncが呼ばれたときに、元のエラーメッセージとは
別にソースファイル名、行番号を収集する場合なんですが、
lua_getstackのレベル指定で、1から++しながら順にたどって
最初にcurrentlineの値が-1以外になったレベルがソースファイルの
階層と判断して問題ないでしょうか?
メンバアクセスの:と.ってどう違うの?
.が通常のメンバアクセスで、:でアクセスする場合は
v.(v ,〜 に展開される。
例: v:open(arg) -> v.open(v, arg)
d
>>17 問題1
使用言語: R
f <- function (n) {substr("abcdefghijklmnopqrstuvwxyz",1,n)}
> f(6)
[1] "abcdef"
> f(30)
[1] "abcdefghijklmnopqrstuvwxyz"
すみません。
書くところを間違えました。
ごめんなさい。
聞かれてないけどついでに補足すると.は[]に展開される
v:member(arg) -> v.member(v, arg) -> v[menbe](v, arg)
v['menber'](v, arg)
へー
じゃあメンバアクセスのたびにマップ検索してんのか
遅くならないのかな
空想具現化プログラミングというところから落としたlua5_1_3_Win32_mbenc_a2.zipを展開したところbin2c5.1.exeにウイルス検知ソフトが反応したんですが、これは大丈夫なんでしょうか?
メンバだけの話じゃないだろうし。
変数名からなにから全ての識別子の判定で毎回どこかのテーブル見てるはず。
>>541 カスペルスキー系の誤検出のはず。
bin2cとか別に普段使うものでもないから削除しておいても良いかと。
>>543 ローカル変数は実行時はテーブル見ない。例えば、
local a = b * c + d
を
local a = b * c
a = a + d
に変えても速さは変わらない。
静的型付けならPawnいかがかな?
ちょっと確認したいんですが
lua_registerで登録した関数を呼び出すときには新しいスタックが毎回生成される、したがって
Glue関数内部ではlua_gettopでスタックの数を確認する必要なしにスタックの1番目が最初の引数、2番目が・・・としてよい
同様に、返り値もスタックの1番目が最初の返り値、二番目が・・・としてよい(何も考えずにスタッククリアして返り値を積めばいい)
これは正しいですか?
うむ
>>524 ActionScript 3.0 がそっちのほうを目指しているんじゃないかな。
いちおう Flex SDK はオープンソースらしいから、
自分のプログラムに組み込むこともできるかも。
>>540 Lua Performance Tips
http://www.lua.org/gems/sample.pdf for i = 1, 1000000 do
local x = math.sin(i)
end
runs 30% slower than this one:
local sin = math.sin
for i = 1, 1000000 do
local x = sin(i)
end
Luaについて質問です。
10進数で書かれた文字列、たとえば「\130\160\130\162\130\164」は
Lua上で「あいう」となりますが、外部ファイルに記述したものを
io.linesで取り出したものだと、コード列が返ってきてしまいます。
これを通常の文字列に変換したものとして使いたいのですが、どうしたらいいのでしょうか。
>>551 多分C側でバイナリに変換しないとダメじゃないだろうか。
Luaの標準ライブラリでももしかしたら出来るかもしれないが、
Cの方がてっとり早いだろう。
SquirrelのほうがLuaよりゲーム向けなんかな?
どっちも知識なしだったらSqから勉強でいいのだろうか
>>554 どちらも汎用スクリプトだから処理系単体ではどちらがよりゲーム向けということはない。
周辺ライブラリやバインダの入手性や使い勝手の差はあると思うけど。
lua は文法がな……
日本語は文法がな・・・
AngelScript|Д゚)ジー
>>551 loadstring をつかえばできるよ。
local str = "\130\160\130\162\130\164" -- io.lines で取り出した文字列
local decode = loadstring("return \"" .. str .. "\"")
print(decode())
>>449 コンパイラがOSロケールに依存してるから英語にしましょうなんて愉快すぎるわ
他のロケール依存アプリ全部道連れにする方法なんぞ万人に薦められんだろ
問題が起こるのはShiftJISを決めうちして作っている一部の馬鹿アプリだけだろ。
なぜ全部とか間抜けな話になるのか、頭の悪い奴の考えはさっぱり分からん。
バカアプリの代表が Visual Studio って話じゃないのん?
そんな事よりお前ら、GameMonkeyについて語るんだ。
winアプリにスクリプト組み込む場合、メッセージ(WM)処理どうしてる?
自分はマルチスレッドにしてるんだけど、WM_CLOSE受けたときに
スクリプトが走ってたら、スレッド他殺していいものなのかどうか。
保存したいデータがあるかどうかで判断しね?
データ保存しない場合はどんなタイミングで落としても問題無いってこと?
スクリプトを複数スレッドで別々に動かす状況がわからんな…
Luaだと、Lua_yieldでスクリプトの処理を一時停止させて次のスクリプト、という感じではダメなの?
それだとスクリプト書く側に停止を意識させないとダメですよね?
スクリプト側にメインループを置いて処理してるの?
winmainでメッセージループ、別スレッドでスクリプト。
スクリプトは入力待ち(マウス等)で関数無いで停止することがあって、
その間にメッセージループ側にWM_CLOSEとか来た場合にどうやって
終了させるかで色々迷っている、と。
スクリプトで割り込みを意識するような書き方は手間なので、
スレッドごと落とせると楽なんだけど、lua_Stateってスレッドごと
落とした後にlua_closeに渡して大丈夫なのか?ってのが疑問な
わけですよ。
lua_call系にステップ実行があると良かったんですがね。
ステップ数も指定できたりするのが。
>>571 スレッドを強制終了したら、基本的に何が起こってるか不明というか
たとえばガベコレの途中だったりしたら(その他でもあらゆる不明な原因で)
異常な状態になるからやめたほうが良い。
手段としては、別スレッドのほうの処理をコルーチンで構成しておいて、
コルーチンがyieldしたタイミングでコルーチン呼び出し側のコードで
終了チェックするようにする。
あとウエイトが絡む関数については、待ちループで終了チェックをするようにして、
終了フラグが立っていたらyieldを起こすようにする。
とかそんな感じじゃないの。
>>571 無限ループ防止という観点では、デバッグフックで1行実行ごとに関数呼ばせて、
その中でカウンターアップしていって、カウンターが一定の数になったらyieldとかいう手もある。はず。
574 :
デフォルトの名無しさん:2009/12/03(木) 11:24:54
スクリプト側の待ちループの中でlua_yieldを呼び出すグルー関数を呼びだすようにしておき、
メッセージ処理の待ちの間、具体的には
MSG *lpMes=&m_Msg;
ZeroMemory( lpMes, sizeof(MSG) );
while(lpMes->message!=WM_QUIT)
{
if(PeekMessage(lpMes,NULL,0,0,PM_REMOVE))
{
TranslateMessage(lpMes);
DispatchMessage(lpMes);
} else {
〜〜〜
}
}
の、〜〜〜の部分で1回目はlua_call、2回目以降はlua_resumeでスクリプトを呼び出せばいいような気がする。
>>565 他のスレッドはいきなり殺したらあかんでしょ。
メインスレッドからフラグたてて、よしなに自殺
てか、この辺のマルチスレッドの話ことってLua関係なくないか?
>>571 (before)
入力待ち(マウス等)で関数内で停止する
(after)
yieldを使い、外で停止する
入力が来たらresumeで関数内に戻る
WM_CLOSEが来たらresumeしないまま終了
lua関係ないよな。普通にC++だけで書いてても全く同じだ。
まあ、lua (ないしは squirrel) なら、yield のタイミングで同期を
とるようなコードにしておくのが無難ってのはその通りだと思われ
>>573 なるほど、それならステップ実行できますね。
>>他のレスくれた方々
具体的に書いた例だとマルチスレッドになってるけど、根本は
WindowsでLua使うときにメッセージ処理をどうしてるかって話ですから。
避けて通れないだろうから、実際に組み込んでる方々はどう対処してるかが
気になったもので。
>>579 シングルスレッドモデルで組んであれば処理の流れ的に問題になるようなことは別にない
あとはオブジェクトをどう管理してるかの問題。
ウインドウのインスタンスを lua 配下にしてある(生成もlua側から)なら、それぞれのウインドウの
メッセージ処理部から、lua でのインスタンスの適当なメソッド (onCloseとか) をイベント的に callback
させて閉じるかどうかをスクリプト側に判定させればいいだろう
ウインドウのインスタンスがグローバルなら、lua 側も同様に
グローバルメソッドをイベントとして呼び出して判定させるように組めばいい
Luaのスタックとか文法とかにいまいち馴染めないからエンゼルスクリプトをやってみようかと思ったが日本語資料がなさすぎて泣いた
>エンゼルスクリプト
なんか可愛いな
つ英文マニュアル
結構読みやすいよ。
あと、WIPのtest_featureに入ってるサンプルもわかりやすい。
エンゼルスクリプトって速度どれくらい?
おい、結婚するか
そうだな。結婚すると良いよ。
じゃあ俺が息子になろわ
590 :
551:2009/12/04(金) 21:52:36
>>553,560
回答が遅くなってすみません。
>>560さんの方法で望みの動作になりました。
お二方とも、本当にありがとうございました。
日本語資料が無いから辛いと書いてるのにそんなの勧めるなよw
Pawn何で人気ないん?
Luaの入門書読み終わったけどユーザーデータについてあんまし書いてなかったぜ
ポインタ渡せないとオブジェクトの操作ができないジャマイカ
Luaの入門書ってどれのこと?
入門Luaプログラミングというやつなんだけど、ちょろっと1Pくらいしか説明がなくてわかりにくかった
luaといえば、下の二つのスクリプトを順に実行すると、
--a.lua
local v = 1
local function f()
print(v)
end
fv = f
--b.lua
fv()
結果
1
感じになるんだが、関数の実体もガベコレされてるのかな?
関数内で使ってるlocal変数もコピーかリファレンスを持つことになると?
>>597 Luaはよく知らないが、単にグローバル変数を
2つのスクリプトで共有してるだけなんじゃね?
>>597 fv が f をつかんでいる間はつねに f のなかから v が参照可能だよ。
Lua の関数も参照されなくなればもちろんガベコレされる。
> 関数内で使ってるlocal変数もコピーかリファレンスを持つことになると?
Lua ではこういう変数のことを upvalue と呼んでますが、
必要に応じてスタックからヒープへコピーされるみたい。
http://www.lua.org/docs.html ここにある The implementation of Lua 5.0 っていう論文に、
イラストつきで説明があります。
>>599 完全な回答をありがとう。凄くすっきりしました。
この辺の仕様はとても良くできてるなと思いますね。
closureみたいなもん?
すっきりとした仕様だね。
Schemeライクというか。
squirrel だと同等のものは「Free variables」と呼ばれててこちらは対象の明示指定が必要だね
>>605 エエー、あんな古臭い言語を今更高速化するのが予算つくのか。
LuaJITだってあるのに。
ヒント: 電気通信大学
>>606 ところがLuaJITのGCにはあんま手が入ってはいないんだ。
こんなんで採択されるのかよw
ローカルなスクリプト言語
高速化してたら切りが無いぞ
本家と連絡取らずにやってるんなら残念な結果になる可能性が高い気がする。
よーしじゃあパパAngelScriptを高速化しちゃうぞー
C言語そのままスクリプトにしたようなのってありますか?
>>612 文法のことならSquirrelとかPythonがある程度近いと思うがそのまんまってのはたぶんない
クロージャとコルーチンさえあればもうCでいい気がしてきた俺には十分魅力的だなぁCINTわ
CINTにクロージャとかコルーチンとかあったか?
Cっぽい文法ならAngelScriptでいいじゃない
pawnとgoとgamemonkeyのスルーっぷりw
C言語みたいなプログラム書きにくい言語でスクリプト記述したいとか、どんなマゾよ?
世の中、なにか一つ習得するとそれにしがみつくのが習性という猫もいるんだ。
>>621 これってたまに見かけるが、Cってそんなに書きにくいか?
Cの書きにくさは、資源管理(malloc/free)がプログラマ任せであることや、
文字列操作がめんどいことにあって、構文や文法自体はそんなに書きにくくは
ないよね。Cが書きにくいなら、JavaがあそこまでCを引き継いだような仕様には
なってないと思う。
# でもまぁCが書きにくいと主張する人は、JavaはCから書きにくさを継承したと
# 主張するか。
Cの書きにくさ
・クロージャがない
・ガベージコレクションがない
・メモリアクセス保護がない
・文字列型がない
・というかコレクション型が一切ない
・というかforeachがない
・せめてイテレータくらい付けて
・関数オブジェクトの定義が面倒(定義と関数ポインタの扱いが別)
・というかファーストオブジェクトになってない
とまあ、仮にオブジェクト指向でなかったとしてもこれくらいあるわけだ。
アセンブラに比べたら格段に書きやすい
あー複雑な型の宣言や定義の構文は魔境入ってるかw
Cは40年近く前に出来た化石言語だからな。
当時のスペックのコンピュータで動かすためにキモイ仕様にしてるから書きづらくて当然。
ネイティブ系ではテンプレートの便利さに触れると、C++以外の言語を受け付けなくなるよ。
>>630 ふーん……。
D言語とかOCamlとかHaskellは触ってみたことあるの?
臭いものに蓋をするのがITの正道
蓋をしないネイティブ系・組み込み系は邪道だな
なでしこやろうぜ!
>>632 怖いものみたさor言われるままに蓋を開けて
自分の足を撃つのがITの正道
>>630 テンプレートでほら、関数型言語っぽいプログラミングも可能になる!!!
とか言われてもぶっちゃけあれキモいんだけど実際のところどうなの?
boost spiritとかboost lambdaは、使う使わないは別として、
キモいと思わない人はいないんじゃないかと。
C++をメインで使ってるけど、ぶっちゃけDirectXやライブラリの対応が
いいネイティブの別言語ができたらそっちに乗り換える。
>>637 そういうのは、ラッパーライブラリひとつで解決できる話なのさー。(他言語対応)
ただし動作検証用のコードは一部C++で用意しとかないといけないと思うが。
その使い勝手のいいラッパーが無いという話をしているんだろう。
boost::lambdaを使いこなしてない奴はC++を理解していない(キリッ
>>636 あれはその、なんていうかキモかわいい。
Brainf**kやろうぜ!
コンパイルにかかる時間が可愛くなさすぎる。
その視点で見るとGoは実に可愛らしい
Goって組み込めるの?
\ l´⌒\⌒\ \\ \
\ ヽ ) ) \\ \\
( \ \∩___∩ \\
\ \ ⌒⌒| ノ ヽ \\
\ \ / ● ● ト、\ \\\
\ Y | ( _●_) ミ\ \\\
\ / 彡、_ |∪| ノ \ \\\
(____)―ヽノ' ヽ  ̄ ̄ ヽ\\
\, j l l .l }
Lua! l (_ノノノノ
>>637-638 お前、なにかよさげなライブラリある度にラッパー作ってたDelphi使いの俺をなめるなよ。
さすがにもう嫌になってDelphi使ってないわ(´・ω・`) 昔は良い言語だったんだが
ああ、次はDelphi用Lua、Delphi用Squirrel、Delphi用AngelScriptだ…
ぶった斬りすいません
luaでテキストから文字を読み込んで使いたいのですが、
そのあとに文字入力のために同じ関数(io.read)を使うと文字入力できなくなってしまいます。
文字読み込みのio.readと、キーボード入力のio.readの区別をつけるにはどうすればいいのでしょうか?
よろしくお願いします。
テキストってテキストファイルのこと?
それとも標準入力?
>>651 レスありがとうございます。
テキストファイルから文字を取り出してluaの配列に入れています。
>>504-505 これってコンパイル済み(.amx)ではなくて
普通のPawnファイル(.p)も実行出来ます?
と思ったらPawnはコンパイル済みのしか実行出来ないみたいですね
スレ汚しすみません
Luaファイルって、配布するときに隠すことできる?
Cの組み込みで使おうと思っているのだけれど、Cはコンパイルすれば自動的にソースは見えなくなってくれるからおk。
けど、Luaファイルで記述した部分がもろばれになってしまうので、どうにかならないかなぁということです。
隠すというのがコンパイル後のバイナリでOKというなら、Luaもバイナリ出力することができるよ。
658 :
656:2009/12/14(月) 20:47:13
javascriptを組み込んだらいいんじゃね?
ユーザー多いし、資料多いし。
って思ったら、処理系実装が軒並みLGPLとかMPLとか・・・・
スクリプト言語から離れるが、自作のファイルアーカイブクラスでメモリにスクリプトやコンパイル後のバイナリを読み込み、
そのメモリの内容をコンパイル、もしくはバイナリ読み込みするようにすればいいと思う。
661 :
デフォルトの名無しさん:2009/12/15(火) 00:34:42
>>659 CRIScriptとかはどうなんだ?
BSD風ライセンスらしいが
さげわすれた・・・・
CRIScriptね。
どうなんだろ、使用感を聞いたことがない。
あれ、主開発者がApple行っちゃったけど大丈夫かな、CRIなのにww
いや、すごく期待はしてるんだよ
SpiderMonkeyかな
>>652 はじめ言っていることが良くわからなかったんだけど、いまわかった。
http://www.lua.org/manual/5.1/manual.html#pdf-io.input When called with a file name, (略), and sets its handle as the default input file.
つまりいちど io.read でファイルを読み込むとデフォルト入力ファイルが変更されるので、
それ以降は io.read では同じファイルをさらに読み込もうとするみたい。
標準入力(キーボード)から読み込みたいときは、
io.stdin:read() を使えば良いんじゃないかな?
あー、もう!Pawn性能いいから組み込もうとしたけど
ソース汚くて処理系によってはエラー続出で修正必須、もうやだ
int main(int argc, char *argv[])
{
extern AMX_NATIVE_INFO console_Natives[];
extern AMX_NATIVE_INFO core_Natives[];
extern AMX_NATIVE_INFO string_Natives[];
AMX amx;
cell ret = 0;
if (aux_LoadProgram(&amx, "test.amx", NULL) != AMX_ERR_NONE) exit(1);
if (amx_Register(&amx, console_Natives, -1)) exit(1);
if (amx_Register(&amx, core_Natives, -1)) exit(1);
if (amx_Register(&amx, string_Natives, -1)) exit(1);
if (amx_Exec(&amx, &ret, AMX_EXEC_MAIN)) exit(1);
printf("%ld\n", (long)ret);
aux_FreeProgram(&amx);
return 0;
}
悪銭苦闘しながらもコンパイラ、amx 実行側のビルド完了まで行ったから試しに
サンプルコード(examples/cards.p) をコンパイルして実行してみたけど
aux_LoadProgram のところでメモリエラー起きて落ちる
もうPawn意味が分からない、資料少なすぎ助けて・・・・
追記
Pawn ファイルで include <###> をしていない物は正常に実行出来た
ドキュメントが全てpdfだったり、インストールが実行形式だったり
変なところで敷居上げてる気はするな
敷居を下げる配慮をした結果なのだろうとは思うが
PawnはFloat使おうとして挫折した。なんで組み込み型じゃないんだよ。。。。
スレタイにある「Squirrel」の読みはアメリカ英語で「スクワール」で、
イギリス英語だと「スクウィール」のようです。
Luaのライブラリを最小限のサイズにしたいのだけど
削っても動作に影響ないファイルとかあります?
>>671 パーサー部分は削った?
参考→Lua書庫内etc/noparser.c
最近Squirrelを始めた者です。
今、C++のクラスをバインドしているんですが、分からないことになりました。
あるクラスAがあってそのクラスのインスタンスからgetB()でクラスBのインスタンスを取得できるとします。
で、そこまでは
a<-A();
b<-a.getB();
とすることでbには[instance]が入っているのを確認できました。クラスBもバインド済みです。
しかし、そこからbにたいしてBのメンバを呼ぼうと思っても呼び出せません。以下がエラーです。
AN ERROR HAS OCCURED [the index 'draw' does not exist]
バインドするときに戻り値が何型であるかを設定する方法があるんでしょうか?
バインドの方法がおかしいんだろう。クラスインスタンスを返す場合は、その返したいクラスに対して sq_createinstance
して squirrel のインスタンスとしての構造を作ったものに sq_setinstanceup したものを返す必要があるんだがそうしてるかい?
>>674 してませんでした。> createinstance
使い方が分からん・・・
676 :
デフォルトの名無しさん:2009/12/15(火) 22:40:50
こんなコードにしてみましたが、違うんでしょうね・・・。だって、動かなかったですしね・・・。
static SQInteger bitmap_getgraphics(HSQUIRRELVM v){
Bitmap *b;
sq_getinstanceup(v,1,(SQUserPointer*)&b,0);
sq_setinstanceup(v,1,&b->getGraphics() );
sq_createinstance(v,1);
return 1;
}
Cの組み込みでLuaって速度的にどれぐらい出る?
ゲーム作ってるんだけど、1fps≒16msの間にpcall呼びまくったりしても大丈夫かな。
ざっと3000回ぐらい。
ソース読んでたけど、よくわからん?
sq_getclassでクラスをスタックに
sq_createinstanceでそのクラスのインスタンスを作成し、スタックへ
sq_setinstanceupでユーザーポインタをインスタンスにセット
と思ったんだが、最初のsq_getclassでどうやれば返り値のクラスを取得できるんだ・・・
bzr
間違えたぜ
>>678 主要なバインダには該当コードあるんだからそれを探して読もうよ。
sq_getclass はインスタンスのクラスを取得するもの。sq_createinstance をする場合に
参照するクラスはあらかじめわかってるんだから、C側で参照を保持しておくか、
あるいは global から名前指定しで取り出して使う
>>672 それはどうやれば良いですか?
noparser.c でググったのだけど
ファイルサイズが削れるだけの説明ばかりで
>>670 PCのスペックも環境も書いてないのにそんな話しても無駄だが、
最近のPCで本当にただpcall呼ぶだけなら3000回くらい平気じゃないかね。
>>682 コンパイル済みのスクリプトしか読ませないの前提でパーサ削除しろって話じゃないかね。
685 :
デフォルトの名無しさん:2009/12/16(水) 17:03:32
今更だと思うけど、luaとsquirrelのスピード測ってみたんで貼っておく
(CentOS 5.3 64bit)
処理内容の擬似コードは
ans=0
for(i = 0..10000) { ans+=i;}
for(i = 0..10000) { ans-=i;}
これを更に10000回
lua 5.1.4 10000 times ( 3.176293)
squirrel 3.0 10000 times ( 8.569499)
ruby 1.9.1 10000 times ( 20.318498)
cpp 10000 times ( 0.197799)
squirrelも十分速いと思うけど、lua速え、ルbywww
ちなみに組み込んだ際の処理系サイズ
lua 188k
squirrel 371k
ruby 5.2M
意味無いことを
下手をすると、Cでは変数が後で利用されていないと、
最適化でごっそり無かったことにされるから気をつけろ。
コンパイル時に計算済ませていきなり即値代入して終了とかな。
>>687 あるあるww
最初測ったら0秒だったよ
今回はLuaの1/15くらいだからこんなもんでしょ
あと、rubyをコケにしてるような書き方になってしまった
あれは便利さ重視だからスピードは二の次
rubyユーザーごめん
引き合いに出したのは、自分がよく使ってて、一応組み込めるから。
オブジェクト生成するからな。
とにかく意味が無い例であるのはたしか。
>>676 たぶんこんな感じかな。テストしてないので動作するか分からないけど
static SQInteger bitmap_getgraphics(HSQUIRRELVM v){
Bitmap *b;
//Bitmapのポインタを得る
//Bitmap_tagはBitmapクラスを登録したときのタイプタグ
if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer*)&b,(SQUserPointer)Bitmap_typetag))) return 0;
//Bクラスのインスタンスの作成
//B_handleはBクラスを登録したときのハンドル
sq_pushobject(v,B_handle);
sq_createinstance(v,sq_gettop(v));
sq_remove(v,-2);
sq_setinstanceup(v,-1,&b->getGraphics());
return 1;
}
BitmapとBのクラスはすでに登録されているものとしします。
ちなみにクラス登録時はこんな感じ
//クラス登録
//class_nameにクラス名
sq_pushstring(v, class_name, -1);
sq_newclass(v, SQFalse);
//クラスハンドルの獲得
//class_handleに用意したクラスハンドルへのポインタ
sq_getstackobj(v,-1,class_handle);
//クラスハンドルタグの設定
//class_tagにクラスのタイプタグ
sq_settypetag(v,-1,class_tag);
>>691 作りにもよるけどたいていは sq_setreleasehok 処理も必要
>>692 ん?sq_setreleasehookってコンストラクタの中じゃないの?
>>693 sq_createinstance はまさに構築済みの C++オブジェクトをラップして返すために
あるもので、squirrel のコンストラクタをよばない。
普通のコンストラクタは中で C++のインスタンスを new してるから、
呼んでしまうと余分なC++インスタンスがつくられる上に、さらに
別のインスタンスを sq_setinstanceup した時点でリークしちゃうからね。
で、よばれないから、たいていコンストラクタでやってるはずの
sq_setreleasehook は別途必要になる
>>694 おおっ、なるほどな。
良く見たら自分のメモリ開放できてなかったわ^^;)
696 :
デフォルトの名無しさん:2009/12/17(木) 00:22:06
>>691うおぉぉぉ 本当にありがとうございます!しかし、こんな風に書くとは全く思ってませんでした・・・
勉強になりました。が、Squirrelは使いづらいなと思いました・・・。
>>694 ちなみにですが、691にはどんな追記をすればいいんでしょうか?
自分は下のようにやったんですが、プログラム終了時にあぼんいたしました。
Bitmap *b;
if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer*)&b,(SQUserPointer)&SQBitmap)))return 0;//環境オブジェクトからBitmap*を取得
sq_pushobject(v,SQGraphics.getSQClass());//Graphicsクラスのクラスハンドルをスタックに乗せる
sq_createinstance(v,sq_gettop(v));//そのクラスのインスタンスを作成(Graphics自体のインスタンスは作られない)
sq_setreleasehook(v,-1,graphics_releasehook);//一番上のインスタンスに解放関数を持たせる?わからない
sq_remove(v,-2);//クラスハンドルを削除している?
sq_setinstanceup(v,-1,&b->getGraphics() );//実際にインスタンスにGraphics*をセットする
なんか、他の部分も怖くなってきました。リファレンスだけじゃわかりませんね。
>>685-689 Rubyて感覚的には30分走らせる代わりに10分でコード書く。C言語は1時間でコードかくかわりに1分で走らせるとか、比喩があったなw
C言語と30年戦う代わりに1年で味方につけるべきだったな。
AngelScript|Д゚)ジー
>>696 記述自体はそれであってるけど、sq_setreleasehook するのは sq_setinstanceup が成功したのを確認した後でしょう。
終了時あぼんは、そりゃどっかプログラムが悪いんだろうとしか言えない。
その b->getGraphics() でとった Graphics が勝手に独自に解放されて大丈夫な構造で作られて
ないのなら setreleasehook してはダメ、って、&つけてるってことはメンバ変数か。それはダメかも
C++で管理を単純化するために、親が責任もって解放してるので、子オブジェクトは
ポインタ参照したあともそのまま放置したのでOK、という書き方は実際よくあって、
そういったものをsquirrel に移すときは、子オブジェクトにポインタ渡してオブジェクトとして
作るけど sq_setreleasehook はしないという書き方にする必要がもちろんある。
親が先に死んだ状態で子をさわるとポインタ腐ってるのでクラッシュするけど
それはそういうもの。squirrel は機構は提供してくれるけど、自動で判断してくれるわけでは
ないから、あくまで C++ 的に破綻しないように注意して書く必要がある。
そういうのいやならオブジェクトを全体的にリファレンスカウント
方式とかで管理するようにするしかない。
そして循環参照トラップにはまるw
循環参照嫌うなら弱参照系ないしはGCの実装が必要
もっとも、squirrel 自体がリファレンスカウントもGCも弱参照ももってるから、
既存ライブラリを持ってくるのではなく最初から書くのなら、C++ 側を
squirrelの機構にべったりのっかるように書くという考え方もある。
個別のオブジェクトはごく単純にバインドするようにして、C++ 側でオブジェクトの親子構造を持つ場合は、
C++そのもののポインタではなく、squirrel のオブジェクトを一旦作ってそれを HSQOBJECT で持つようにする。
さらには、配列や辞書が必要なら、STL とかを使うのではなく、squirrel の array / dictionary を使う。
C++ 側で元のオブジェクトを参照する場合にも squirrel の機構を経由する必要があるので一手間増えるけど、
squirrel に値を返す時は持ってる HSQOBJECT を sq_pushobject するだけになるからとても簡単になるし、
オブジェクトの寿命管理も squirrel 側になるから、いつ誰が破棄しても安心
>>700 あー、やっぱり、新しくインスタンス作ってるんじゃないんならsetreleasehookはいらないんですね。
なんか中で気持ち悪いことやっててGraphicsインスタンス作ったつもりはないのに解放関数与えないとダメなのかと思いました。
(ソース読んだ限りではそういう記述が無かったので、疑問には思ってましたが・・・)
あとは、終了時あぼんの原因を探れば動きそうです。ありがとうございました。
ていうかBCC5.5ってテンプレートが弱いからSqPlusとか使えないんですね・・・。メチ不便
xtalの新verが出てる。
デバッガー早くできるといいな。
Squirrelの演算子一覧に => ってあって
え!? と思ったら単なるtypoだった・・・
ぅあ
squirrelで
{};hoge
をコンパイラが受け付けないのには何か理由があるの?
疑似BNF見る限り許容されそうなものだけど
ワンライナーだとついテーブルコンストラクタに ; 付けてしまう
nscryptみたいな軽量な物で小数点も扱えるのあればなぁ
luaとかは無駄な部分が多すぎて
他の部分がNスクで十分なら、多分Nスク作者に要望を投げてみるのが、
その要望の解決にはいちばんいいと思う。
>>708 出来るならそうしたいけど
nScript作者はここ最近活動休止中みたいで
そのスクリプトも含め更新と言う物が一切されてないから期待出来ない
だから自分で実装しようとしてるけど
元々Cのみで書かれてないから移植作業がまず大変
はてな日記見てみたけど、なんか次世代エンジンに注力してるみたいね。
そのへん追いついてなかった。
あ、あと、どう使うつもりか知りませんがライセンス大丈夫ですよね?
Nスクのライセンスは全く見ずに言いますが。
>>711 個人利用のみだから問題ないはず、と思う
nScriptってWWWCの作者のだよな?
NScripterと話がごっちゃになってね?
突っ込もうと思ったら怒涛の勢いでレスが・・・
確かに混同してるな
あれ、ソースみてるけどフルCでね?
windows.hに依存してるのはあるかもしれんが
パイソンとかルビーをゲームに使ってる人はいますか?
>>716 フルCに見えるけど一部Winの機能使ってて
手直し必須だと思う
スクリプト実行する根っこの部分でWinの機能つかってるから
一部と言うより根本的な修正が必要だなこれ
ところでお前ら、この手のスクリプトエンジンに手直し入れる場合、どのぐらいまで手を入れますか?
基本命令や文法とかまで変えたりする?
>>717 ノシ IronPython使用中。
1週間ほどあればスクリプト部分はcPythonにも移植出来るかな。
特に問題ないよ。
スクリプト内でマルチスレッド化が普通にできるのが強みだな。
>>720 本家バージョンアップの度にパッチ当てるの面倒だから基本的にそのまま
作業を楽にする目的で文法いじるとしたらプリプロセッサとかトランスレータを間にいれるかな
文法変えずに必要な機能が実現できないなら言語の選択に問題があるかと
ライブラリレベルならアーカイブが透過的に扱えるようIOを自作のに差し替えてる
誰か
>>715のnScriptをCのみで動かせるように
手直ししてくれる人いません?
メモリ管理や足りない型の再定義とかはなんとかなるけど
マルチスレッド処理には詳しくないから
同期処理とある部分の代用関数が分からない
そもそもCにスレッドなんて無いような
TCP使えるネットワークライブラリでC汎用なのも無いきが
luaはどうも記述が冗長になる・・。
if ~ then ~ endとか。
「関数先頭でリソース割り当て。割り当て成功してたら
終わりで開放。」見たいなコード書くとフラグ使って
最後でif文みたいな感じになるけど、
C#のIDisposable見たいな機能があると便利かと。
割り当て・開放のコードが集約できるから見やすそう。
Cでそういうの書けばいいねん
・テーブルに関数をpushする
・テーブルが空になるまで関数をpopして呼び出す
の2つを簡単に出来るようなライブラリを作ればいいと思う
>>728 で、それが種々のbinderになるわけですが何か。
730 :
726:2009/12/20(日) 18:18:19
きっと欲しいのはこんな感じ
do
local resource=...
finaly
finnalize(resource)
end
:
:
end -- ここでfinalyの内容が自動で呼ばれる。
自動で呼ばれるとなると言語サポートは必須かと。
metaluaあたりで作れるかな?
何のためにGCがあると思ってるんだろうか
732 :
726:2009/12/20(日) 18:28:56
javaのGCじゃリソース管理できないから
C#はIDisposable入れたんじゃないの?
>>732 違うよ。
本来的にアンマネージドなリソースの管理はGCじゃなくてプログラマの責任だから、
プログラマが明示的にDispose()かける仕組みになってるんだよ。
734 :
726:2009/12/20(日) 18:44:32
え?
C#はかじった程度しかしらんのでうそ言ってるかもしれんが、
usingとIDisposabeなクラス組み合わせると
リソース開放漏れが(ファイルのクローズとか)が防げますよー
って使い方するんじゃないの?(C++のRAIIみたいな)
これでどうだ
call_with_finally = function (block)
local t, n = {}, 0
block(function (f)
n = n + 1
t[n] = f
end)
for i = n, 1, -1 do t[i]() end
end
call_with_finally(function (finally)
local resource = ...
finally(function ()
finalize(resource)
end)
:
:
end)
736 :
726:2009/12/20(日) 18:57:38
>>735 よく思いつきますな。理解するのに
上下のブロックを10回ぐらい往復しましたよ・・・。
ただ、複雑になったらそのコードを一年後理解しなす
自身がないかも。
ついでにmetaluaでよろしく ノシ (冗
>>734 IDisposableを継承したクラスはusing構文で使うことが推奨されているわけだが、
当然この構文が使えない使い方があるわけで。
(using構文を使うと実用上スタックに載せているのと同じなわけで、ヒープに置きたい場合だってあるだろう、という話)
で、ユーザーが手で作ってホールドしているIDisposableなインスタンスは当然自分で明示的に破棄しないといけない。
//
/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ AngelScript 2.18.0!!
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
AngelScriptが2.18.0になってるな
ASの本だれか書いてくれ
ActionScriptなら
仮想マシンをいくつもopenするのって良くないですか?
同時に動かす必要が無いなら良くないんじゃない
744 :
デフォルトの名無しさん:2009/12/21(月) 19:21:29
良くないですね
>>740 まずは2.18.0のShiftJIS対応版だ…
sjis対応なんて激変してない限りいつも同じ手順だろうに
AngelScriptはこまめに更新されるから、結構手間なのよ。
ShiftJIS<->UTF-8の変換を間に挟むだけなんだから、
一度書いたら別に毎度手間がかかる訳じゃないだろ。
//
/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ Lua!!
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
>>748 AS_DOUBLEBYTE_CHARSETで有効になる部分に、そのままだとビルドエラーになる部分があって、
そこを毎回毎回直さなきゃならないんだ。
公式に知らせたほうがいいとは思うが英語が苦手でね…
とりあえずdiff 取って投げれないの?
>>735 こういうの、JavaScriptとかRubyとかやってると思いつくよなw
毎回なおすってまさか手でなおしてるんじゃ・・・
バージョン管理してパッチ吐いたりして、どうしてもパッチあたらないときは手で直すとかしたらどうかと
>>751 自分がいじったファイルをリポジトリにコミットって事?
>>753 まさかの毎回手直し。
あと、
>バージョン管理してパッチ吐いたりして、どうしてもパッチあたらないときは手で直すとかしたらどうかと
ってのは、TortoiseSVNの「パッチを作成」「パッチを適用」を使えって事?
質問ばかりですまん。
>>754 公式は svn かな。それなら
1. 公式から任意のバージョンをエクスポートしてきて、それで自分の手元で自前の svnレポジトリを作る
2. 自分の更新はそこに任意にコミットする
3. 公式の svn から適当なタイミング(リリースがあった時とか)で更新を「マージ」する
これでおおむね安全に手元作業できるはず
svn は以前は外部レポジトリからのマージができなかったので、
手元のレポジトリに「ベンダーブランチ」として公式の内容をまるごとコピーして、さらにそこからマージする
必要があったんだけど、今のは普通に外のレポジトリからマージできるのでこの手の作業は楽になった
あるいは最先端技術でいくなら、bazaar のような、svn プロトコルに対応した分散構成管理ツールをつかうという手もある。
svn のマージはわりとややこしいし、ログの類もマージ作業に依存してしまうので、こっちのが構造的にははるかにスマート。
この場合、自分の変更分はローカルコミットとして維持する形になる
>>755 詳しい説明d。
ただ、AngelScriptはWIPのみsvnを公開してるみたいなので、
>手元のレポジトリに「ベンダーブランチ」として公式の内容をまるごとコピーして、さらにそこからマージする
というやり方になりそう。
ちょっと試してくる。
そもそも
英語が苦手とか駄々こねてんじゃねえよクソが
死ねばいいのに
ごめん誤爆してた
メインラインにマージしてもらえば今後そのケースで悩む必要は無いというのに
英語が出来ないからというそれだけの理由で一生無駄な作業をしつづけるんだろうな
英語が出来ずともパッチ送るだけで十分なのに
そういうのはそう思う人がやればよろし。おしつけはおーぷんそーすの精神に反するのでいくない
763 :
762:2009/12/22(火) 17:39:53
ごめん誤爆した
764 :
762:2009/12/22(火) 19:33:50
>>763 人を騙るな。まじ気にしなくていいよ>パッチ送るとか
765 :
762:2009/12/22(火) 19:38:59
お前こそ誰だよ
766 :
762:2009/12/22(火) 20:51:42
何で俺こんなにいるん?
767 :
762:2009/12/22(火) 23:13:59
4800円もするpython入門書が古い版でしかもC組み込みについて全然触れてなかったでござる
何も文章書かずにパッチだけいきなり送るとか、どんだけ失礼なんだよ。
お歳暮だって何も文章書かずにいきなり送りつけてくるだろ。
最近お歳暮という日本の習慣を覚えたばかりの外国人の方ですか?
つまりパッチにoseiboって書いて送れと
おう、てめーらサンタさんディスってんのか
サンタさんはいい子にしかこないけど、
いい子以外にもパッチを送りつけるような真似はいかがなものかと。
ASが悪い子だと
>>769 gitなんかdiff形式のメール生成して送る機能なかったけ?w
まーでも、こういうときってgithubとかbitbucketみたいなサービス使って欲しくはある。
forkして変更して、変更を相手に送る(pullリクエストする)というのがシステムに組み込まれているから、
パッチ送るのも気軽なんだよね。
778 :
デフォルトの名無しさん:2010/01/04(月) 14:49:54
オイ俺のコピペ脳、まで読んだ。
Lua について相談なんですが、
メタテーブルの __newindex を使えば、
テーブルに新しい key を追加するときにフックをかけることができるけど、
同じような感じで、テーブルの既存の key の値を変更するときに、
フックをかけることってできないかな?
メタテーブルの__indexは調べた?
単純に、テーブル本体は何も仕事をしないでメタテーブルにすべて丸投げしたい
と考えれば簡単なことなんだけどな。
空のテーブルにメタテーブルを持たせて key が何も無い状態を維持すれば良い。
いったんメタテーブルに丸投げするが、データを保持する仕事はテーブル本体でやる
と考えるとややこしくなるよな。
確かに! 間に空テーブルをかませばいいんですよね。
ありがとうございました。
Lua 5.2.0 work1 出てるね
ファイナルもうすぐかも
> ファイナルもうすぐかも
それはない
環境周りが結構変わったのかな?
- lexical environmentsの導入(in EXP do BLOCK end)
- setfenv/getfenvがなくなった(debugのはある?)
- 全thread(コルーチン)で環境はひとつのみ?
自作ライブラリは結構見直さないとなー
こうですか?わかりません
local x = 1 do
local y = 2 do
・・・
end
end
in {x = 1} do
in {x = x, y = 2} do
・・・
end
end
lexical environment は、ECMAScript (JavaScript) の with みたいなもんかな。
set/getfenv は関数に対して破壊的な操作をしてしまうので、新しいやり方のほうがきれいに書けるかも。
空テーブルをsetfenvするモジュールシステムに慣れてる人なら、
もともと空っぽの環境を破壊されてもほとんど困らないけどね
破壊的なのは「グローバルな関数の環境を変えてしまう」って
とこじゃないの?setfenvする場合たいてローカル関数
をつくったうえで行う場合がほとんどだし。
function global_f() ~~~ end
に対してglobal_fの挙動を変えたいがために(たとえば
global_f内で呼び出しているprintの挙動を変える)
setfenv(global_f,~~)とはやるのは危険だし。
(ほかスレッドでの呼び出しも影響を受ける)
in { print=function(...) ~~ end } do
global_f()
end
とできるからそのほうが安全・・・ってのが
使いどころなのかな?
792 :
791:2010/01/13(水) 00:53:12
ごめん激しくうそ言った。
791の例でprintはglobal_fが作られた時点で固定化されているので
一番最後の方法では挿げ替えはできないね(orz
Tropico3という箱庭(miniスケープの方の)ゲームでlua使われてた。
なんかzlib圧縮(?)されてるから.luaファイルみてもわからんけど
>>792 それであってるんじゃないかな?
print が global_f の外側で local で宣言されていれば global_f が作られた時点で固定化される(レキシカル変数として)けど、
そうでなければグローバル変数として参照されるので、
環境を変えればその影響を受ける。
795 :
791:2010/01/13(水) 19:13:03
実際にビルドして試したので「間違い」で正しいかと。
本質的にはスレッドに対するsetfenvと同じで
>94の勘違いと同質な問題。
子供の関数の呼び出しまで影響を受けるとなると
危険極まりないのも事実だし。(トレードオフではあるが)
それよりもpcalやCスタック先からyield可能になったのは大きい。
あ、ごめんなさい。勘違いしてた。
関数が定義された場所の環境をそのまま引き継ぐってことですよね。
だから、スクリプトファイルを読み込むとき(dofile とかで)に in ... do を使うと、
以後、そのファイル内で定義された関数はサンドボックス環境で実行されるわけか。
Luaって
table =
{
element1 = 3
element3 = "str"
func element2() ...... end
}
みたいなことできませんか?
事故解決しました。。。。ごめんなさい
Lua 5.2 work2キタ━━
ファイナルもうすぐかも
URLください
lua5.1.dllがノートンでウィルス扱いされるな
なにそれこわい
そういやShiftJIS対応Lua5.1.3もノートンでウィルスありと判定されてたな。
誤検出なのかな?
皆luaスクリプトの暗号化はどうやってるん?
リファレンスマニュアル探したけど、それらしい物が無かったんだが…
Luaってシリアライズできなかったっけ
lua_load/lua_dumpで自前で暗号化するくらしかできんよね
807 :
デフォルトの名無しさん:2010/02/03(水) 08:55:04
暗号化したファイルを読み込んで復元し、文字列にする>luaL_loadbufferやluaL_loadstringにその文字列を渡してコンパイル
って手順ではダメ?
Python人気ねーな。luaより断然コード書きやすいのに。遅いけど
Luaがもうちょっとキモくない文法ならいいんだけどなぁ
文法だけ変換するプリプロセッサかトランスレータのようなものを作ればいいんじゃないだろうか
たった数十kbくらいのサイズで
Cライクな文法が使える超軽量な組み込みないかな
LuaとかPawnも、小さい部類だろうけど不要な物が多すぎる
asじゃあかんの
Win版でUTF8とUTF16を相互変換するようにLuaを改造したけど需要ないかしら
たとえばSDLとか
ところで、Windows x64向けにビルドしてみたけど
> print(2^63 - (2^63+1))
でなぜか0が返ってくる
> print(2^31 - (2^31+1))
なら1になるけど
ちなみにlua_Integerの実体ptrdiff_tは8バイトになってる
どこがおかしいのかわからん
整数も浮動小数点で計算するからだそうだ‥‥
64bit integerに対して64bit doubleじゃ精度足りないっての
パッチがあったからつっこんでみるが、ちゃんと動くか心配だ
816 :
804:2010/02/03(水) 21:57:40
>>805-
>>807 アドバイスありがとう。
luaL_loadbufferやluaL_loadstringを使うという発想は思いつきませんでした。
Luaスクリプトってバインダなしで使い物になるレベル?
何らかのバインダ及びグルーが無いと、スクリプトの意味が無い気が。
mingw ,gcc を前提としてるバインダが多い様な気がして
lua手を出しにくいのです。。。
lua51.libとlua5.1.libって何が違うんだろう
それは気のせいないし思い込みでは……
.so を makefile でつくる、という事例にちょくちょく
遭遇しまうまう・・・orz
バインダはLuaではなくバインダという言語である!!
$(CC) を $(CL) とか代えて、pkg-config はそのままでも
nmake -f makefile でビルドできるもんなんだろうか・・・
pkg-configはシェルスクリプトだからmsysなりcygwinなり要るだろ
nmakeには、一から書き直して食わしてる
必要なobjぐらいなら写せるだろ
それ全然lua関係ないじゃん
必要なc/cppファイルひろって Makefile 書き直すなり
Visual Studio でプロジェクトファイルつくるなりぐらいやりなされ。
そんな難しいもんじゃない。
>>828 こういう問題を回避するためにSquirrelのソースパッケージをCMake対応にして
フォーラムに投げてみたら、いらないって言われた……。
オレはCMakeで固まろうとした
luaのuserdataとlightuserdataの違いって
userdata
・lua側でアロケート
・lua側でデアロケート(GC)
・Cには参照のみが渡される
・Cからは寿命が分からない
lightuaserdata
・C側でアロケート
・C側でデアロケート
・luaには参照のみが渡される
・luaからは寿命が分からない
これ以外になんか有りますか?
それとluaとCでuserdata、lightuserdataの寿命を同期させる方法は有りますか?
meta tableの有無も違ってたかも
>>831 これは心の贅肉をそのまま箇条書きにしたみたいで面白いな
考え方としてはとりあえず
lightuserdataは無くても整数値で代用できる、と割り切ってしまうほうが簡単
そうすると、整数とuserdataを比較するのは無意味だとわかる
|Д゚)<バインダが面倒な人向けにいいもの置いておきますね
|Д゚)つ[AngelScript]
|ミ サッ [AngelScript]
//
/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ AngelScript!!
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
>>832,833
レスどうもです
メタテーブルの有無は重要ですね
いろいろいじってようやくユーザークラスをLuaに公開できるところまでこぎつけました
しかしlightuserdataは使い道がわからず・・・
lightuserdataはCからのポインタの入れ物として使うのが想定されているらしい。
lightuserdataは、スクリプトで操作したいクラスのインスタンスとか放り込むんじゃないの?
ゲームとかだとひとつのスクリプトで複数のオブジェクトを制御する必要があるし。
C++のオブジェクトとLuaのオブジェクトが混在するのか・・・
C++/CLIならもっとすごいことになるな
C++のオブジェクトをスクリプトで操作する感じかな。
例えばスクリプトで
SetSpeed(1,20)
とかいうような関数があった場合、C++側でlightuserdataを取り出し、
//lightuserdataからObjectのポインタを取り出す
Object *lpObject=(Object*)GetLightUserData(L);
//Objectを操作する
lpObject->SetSpeed(x,y);
って感じの処理をするグルー関数を用意する。
lightuserdataでC++/Luaのインスタンスを協調させてみようかと頑張ってるんだができないorz
userdataでやれば上手くいくんだけどlightuserdataのほうが軽いらしいし・・・
C++側で
tableを作る
tableにインスタンスへのポインタをlightuserdataで格納
tableに各種メソッドを格納(メソッドはself(第一引数)tableからインスタンスへのポインタを取り出してクラスのメソッドをコールする)
さらにtableを積んで__gcフィールドにデリータを格納
最初のテーブルにメタテーブルとして設定
最初のテーブルを返す
という感じでやってるんだけどLua側で__gcが呼ばれてくれない
mt = getmetatable、mt.__gc(hoge)とすればちゃんとデリータを呼んでくれるのに・・・
こっちがDLL
http://codepad.org/5CuryxGE こっちがLua
http://codepad.org/BON62sBh
userdataとlightuserdataは全く別物。用途が違う。
パソコンでできることがケータイではできないと嘆いているようなもんだぞ?
>>841 そういうことができなくなってる分軽いわけなんだが……
じゃあlightuserdataは何に使うんだろう
コールバック的な使い方でしょうか
だから主にC側で作ったインスタンス(のポインタ)の受け皿だって
>>844 てか、マニュアルにもCのポインタそのものだって書いてあるだろう。
Cでよくあるハンドルスタイルやコールバックスタイルの構造を直接扱うためにある。
例えば fopenの帰り値の FILE* を void* にキャストして lightuserdata として持ってそのまま使う。
処理する時には、必ずCの関数をいちいち呼び出すのを前提として、
「LUA側は持ってるだけで何もさわらないデータ構造」として準備されてる。
これの使い方が直感的にわからない人がいるってのが驚きだった^^;
わからない人というか、深読みする人もたまにいるな。
ひどくなると「それはただの××だよ」と言われると反論してくる。
「お前はそうやって分かったつもりになってるだけだ」とか。
lightuserdataはテーブルのキーとして使う。
自前のオブジェクトのアドレスや、OSから渡されるハンドルをキーにしてテーブルを参照すれば、同じアドレスやハンドルに同じuserdataを対応させることができる。
ちなみに、この時のテーブルはweak tableにしておくといい。
ということを初めて知った時は目から鱗だった。
何かLuaって面倒くさいな(´ω`)
ひたすら軽量さが売りの言語って感じだなあ。
ところで848のテクニック?のサンプルソースとかどっかでダウンロードできないかな?
>>841みたいにuserdataの方にクラスのインスタンスのポインタを格納して
Luaから呼ばれるC++側の関数で取り出して使ってるんだけど、
>>831 みるとuserdataはLua側でGCかかるの?
http://codepad.org/8Z7d8J62 うーんこんな感じですかね?
ポインタをキーにという発想はすごい便利そうな予感がしますね
しかしグルーコード内のエラー処理とかってどうすればいいんだろう
C++例外を投げるべきなのか、関数内でもみ消してlua_errorするべきなのか
>>852 「C++側」と「Lua側」をきっちりと分離したいんだな。
組み込み言語は、そういう幻想にうんざりしてる人のためにあるんだと思うけどな。
Luaって速度が同じぐらいで、文法が素直な組み込みスクリプトが作られたらあっという間に駆逐されそう
もともとマイナーな分野なのに亜流が既にいくつも出ていてそれができないってことは
実際のところLuaのバランスが優れているってことでしょ
罠を避けるのが上手い。
静的型 クラス メタプログラミング 並列処理 遅延評価 参照透明性 ・・・
文法重視で速度気にしてない人は squirrel 使ってるし普通に棲み分けになってんじゃね?
自分がLua選んだ理由は日本語の資料が一番多かったからだな。
次点の理由はスタティックリンクできたから。
文法が嫌いとかいうやつって、
自分の英語ができないのは分法を教えるからって口だろ
まぁ855の言うことが真ならSquirrelによってあっという間に駆逐されてるはずだな。
>>861 逆だよ。
文法ができないから英語できないんだよ。
>>863 >861が何を言ってるのか分かってるの?w
俺スクリプトをLuaのVM用のバイトコードにコンパイルすればいいじゃん
yieldをライブラリとして提供するのは実装の幅を狭めてると思う
はじめて日が浅いけど L とか -1 が乱舞する
C拡張に馴染む日はくるんだろうか俺・・・
>>347では速度がLuaより早いにも関わらず日本ではあまり使われていないGameMonkey。
ざっと見た感じは文法も特に変な感じじゃないから、使いやすそうな感じはするんだけどね。
日 本 語 資 料 皆 無 だ け ど な
>日本語資料
月並みなことを言うと
因果関係ではなく相関関係ならあるかもしれない
Pawnも文法はシンプルに見えるが流行らないのはやっぱり何かが足りないんだろうな
足りないというよりはLuaの情報量や実績やユーザ数を
代えられるほどのものではないということだろう
Luaってゲーム以外で使われてますか?
apacheとかwiresharkの拡張に地味に使われてたりする
もともとゲーム向けってわけじゃないしね
Schemeが以外と流行らなかったな
>>874 tokyotyrantでLua知ったよ
lua5.1のDLL版を使ってるんですが、グルーコードの呼び出し規約は__cdeclでいいんでしょうか?
それとも__stdcallにしたほうがいいですか?
>>881 たぶん__cdeclだけど仮に間違っていたとしても
name manglingの違いで簡単に見分けられるような気がする
DLLを使う側の言語の規約に合わせるんだ
Cでしか使わないのなら目的にもよるがどっちでもいいと思うがな
>>882 >>883 thxです
さっきluaのヘッダ見たところ呼び出し規約は書いてなかったので多分C言語デフォルトのcdeclでよさそうですね
Programming in Lua携帯するにはしんどいな
PDFで売ってくれりゃいいのに
ばらして持ち歩けよ
組み込んで歩けよ
lua で連想配列形式のテーブルの要素数を調べる方法ある?
配列形式だったら #tbl で、出来るみたいだけど・・・。
userdata型に型情報を与えて
BOOL isHoge(lua_State *, index);
の形で使いたいんですが
luaのほうで予め提供されてる方法はありますか?
それとも、自分で独自にマップするものなんでしょうか?
nextだとnilが設定されたフィールドでハマるので
pairsを使った方がいいんじゃまいか
luabashがすばらしすぎる。
bashにluaインタプリタ機能追加してbashの拡張ができる&
bashが生きている間luaインタプリタも生きているのでlua変数を
保持し続ける。これ重要。
ファイル操作が多いとやっぱりシェルスクリプトが楽だけど
コマンド間の結果の連携を環境変数orファイル書き出しで
実装するのはかったるい時に大活躍な予感。
組み込み用途以外でLua使おうなんて思わんな
汎用的に使うには標準ライブラリ貧弱だし
thenとかdoとか書くの面倒だし
低レベルな質問で申し訳ないのですが
wxFormBuilderから追加したイベント宣言を定義するのはどうしたらいいのでしょうか?
Generateで書き出した.hファイルにある
virtual void OnButton1( wxCommandEvent& event ){ event.Skip(); }
の{ event.Skip(); }をコメントアウトすることで
出来なくも無いのですが
ヘッダファイルの行頭に
// PLEASE DO "NOT" EDIT THIS FILE!
とありますし後々修正があったときに困りそうです。
// Virtual event handlers, overide them in your derived class
このコメントが鍵のような気もするのですが正直意味が分かりません・・・
誤爆ってる、失礼しました
896 :
デフォルトの名無しさん:2010/02/14(日) 11:30:21
/ヽ /ヽ
':' ゙''" `':,
ミ ・ω・ ;,
:; . っ ,つ Lua!
`:; ,;'
`( /'"`∪
自作型で__gcでC側のリソースを開放してるんだが
__gcをうっかり書き換えてしまわないように
メタテーブルを隠蔽あるいは変更不可にすることはできるだろうか?
__gcということはユーザーデータか。ならばスクリプト側からはメタテーブル自体の変更はできない。
さらにメタテーブルに__metatableを追加しておけば隠蔽も可能になり、メタメソッドの変更、追加を防止できる。
ただしこれらはC側やdebugライブラリには効果がないし、制限する手段も(多分)無い。
C++でRAIIをうっかり忘れてしまうレベルだ
初期化以外でsetmetatable()を使うのか?
>>898 __metatableというのがあったのか
というかユーザデータはもともと変えられないって知らなかったorz
レスthxでした
>>899 metatableをうっかり書き換えるのはクライアントで、クラスじゃない
RAIIをうっかり忘れるのとmetatableをうっかり書き換えるのは別次元の問題
そのクライアントのついうっかりを封印して出来なくしてしまえれば安心して寝れる
>>900 なにが別次元だ
ファイルを読んだり書いたりdllをロードしたりする、普通の言語じゃないか
902 :
デフォルトの名無しさん:2010/02/19(金) 02:15:03
(◞≼◉ื≽◟◞౪◟,◞≼◉ื≽◟ )
903 :
デフォルトの名無しさん:2010/02/19(金) 20:31:33
∩_
〈〈〈 ヽ
〈⊃ }
∩___∩ | |
| ノ ヽ ! !
/ ● ● | /
| ( _●_) ミ/ Lua!!
彡、 |∪| /
/ __ ヽノ /
(___)
904 :
デフォルトの名無しさん:2010/02/21(日) 15:46:38
(´・ω・`)
LuaInterface 使ってる?
(`・ω・´)
ルアのmodule(name)のnameが被ったらどうなるの?
name ru houkei
local foo = function ()
local c = 0
return function ()
c = c + 1
return c
end
end
f1 = foo()
f2 = foo()
この場合f1とf2に渡される情報はcと関数の参照だけ?
それともcを含めて関数まるごとコピーされちゃったりする?
クロージャとしては別々だけどコードはもちろん共有
UpValとProtoの参照
それとenvの参照
なんかロベルトさんがLua5.2のグローバルとか環境まわりの仕様変え始めたような。lua-l参照。
バージョンアップは無能レベルに到達するまで止まらない
でも5.2はまだリリースされてないから止めようと思えば止められるけど
イエルサリムスキー教授の翻訳本にuserdataのメタテーブルはLuaからCを出しぬいて手出しすることはできないから安全、みたいなことが書いてあるんだけど
ud = create_ud()
getmetatable(ud).__gc = nil
のようにごくごく普通にアクセスできるように思えるんですが・・・これは本の間違いじゃないですかね?
>>914 保守的GCって知ってるか
解放すべきかどうか疑わしいときは、解放しないほうが安全
>>915 今ググって知りました
しかし、保守的GCの話は
>>914の話とは関係ないように思えるのですが、実は何か関係があるんでしょうか?
>>914 userdataはsetmetatableはできないがgetmetatableはできる。
よってその例のようなアクセスはできる。
禁止したいなら__metatableを適切な値に設定するといい。
安全とは禁止することと見つけたり・・・
coroutineの利点がいまいちわかんね
state:update()の戦略の方がコスト低いしわかりやすいと思うんだが
利点がわかんないなら
君には不要って事なんだよ
無理して使う必要ない
自分の理解している範囲の外に利点があることだって普通にあると思うけど。
複数回に分けて動かさないといけない処理を継続的な処理として実装可能になる。
結果として同期処理の不要な軽量スレッド的な実装ができるようになる。
コルーチンは、ゲームで「アイテムを取った直後に一定時間白くなる」という処理を書くときとか便利だな。
>>921 むちゃくちゃな論理展開わろた^^
>>922 ですよね
>>923 複数回に渡って処理を分割するのってstateパターンでも普通にできることだと思う
コルーチンじゃないとどうしてもできない、あるいは明らかに優れてるっていう要素が自分には見えないんすよね
Stateパターンが「普通」?
Stateパターンのような回りくどいことをしないといけないのがおかしいとは思わない?
>>925 どうしてもできないから、で使ってる人はいないよ。
機能的にすぐれてる部分は全く無い。ぶっちゃけコルーチンも、
全状態保持を言語側が担ってくれてるだけのおおがかりな state だから。
State パターンで何個もあったり、さらには個数が変動したりするオブジェクトの複雑な
挙動のからみあいとか、考えたくもないけど、コルーチンだとわりとすっきり書ける。
最初に仕様にあわせて組んでいくだけなら State でもいいんだけど、
後から見直す時とか、細かい修正に対応する時とか、コルーチンのが圧倒的に読みやすいし記述も楽。
遷移図をそのまま if や while やら使って書き起こすだけだけになるからね
コルーチン切り替えのコストは、固定で組まれた State 切り替えよりかなり大きくなってしまうけど、
表記の楽さがそれを上回る、と判断した人が使うもの。あらゆる状態遷移を頭の中だけでさくさくくめてしまえるので、
State のが簡単だよって言う人は知り合いにもいるけど、それ、凡人には無理ですからー
そもそもオブジェクト指向におけるデザインパターンというのは、
言語側でサポートしきれていないニーズを無理やり克服するためのバッドノウハウのようなものだ。
>>925 例えばFizzBuzzの通常版が既に完成していて
function fizzbuzz(n, print) for i = 1, n do ... print("FizzBuzz") ... end
後になってState版が必要になったときに使う。
co = coroutine.create(function() fizzbuzz(100, coroutine.yield) end)
コルーチンの便利さは、記述が簡単になるって点だな。
coroutine.create(function (a, b) showMessageDialog(a, b, "Hello! World!") showMessageDialog(a, b "byebye")end) とか
http://lua-users.org/lists/lua-l/2009-11/msg00214.html >Run Lua in a separate thread and somehow stop it if it takes too long. とか
おつかい行って来てよ、と丸投げしまう簡便さ
でもちゃんと帰ってこれるのかな・・・的不安
>>930 コルーチンは記述が簡単なだけに非同期対応が面倒に感じるんだよな
>>924みたいな単純な処理ですら、アイテムを連続で取るとキャラが白くならなかったり、
直後にゲームクリアしてもキャラが白いままだったり、直後にキャラが変身するとハングしたりとか
Stateパターンならちゃんと回避できる人がコルーチンだと回避し忘れるのはありがちなこと
(何言ってんだコイツという眼差し)
>>932 他の人はコードで例を示しているんだから、君もコルーチンよりStateパターンが明らからに優れているという例をコードで示したら?
そうでないと、ただの知ったか君と区別つかないよ
935 :
デフォルトの名無しさん:2010/03/08(月) 23:32:20
>920の「state:update()の戦略」が良く判らん……トランザクションのこと?
Stateパターンを理解してりゃ、そこは判らない文脈じゃないと思うけど。
switch(state) { case WALK: … case WAIT: … case ATTACK: … }
をちょっと格好付けただけ
コルーチンと比較されるような使い方の場合は特にメリットもない
>>936 ハイハイ、逃げないでコードで示してね
それともやっぱり、知ったか君だったのw
そもそもコルーチンと組み込み系言語って何か関係あるの?
このスレで話題になることが多い lua と squirrel が搭載している、以上のものではないかな
他何が搭載してたっけ
よくわかんないけど状態遷移するたびにStateインスタンスを破棄、生成してれば
切り替わるタイミングが明確になって後片付けとかが確実になるとかそういうことなんじゃないの
ちなみに型が厳密な言語でコルーチンを扱うと複雑になるか、制約が大きくなる
どのみちオブジェクト指向が好きならJavaとかC#とかで正解なんだよ
小規模だとコルーチンのがキモチイイけど、遷移が複雑になってくると機械的に遷移図からコードに直せるステートのほうがいいかなって感じる
画面遷移処理とか、ADV的な演出の逐次制御とかはコルーチンがいいかんじにはまるね
コルーチン=呼び出すと区切りの部分まで実行してくれる関数オブジェクト
みたいな感じで理解してるな。
Luaの場合、coroutine.resumeで呼び出すと、次のcoroutine.yieldの部分まで実行してくれる。
10回繰り返し、という処理を、途中でイベントを受け取ったりしながらでも、
for (i = 0; i < 10; ++i) ですらっと書けるのがコルーチン。
cでcoroutineを自作しようと思ったら難しかったでござる。
奇怪で制約の多いマクロを組むか
sjljでコンテキストを書き換えるかの二択だな
その話題までいくともう組み込み言語まったく関係ないな。
マルチスレッドで済む処理まで凝るーチン
ルアってなんであんなテーブルマンセーなの?
シンプルだからじゃない?
このテーブルひとつで普通の配列も連想配列も
オブジェクトまでも扱えるから...
でも無理やりオブジェクト指向マネるくらいなら
ほかのスクリプト言語を検討するよ
Luaは初心者向けに見えて
実は玄人向け
違うな
M向け
マニアとマゾ
AngelScript|Д`)<呼ばれたので飛んできました
GameMonkey|Д`)<俺もー
CRIScript|Д`)<俺もー
956 :
デフォルトの名無しさん:2010/03/10(水) 18:51:20
\ l´⌒\⌒\ \\ \
\ ヽ ) ) \\ \\
( \ \∩___∩ \\
\ \ ⌒⌒| ノ ヽ \\
\ \ / ● ● ト、\ \\\
\ Y | ( _●_) ミ\ \\\
\ / 彡、_ |∪| ノ \ \\\
(____)―ヽノ' ヽ  ̄ ̄ ヽ\\
\, j l l .l }
Lua! l (_ノノノノ
過疎
コルーチンのAAください
959 :
デフォルトの名無しさん:2010/03/14(日) 19:23:00
●)(●):::\ .\ ::::::::::::::::::::::::::::::::::::::::::::::::
(__人__)./ ̄ ̄ ̄\:::::::::::::::::::::: / ̄ ̄ ̄\ コルーチン
::` ⌒´./ ⌒ ⌒ ヽ::::::::::::::: / ⌒ ⌒ ヽ
::::: ./ (●)(●) |:::::::::::: / ( ●)(●) |
\ | (__ / ̄ ̄ ̄\ | (__人__) } コルーチン
\/、. / ⌒ ⌒ ヽ/、.. ` ⌒´ .ヽ
\ / (●)(●) | |
\ \ | (__ / ̄ ̄ ̄\. | /
|\ \/、. / ⌒ ⌒ ヽ──┐ |丿 コルーチン
| .\ \ / (●)(●) |──┤ |
| |\ \ | (__人__) }──┤ |
| | \ \/、. ` ⌒´ ヽ\
/ヽ /ヽ
':' ゙''" `':,
ミ ・ω・ ;,
:; . っ ,つLua
`:; ,;'
`( /'"`∪
lldebugみたいな感じのデバッガって、他のスクリプト言語にあるんだろうか?
JavaやPythonとかだと余裕でありそうだけど、SquirrelとかAngelScriptとかにはなさそうだ…
>>961 SquirrelはVisual Studioのデバッガが普通に使えますが何か?
>>962 マジで!?
VS上でスクリプトにブレークポイント付けたり、スクリプト内の変数見たりできるの?
やり方教えて。
965 :
デフォルトの名無しさん:2010/03/20(土) 00:16:05
AngelScript用の何かいいエディターない?
入力補間とキーワードの強調が出来ると嬉しい。
とりあえすSciTE使ってみたけど引数のヒントくれなかったり色々と書きにくい。。
むしろSciTEで入力補助がある方が驚きだな。
まあそんなマイナー言語、カスタマイズの利くエディタ側の機能で何とかするしかないだろ。
>>967 c++と構文同じだから単純にc++の編集機能使ってるだけなんだ。
無いよりはましくらい。
>>964 遅レスだが、すごいのがあるんだな。
AngelScript用のもあったりするんだろうか。
angelscriptってどうなの
>>970 文法がC/C++やC#そっくり、C++とのバインドが簡単、OOPも一応できる。
こんな感じか?
ただ、スクリプトでメイン部分を記述する用途には向いてないと思う。
∧_∧ / ̄ ̄ ̄ ̄
( ・∀・) < Lua!!
⊂/ 9) \____
q( /
> >
974 :
デフォルトの名無しさん:2010/03/25(木) 03:26:03
V V
(´・ω・`) うさちゃんピース
CRI Scriptの公式サイトなくなってる?
>>975 中の人がAppleに転職したから、メンテ出来ないんで閉じたんじゃない?
Squirrelやってみたいんだが情報が少なすぎて不安になるな
v8についての質問なんだけど
組み込んでjavascriptから呼べるようにした組み込み関数なりクラスを
javascript上の名前空間に押し込める方法ってない?
もちろんjavascriptに名前空間そのものは無いので、オブジェクトのプロパティとして表現するんだけど
var x = hoge_ns.apple
みたいに呼び出したい。
javascript上で事前にラップする方法は考えたけど
元の名前が無効になるわけじゃないので、なんだかな。
>>978 日本語でのフォーラム的なものはちょっと欲しいかなーと思うことはあるな。誰か設置してくれたら使うよ。
>>979 var x = hoge_ns.apple
じゃなくて
var x = new hoge_ns.apple
ですね。訂正します。
javascriptは楽でいいよ。
遅いからゲームのAIとか記述するのには全く向いてないが。
\ l´⌒\⌒\ \\ \
\ ヽ ) ) \\ \\
( \ \∩___∩ \\
\ \ ⌒⌒| ノ ヽ \\
\ \ / ● ● ト、\ \\\
\ Y | ( _●_) ミ\ \\\
\ / 彡、_ |∪| ノ \ \\\
(____)―ヽノ' ヽ  ̄ ̄ ヽ\\
\, j l l .l }
Lua! l (_ノノノノ
javascript速いでしょ
最もパフォーマンスの最適化が研究されてる言語じゃね
その速さはどの言語が担保してるのかな
>>983 言語仕様上は高速化が難しいけど頑張って最適化してるってのが現状じゃなかったっけ?
いや、jsは仕様が軟体動物っぽいから遅いと思うよ、タコとかイカとか。
Luaはキビキビ動くゴキブリ。
話がズレたけど、C基準で
Lua = 10C
javascript = 100C
くらいの違いはある気がする。
アレだ、誰か測ってくれ。
javascriptはエンジン変わると、速さがえらい違うくね?
>>986 言いたいことは分からなくもないが例えが嫌すぎるw
>>988 へー
じゃばすくりぷと思ったより速いな
LuaJITすげえ
最近のJavaScriptはコードの使われ方に応じたJITコンパイルとかやるんでしょ