5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

【Lua】組み込み系言語総合 その2【Squirrel】

1 :デフォルトの名無しさん:2009/05/25(月) 09:11:41
LuaやSquirrelなどアプリケーションへの組み込み用途で
使われるプログラミング言語についてのスレッドです
まとめwiki(なにか質問する前に必ずみること!)
http://wikiwiki.jp/lua/

その他の参考URLは>2から

■前スレ
【Lua】組み込み系言語総合【Squirrel】
http://pc12.2ch.net/test/read.cgi/tech/1205208141/

■過去スレ
その3 http://pc11.2ch.net/test/read.cgi/tech/1160799232/
その2 http://pc8.2ch.net/test/read.cgi/tech/1063711237/
その1 http://pc5.2ch.net/tech/kako/1034/10341/1034182349.html

2 :デフォルトの名無しさん:2009/05/25(月) 09:15:36
■関連してるかもしれないスレ
Io Language
http://pc11.2ch.net/test/read.cgi/tech/1201100624/
2 part forth
http://pc11.2ch.net/test/read.cgi/tech/1073673931/
●●●●TCL/TKなら俺に聞け 2●●●●
http://pc11.2ch.net/test/read.cgi/tech/1177998764/
ECMAScript デス 3
http://pc11.2ch.net/test/read.cgi/tech/1190160481/
各種ライブラリ紹介スレ2(ゲ制作)
http://pc11.2ch.net/test/read.cgi/gamedev/1177886529/
【Perl,PHP】LLバトルロワイヤル5【Ruby,Python】
http://pc12.2ch.net/test/read.cgi/tech/1238720336/
「コンパイラ・スクリプトエンジン」相談室13
http://pc12.2ch.net/test/read.cgi/tech/1233143342/
Garbage Collection (GC)について語るスレ
http://pc11.2ch.net/test/read.cgi/tech/1141646850/

3 :デフォルトの名無しさん:2009/05/25(月) 09:17:28
■参考URL

■Lua
ttp://www.lua.org/ (本家)
ttp://lua-users.org/ (lua-users)
ttp://luaforge.net/ (LuaForge)
ttp://sugarpot.sakura.ne.jp/yuno/html/lua51_manual_ja.html(5.1マニュアル和訳)
Lua言語の紹介
ttp://staff.aist.go.jp/yutaka.ueno/lua/docsjp.html
入門Luaプログラミング
ttp://www.amazon.co.jp/dp/4797342722/

■Squirrel
ttp://www.squirrel-lang.org/ (本家)
ttp://sourceforge.net/projects/squirrel/
ttp://sourceforge.net/projects/sqplus/ (SqPlus)
ttp://sourceforge.net/projects/squirrelsh/ (Squirrel Shell)
ttp://wikiwiki.jp/lua/?Squirrel_Lang%2Ftoc(wiki内2.1マニュアル和訳)

■Xtal(ゲーム向け。スタックを意識しなくていい?)
ttp://d.hatena.ne.jp/xtalco/
ttp://code.google.com/p/xtal-language/
ttp://blog.livedoor.jp/dankogai/archives/50836939.html

4 :デフォルトの名無しさん:2009/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(だれも使ってなさそうな、組み込み言語)
ttp://www.compuphase.com/pawn/pawn.htm
NullLogic Embedded Scripting Language
ttp://sourceforge.net/projects/nesla/

※テンプレ以上※

5 :デフォルトの名無しさん:2009/05/25(月) 09:49:57
1乙

6 :デフォルトの名無しさん:2009/05/25(月) 13:22:42
次から AngelScript も足してあげていいんじゃないかとちょっとオモタ

7 :デフォルトの名無しさん:2009/05/25(月) 13:27:34
■AngelScript
ttp://www.angelcode.com/angelscript/

まとめwikiにテンプレのページ作ったほうがいいかな。

8 :デフォルトの名無しさん:2009/05/25(月) 22:43:44
luaでlua_call する前に関数と引数をプッシュしますよね。そういう作業の前には
かならずlua_settop(L, 0)したほうがいいんですか?
lua処理の前後でちゃんとスタック深さが一致するようにプログラムを心がけていれば
不要なものなのでしょうか。
何かする前に必ずlua_settop(L, 0)するクセを付けておいたほうがいいのか、
それともそれはCでグローバル変数を必ず=NULLや=0で初期化しないときがすまないような、
ちょっとできなそうな人がやることなのでしょうか。プロフェッショナルはlua_settop(0)
なんていちいちやりませんか?


9 :デフォルトの名無しさん:2009/05/25(月) 23:22:12
>>8
「かならず」などと言う杓子定規なスタイルで
プロフェッショナルになれるとは思えない。常識的に考えて。

10 :デフォルトの名無しさん:2009/05/25(月) 23:56:40
新しいクマスレはここですか?

11 :デフォルトの名無しさん:2009/05/26(火) 01:49:16
いいえ、ケフィアです


12 :デフォルトの名無しさん:2009/05/26(火) 07:32:04
>>2
このスレは既に鯖移転してる物が含まれてるぞ。
プログラム板はpc12鯖だぞ。

13 :デフォルトの名無しさん:2009/05/26(火) 09:04:08
>>8
場合によって異なる。バインダの一部として実装するときは
settopによる副作用(必要だった値がスタックから蒸発するなど)の方が心配なので、
それ無しでも正しく動作するよう慎重に実装するべき。

一方、本体側からスクリプト側のコードを呼び出す際は大抵は戻り値は不要なので
削除しても差し支えない。だからsettopを呼び出す方法もアリ。

もちろん、エラーや例外がスタックに入っている場合もあるのでその対応は必要。

同じ仮想スタック型言語であるSquirrelでもまったく同じことが言えるだろう。

14 :デフォルトの名無しさん:2009/05/26(火) 09:10:19
>>7
公式サイトへのリンクだけでもいいから作ってあげてください( ´・ω・`)

15 :デフォルトの名無しさん:2009/05/26(火) 12:22:10
luaでhoge=0xFF8888FF のあとに return hogeと書いてある関数があって、
この戻り値をlua_tostring() でとったときに0xff8888ffの10進数表記である
"4287138047"が得られることを期待していたのですが、
なぜか1インクリメントされた"4287138048"が入ってきてしまいます。
しかもコンパイル→実行しなおすとちゃんと "4287138047" が入ってたり、
あれ?と思ってもう一度やると "4287138048" だったりで、よくわかりません。
この現象についてなにか心当たりありますか?



16 :デフォルトの名無しさん:2009/05/26(火) 21:07:59
luaスクリプト内をステップ実行して、挙動を眺めれば済む話じゃないか。

17 :デフォルトの名無しさん:2009/05/28(木) 15:31:55
バグです

18 :デフォルトの名無しさん:2009/05/28(木) 15:54:05
doubleの丸めかね?

19 :デフォルトの名無しさん:2009/05/29(金) 00:19:33
>>16見て、GUIのデバッガ欲しいよなーって思って検索してたんだけど、
これって使ってみた人いる?

http://wikiwiki.jp/lldebug/

20 :デフォルトの名無しさん:2009/06/03(水) 22:12:04
SqPlusで複数VMが扱えなくて悩んでたのですが、
もしかしてSquirrelって基本的にVM一個だけ作るのが普通なの?


21 :デフォルトの名無しさん:2009/06/03(水) 22:25:58
>>20
そんなこたー無い。sqplus が設計古いだけ

でも、実際問題として、VM複数扱うと、初期化処理とかめんどくさくね?
実行処理を複数保留するだけならスレッドつかえばいいわけで。


22 :デフォルトの名無しさん:2009/06/03(水) 22:28:48
>>20
オレも以前そう思ってざっとソースを見たが、
VMが複数インスタンス動いたときに
static変数で干渉しそうなところは
エラーメッセージ関係くらいだった。
グローバル変数は探しにくいので確証は無い。

実際のところ、Tclなんかと違って複数VM間の通信手段が限られてるから
あまり使い勝手はよくないと思うよ。

23 :デフォルトの名無しさん:2009/06/04(木) 02:00:12
>>20の言う複数VMって、STGでたとえると、
(1)敵1匹ずつにVMを持たせて個別に処理をさせる
(2)使う関数が異なる、背景のみの処理をするVMと、敵の出現パターンを管理するVMとを同時に動かす
のどっち?

24 :デフォルトの名無しさん:2009/06/04(木) 05:22:10
sq_threadで派生VMを作ってスレッドで回したことはあったけど、
独立した複数VMを動かすのはちょっと用途が思いつかないなぁ
是非>>20のSquirrelの用途が知りたいなぁ。ゲーム以外なの?

25 :デフォルトの名無しさん:2009/06/04(木) 08:10:20
23の2かな。
同じプログラムの中に、ゲーム用と3Dモデル変換などのツール用の2系統あって、
混在して使うことがないので分けたいなと思いました。


26 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/06/05(金) 02:32:54
>>26
SqPlusは変というか、VM本体に対して余計なことをしている。
new()で作り捨てたクラスにVMのハンドルを管理させるようなことをしてるから、
main()関数を抜けた後でしかSquirrelの開放処理が行われなくなる。
こんな動作だと、フレームワーク解放前にリリースしないといけないC++側のオブジェクトの開放ができなくなる。
既に指摘はしてるんだが、開発者はその重要性がわかってないようだ。
一応複数のVMの対応はされてるように見えるが、実際に動かしてみないとなんとも。

scratはきっちり書いてあるんでなく、なにもやってないだけ。
こっちは試しに動かしてみたが、まだまだ完成度が足りない。
指摘したら開発者黙り込んじゃった。
SQBindのほうがややましかな。ちょこちょこといじれば何とか使えるレベル。

28 :デフォルトの名無しさん:2009/06/05(金) 03:18:56
fork しちゃいなよ

29 :デフォルトの名無しさん:2009/06/05(金) 03:20:24
Sq++か

30 :デフォルトの名無しさん:2009/06/05(金) 03:42:02
>>27
ああ、なにもやってないの重要というか、オブジェクト保持用のクラスは明示的に
VM 指定の口をもってて取り回しするように書かれてるから、これなら完全に
ユーザの管理下におけるね、と思ったんだ。

SQPlus のほうはいきなり中の見えないとこで VM 管理してるグローバルな変数を
呼び出したりしてるから、いろいろ切り替えたりいじったりしてるうちに間違いなく
破綻すると思う。切り替え処理がグローバル変数に代入とか怖すぎる。

まあ、実はぱっと全体眺めただけで全然使ってみてはないんだけどね > sqrat
とりあえずあのメンバ変数の処理機構はいろいろ難ありだなーと思う。
あとインスタンス返す処理あたりもなんか微妙

sqbind はぱっとみ泥くさかったのであんままじめに見てない

31 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/06/05(金) 07:12:40
>>32
オレの場合、setter/getterは原則用意しない。
メンバ変数のみのstruct的なもの、メソッドのみのclass的なものに大抵は分かれる。
その説明だとC++メソッドをどう登録するかの説明が無いみたいなんだけど……?

それから、SqBindの場合、_get/_setはバインドしたメンバが無い場合は
キャンセルされてSquirrel側に制御が戻る。
だからバインドした後でSquirrel側から登録したものを呼び出したり(これは確認)、
継承したりも有効(これはたぶん)

オレはバインドされたC++側のインターフェイスの固定さ加減を自分で信用してないので、
バインドしたSquirrelクラスをさらに継承したりはしないようにしている。
そうするときは包含にするね。

そういや、Squirrelはプロパティがほしいかも。

34 :デフォルトの名無しさん:2009/06/05(金) 10:34:09
何かややこしそうなので俺はAngelScriptを使うぜ!

35 :デフォルトの名無しさん:2009/06/05(金) 11:50:44
実際ややこしいだろ
自動生成したコードを手動でデバッグするんだからな

36 :デフォルトの名無しさん:2009/06/05(金) 12:15:10
あー、つまり
ボトルネックじゃない所を自動化しちゃってる可能性もあるわけだ。

37 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/06/05(金) 13:14:13
ボトルネックじゃないところを自動化してもらえるんなら大いに結構じゃないか。

39 :デフォルトの名無しさん:2009/06/05(金) 13:47:55
>>37
あれ? すると、ちょっと解せない動作があるな。
C++側で定義したPointクラスをSquirrelにバインドしているんだが
このインスタンスに対する加算を
function Point::_add(point)
の形でSquirrelスクリプトの中で追加登録している。
この状態でインスタンスに対して加算を行われると、いったんSqBindのgetterを呼び出して失敗してから
_addが呼ばれているように見えるんだな。
メタメソッドは元から通常のメンバ・メソッドとは違う扱いになっているからそれでかなぁ。
# 例えばインスタンスに対してforeachをかけても登録したメタメソッドを検出できない。

40 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/06/05(金) 15:57:59
>>40
スクリプト言語的にはメタメソッドも通常のメンバのように見えているべきなんだけど、
おそらく動作効率上の問題でそうなっているんだろうね。
メタメソッドの存在チェックはAPIが存在しないかもしれない。

Sqratがちょうどそんな実装で、バインドしたメンバの一覧に_getで呼び出されたメンバ名が存在しない場合、
エラーを返さずに何もしないものだから、
Squirrelインタプリタは返ってきたnullに対してメタメソッドの呼び出しをかけようとして失敗してる、んだったかな。
とにかくバインダ側で登録する_getは、管轄外メタメソッド呼び出しに対してはfalseまたは例外を返してあげないといけない。

Squirrelインタプリタの実装側ももうちょっとやりようがありそうな気がするけどね。

42 :デフォルトの名無しさん:2009/06/10(水) 14:06:39
androidでlua使える
http://code.google.com/p/android-scripting/

43 :デフォルトの名無しさん:2009/06/11(木) 00:03:37
久しぶりにRSS更新キターと思ったらそのニュースでちょとガッカリ。

44 :デフォルトの名無しさん:2009/06/11(木) 00:14:17
Google AndroidはカスタマイズされたLinuxそのものなんだから、
元から使えて当たり前だもんなぁ。

45 :デフォルトの名無しさん:2009/06/11(木) 04:03:51
Cにさ、lua 組み込んでるとさ、luaのソースみたときに、どの識別子が
Cから参照されていて、どれがローカルだけで使用されているのかわからなくなる場合があるよね。
命名規則とか、やってる?

一応、Cから呼ばれる関数と変数名は全て __ で始まるようにしてる。
でも大文字で始まっているのが全てCから参照される識別子 って規則の方がほうが
わかりやすいのかな。どうだろう。 __ で始まるのは、間違いが無い気がする。
大文字で始める識別子って、けっこううっかりつけそうな気がする

46 :デフォルトの名無しさん:2009/06/11(木) 08:39:16
>>45
local宣言しないとローカルにならないし
requireもあるから問題無いよ

47 :デフォルトの名無しさん:2009/06/11(木) 13:06:52
>>46
それでは45に対する答えになってないだろ。
答えは、「区別する必要はない」だな。
後始末が必要ならファイナライザでも書いてあげれば済むことだ。

48 :デフォルトの名無しさん:2009/06/11(木) 23:07:53
馬鹿っぽいこときくかも知れないけど
C言語レベルのプリプロセッサのライブラリってあるの?
軽量スクリプト言語の、さらに前処理用。
自作しろといわれりゃ相応の時間をかければ作れそうだけど、
こういう泥臭いのは必要な人は自分で作るのかなあ。

49 :デフォルトの名無しさん:2009/06/11(木) 23:18:36
>>48
CPP32ってC/C++プリプロセッサがVectorにあるよ。
あとboost::waveとか。

50 :デフォルトの名無しさん:2009/06/11(木) 23:22:52
ttp://spirit.sourceforge.net/repository/applications/wave.html
このへん? ライセンスは boost


51 :48:2009/06/11(木) 23:33:12
どうもありがとう。見てみます

52 :デフォルトの名無しさん:2009/06/12(金) 03:19:25
プリプロセッサはなぁ……。
有用さは認めるし、実際プリプロセッサを活用したゲームの処理系は見たことあるわけだが、
結局ソースコードが爆発してコンパイラ・インタプリタ側に負担がかかるのが落ちなので、
オレはあまり賛成はしかねる。

C++とC#のビルド速度の差を思うとな。

53 :デフォルトの名無しさん:2009/06/12(金) 10:40:09
あらかじめプリプロセッサを通してスクリプトを変換し、それをプログラムに読み込ませるという手もあるよ。
ただ、Luaでそれやるとコンパイルエラー出まくりだったと思う。
AngelScriptは問題なし、Squirrelもたぶん問題ないと思う。

ただ、外部スクリプトであったらいいなと思うプリプロセッサの機能は#includeだけのような気がする。

54 :デフォルトの名無しさん:2009/06/12(金) 19:42:57
lua でソース分割したいとき(というよりも、ソースを複数のluaスクリプトで共有したいとき)
ってどうすればいいの?
Luaファイルをロードしてライブラリとして登録みたいな関数がある?

55 :デフォルトの名無しさん:2009/06/13(土) 01:09:49
マクロプロセッサといえばm4

>>54
requireかdofileじゃだめ?

56 :デフォルトの名無しさん:2009/06/15(月) 19:46:26
Luaに名前空間ってあるんですか?
同名関数が別ファイルにあったばあいどうするんですか?

57 :デフォルトの名無しさん:2009/06/15(月) 21:48:03
あまりに糞なライブラリなら捨てて再構築するのもいいんじゃないか。
軽量スクリプト言語なんだし


58 :デフォルトの名無しさん:2009/06/15(月) 22:05:45
>>56
グローバル変数を参照または代入する際に呼ばれるメタメソッドを設定できるよ

59 :デフォルトの名無しさん:2009/06/16(火) 19:09:48
>>58
同名関数が有った場合の挙動の設定ができる、
という意味でしょうか。

同名関数のあるLuaファイル2つを
C++側で開いた時、どうしても呼び分けられない・・・・

60 :デフォルトの名無しさん:2009/06/16(火) 20:21:26
>>59
というか、LuaもSquirrelも関数はファーストクラスオブジェクトなんだから、
2回定義したら最初のやつは消えちゃうでしょ?

オーバーロードとかはそのままではできんわなー

61 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/06/16(火) 23:17:00
>>60-61
ありがとうございます!
成功しました!

63 :デフォルトの名無しさん:2009/06/24(水) 09:22:21
LuaってluaL_loadbufferして
lua_pcallしたあと、

luaL_loadbufferのバッファって捨てられないんかな?

loadbufferしてpcallすると
実際のバイナリサイズの二倍くらいメモリを食っているようなんで

pcall後のloadbufferのチャンクは
感覚的にはいらないように感じるんだけど……。


64 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/06/25(木) 11:58:28
>>64
v = "\1"

66 :デフォルトの名無しさん:2009/06/25(木) 12:01:56
C# にIronPythonを組み込んで色々といじってみてるところなんだが、
C#のクラスをPython側で使うときの便利さが神すぎるな。

なんせ、バインダ用のコードなんて一行も書く必要なく、
Python側で通常のモジュールのようにimportするだけで普通に作ったり殺したりできるんだから。
(当然ながら触れるのはC#側でpublicに指定している部分のみ)
いやはや。.NET Frameworkはすばらしい。

反面、Python側のコードをC#側から呼び出すのはちょっとしたおまじないが必要だが、
これはまあ型のある言語から型の無い言語の機能を呼び出すのに手間がかかるのはしょうがないかなぁ。

67 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/06/25(木) 12:15:48
>>65
ありがとうございます。なるほど、たしかにそれだと0x01が書き出されました。

69 :デフォルトの名無しさん:2009/06/25(木) 12:18:33
>>67
ファイルIOくらい、簡単に自作してしまえばどう?
Squirrelの標準ライブラリはバイナリファイルしかろくに読めない代物なので、
通常の読み書きは自作のクラスを使ってるよ。
C/C++で書いてバインドしてしまえばいい。

70 :デフォルトの名無しさん:2009/06/25(木) 13:18:56
>>69
64です。
そうですね、頑張ってみる事にします。
まだlua始めて間もないので、もう少し慣れてからですかね。
アドバイスありがとうございます。

71 :デフォルトの名無しさん:2009/06/26(金) 06:38:29
>>66
.netのいいところは、同じ.netの言語の相互運用が従来の組み込み言語より格段に楽なところだよなー。
俺が何をいいたいかというと、IronRuby頑張ってくれっていう

72 :デフォルトの名無しさん:2009/06/26(金) 09:28:58
Google V8を組み込み言語として使ってみた人いる?
速度的にはどんなもん?

73 :デフォルトの名無しさん:2009/06/26(金) 14:25:35
うは。IronPythonのスクリプトをアセンブリ(DLL)にコンパイルして、普通に実行できてしまった。
すごすぎるwww

まあ逆コンパイルして眺めてみたら明らかにC#より無駄なコードが多いから
何でもかんでもこれというわけにはいかないけどね。

74 :デフォルトの名無しさん:2009/06/26(金) 15:59:41
.NETが凄いんじゃなくて、IronPythonを実装した人が凄いと思う。
あの人、元々は.NETを否定する論文書くために実装してたのにw

75 :デフォルトの名無しさん:2009/06/26(金) 16:06:03
論文書いてるうちに、こうやったらできるんじゃね?と思って作ってみたらナイスにうごいちゃったんだっけか。たしかw

76 :デフォルトの名無しさん:2009/06/28(日) 18:20:03
もうちょっと踏み込んで、Squirrelみたいにスタックレス実装にしたらできることも
色々増えるんだけどねぇ>IronPython

まあSquirrelのパフォーマンスを考えると、
その分処理能力が落ちちゃうのかと思わないでもないが。

77 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/07/01(水) 10:46:11
すごい久々だね
開発続いてるのがありがたい

79 :デフォルトの名無しさん:2009/07/01(水) 12:02:12
Squirrelの作者さんは答えてくれるときはとても誠実に返答してくれるんだが、
要望出しても無視されてそのまま終わっちゃうことが多いんだよな。(フォーラムにて)

直接メールを出したほうがいいのかなぁ。

80 :デフォルトの名無しさん:2009/07/01(水) 13:29:07
squirrelってまだ一人で開発してるん?

81 :デフォルトの名無しさん:2009/07/01(水) 19:46:32
そういえばRMSがC#は危険だと言ったらしいが
pythonとsquirrelも2.xの開発がいつまで続くか気になるなあ

82 :デフォルトの名無しさん:2009/07/01(水) 22:39:03
RMSはGNUにとってC#およびMonoが特許侵害を踏まないかという点で危惧してるだけで、
C#の開発者がいなくなるとかそういう話ではない。

83 :デフォルトの名無しさん:2009/07/03(金) 02:58:05
>>66とか>>73がRhino使ったらどんな反応するのか気になる所だが
そもそも組み込みでjsてエディタのマクロ言語とかしか見たことなかった・・・。

84 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/07/07(火) 22:33:38
>>84
いやー、sqratの作者さんはJITの人とは別人ですよ。レスは書きましたがー。

一旦2引数の関数として登録して様子を見る、かな。
Squirrelのデフォルト引数はインタプリタが自前でやってるので
バインダ側で自動的に取得って言うのは無理っぽいんじゃないかなぁ。
理屈上はデフォルト引数をテンプレート型の
オブジェクトとして渡してあげればいけそうですが。

ともあれC/C++は関数型言語ではないし、あまり突っ込んで実装するほどのことではない気がします。

86 :デフォルトの名無しさん:2009/07/08(水) 00:36:42
>>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で固まろうとした)あたりから不安だったり...

87 :デフォルトの名無しさん:2009/07/08(水) 01:26:52
>>86
投稿している改変版ではフォーラムのレスであげている不具合は修正されてるよ。
ただ、自分のプロジェクトで正常に動かなかったのは本当。
もーちょっと色々動かしてほしいところだね。

88 :デフォルトの名無しさん:2009/07/08(水) 23:11:57
不具合の2個目の方は、文法的におかしな英文で意味不明なんですが
このスレを読むと、どうも>>41の人が言ってる話の関連のようですね。
ありがたく使わせてもらうことにします。レス下さった方ありがとうございました。

89 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/07/09(木) 00:52:42
bindedKansu
readedMojisu

91 :デフォルトの名無しさん:2009/07/09(木) 01:30:25
直訳:
クラスらのメンバーらとしてのSquirrelスクリプトの一点に呼び出しメソッドを
メタメソッド[_add/_mull/...]を含むbinded C++クラスへ追加されられない。
もし例のキーが未知ならば例のフックを取得する関数[_get]はfalseを返すべきだ。

methodにtheがない、bindの過去分詞はbound、hookをゲットする、その他もろもろ…

92 :デフォルトの名無しさん:2009/07/09(木) 03:08:02
もしかして もしかして

lua にはインクリメント演算子がないのか..!?


93 :デフォルトの名無しさん:2009/07/09(木) 03:19:05
>>92
ttp://www.23ch.info/test/read.cgi/tech/1205208141/776-783

94 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/07/10(金) 14:54:20
>>92
シェルスクリプトにもLispにもTclにもRubyにもPythonにも、
インクリメント演算子なんて無いんだよ。

96 :デフォルトの名無しさん:2009/07/10(金) 17:25:55
Luaの変数をC側から取得する前に、
実際に変数が存在するかの確認ってできませんか?

97 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/07/11(土) 07:26:02
>>97
詳しいサンプルテラthx
スレッドの環境が問題なるのはload*系だけなのねorz

99 :デフォルトの名無しさん:2009/07/12(日) 13:04:59
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 におけるパフォーマンスの要点について触れている。
> (略)

続きはサイトで

100 :デフォルトの名無しさん:2009/07/12(日) 22:06:29
sqrat0.7

101 :デフォルトの名無しさん:2009/07/13(月) 15:25:37
>>96
http://sugarpot.sakura.ne.jp/yuno/html/lua51_manual_ja.html#pdf-_G

102 :デフォルトの名無しさん:2009/07/13(月) 23:27:37
>>100
うほっ。更新内容見てフイタ。

IronPythonは事実上.NET側のオーバーロードをサポートできてないみたいだな。
明示的に書けば読めないことも無いようだが、
これで実用になるとはとても信じられない。
http://blogs.msdn.com/haibo_luo/archive/2007/10/11/5413239.aspx

103 :デフォルトの名無しさん:2009/07/14(火) 01:06:33
>>102
MessageBoxあたりで試せばすぐわかるが普通に呼べんぞ?
てゆーかなんでいきなりIronPython?

104 :デフォルトの名無しさん:2009/07/14(火) 09:26:14
>>95
Lisp には演算子っていう概念がないからちょっと違うけど、inc ならあるよ。
Lua の代入文の = も演算子じゃないんだよな。代入文は式じゃないから。

>>96
Lua は変数の値が nil なら定義されていないっていう意味になるので、
値を取得してみて nil かどうかを調べればいいんじゃないかな。
厳密には、グローバル変数はテーブルのフィールドとして定義されていて、
値が nil ならそのキーは存在しないことと同値なので。

105 :デフォルトの名無しさん:2009/07/14(火) 10:16:10
>>103
MessageBoxは試してなかったけど、確かにそうだよなぁ。
IronPython呼び出し用に再定義してあげないといけないかも。

オレ、以前はSquirrel党だったんだけど今はIronPython方面に。
組み込みスクリプトとしてはアリだと思うんだけど、どうだろう。

106 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/07/14(火) 18:43:12
わざわざ.NETやMonoに依存したくない

108 :デフォルトの名無しさん:2009/07/14(火) 21:40:20
>>100
2日で0.71に上がってるからバグでもあったのかと思ったら、
バインドしたC++の関数の引数にSquirrel関数を渡せるようにしてほしいと
要望もらって一日で作ってきてるんですね。
Kanryuさんのパッチも入ったし仕事はやいぞ。

109 :デフォルトの名無しさん:2009/07/15(水) 00:50:51
AngelScript|Д`)<俺らの話題全然ないな
GameMonkey|Д`)<全くだ
CRIScript|Д`)<全くだ

110 :デフォルトの名無しさん:2009/07/15(水) 01:41:13
ttp://www.chaiscript.com/
> ChaiScript | Easy to use scripting for C++

111 :デフォルトの名無しさん:2009/07/15(水) 02:24:00
チャイってミルクティーやん
と思ったらロゴがほんとにミルクティーだw

112 :デフォルトの名無しさん:2009/07/15(水) 02:28:39
Squirrelってリスやん

113 :デフォルトの名無しさん:2009/07/15(水) 06:59:47
Luaを組み込んである字幕作成ソフトAegisub
ttp://www.aegisub.net/
ttp://g-mark.jpn.org/index.php?Aegisub

字幕スクリプトの整形やエフェクトにLuaを利用してる
ライセンスはBSD、ソースは、
ttp://svn.aegisub.net/


114 :デフォルトの名無しさん:2009/07/15(水) 19:21:30
>>106
Python のyield は引数や戻り値の指定できるよ
Stackless Python なら同じ関数でしかyield使えないという制限もなかった気がするけどうろ覚え




115 :デフォルトの名無しさん:2009/07/16(木) 10:35:29
>>114
レスを見てジェネレータ関係を触ってみたら、
Pythonのバージョンによる挙動の差異が如実に出ててビビッた。

3.0系はprint文が関数化されて書式に互換性が無いとか、
ジェネレータのnext()メソッドが使えなくなってるとか。

IronPythonの現行版はまだ2.5系で、今年中に2.6系互換になる予定なのか。
オレには3.0はまだ新しすぎたようだ!

116 :デフォルトの名無しさん:2009/07/16(木) 13:54:53
>Python のyield は引数や戻り値の指定できるよ

http://www.python.jp/doc/nightly/ref/yield.html
本当だ、気づかなかった.... orz

117 :デフォルトの名無しさん:2009/07/29(水) 10:08:15
lua_newthread だとグローバル変数が共有されちゃうけど、
グローバル変数を独立させるようにできないの?
コードを共有して変数だけ独立させたいんだけど。

... って書いてて思ったけど、結局関数もグローバル変数と同じなんだから
lua_newstate でいいのか。

118 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/07/30(木) 06:10:29
luabind は使ったことがないので想像ですが、
コルーチンから C の関数が呼ばれるときは lua_State(L の値)が違うから、
それが問題になってたりしないかな?


120 :デフォルトの名無しさん:2009/07/30(木) 07:27:21
>>119
ありがとうございます
すみません、質問しておいて何ですが、以下のフォーラムの記事に
よるとどうやらluabindにバグがあったみたいで、仰るとおりlua_Stateの
値が関係してるようです(英語がよく分からないので間違っているかもしれません)
それでluabind/detail/ref.hppを記事の下にあるものに置き換えたところ、
今のところ例外が出ずに動いています。。
ttp://www.nabble.com/Re:-Garbage-collector-crashes-if-luabind-objects-are-created-in-a-lua-coroutine-td24251470.html

121 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/07/31(金) 18:37:55
>>121
>いつ再開されるかわからないからGCで回収できない
んな事はない。
スレッドでも他のデータでも、参照できなくなったらGCで回収される
という事に変わりはない。

123 :デフォルトの名無しさん:2009/07/31(金) 18:56:50
>>122
でも C のレベルでは、参照されているかどうかってわからないんじゃない?
つまり、lua_newthread() した直後は、
Lua のオブジェクトからは参照されていない thread ができるわけですよね。

逆にいうと、lua_newthread() しただけだとどこからも参照されていない事になるから、
lua_setglobal か何かを使って、どこかから参照してあげないといけないとか?


124 :デフォルトの名無しさん:2009/07/31(金) 19:50:44
どこのlua_newthreadの解説読んでるのか知らんが、
「新しいスレッドを"スタックに積み"……」って書いてないか?

125 :デフォルトの名無しさん:2009/07/31(金) 19:59:52
http://www.lua.org/manual/5.1/manual.html#lua_newthread
ここみてますけど、でもさすがに、スタックに積んだままじゃほかのことできないでしょ。
元の質問された方がどういう風に使っていたかによるけど。


126 :デフォルトの名無しさん:2009/07/31(金) 20:09:46
lua_newthreadの直後はC関数のスタックから「参照」されてるし
そのあとLuaで参照したいなら戻り値なりグローバル環境なりに押し込めばいいし
C側だけで管理したいならレジストリ+luaL_refとか使えばいいだろ

何がしたいんだかわかんねーよ

127 :デフォルトの名無しさん:2009/07/31(金) 20:12:10
新しいスレッドを積むのはいいんだけど、
古いスレッドが不要になったということをどうやってLUAに知らせるの?

最初に
ls = lua_newthread(...);
lua_resume(ls, ...)
を実行したとして、ls は中断状態のまま残っていると。
で、中断状態をやめて、最初から実行したいということで、いきなり
ls = lua_newthread(...);
lua_resume(ls, ...)
をもう一度呼び出すと、古い ls が上書きされるけど、古い ls への参照も、
なにもかもまったくいじっておらず、ただ単に新しいスレッドを追加しただけにすぎないわけで。

古い ls の参照カウンタをデクリメントするなり、古い ls への参照を
削除するなりの処理がまったく入っていないと。


128 :デフォルトの名無しさん:2009/07/31(金) 20:38:13
C++とLuaスクリプトの連携をしたいお年頃なんですが、
toluaとluabindだったらどちらが安定してる感じですか?

129 :デフォルトの名無しさん:2009/07/31(金) 21:20:37
>>127
だから削除したいならスレッドの参照を潰せばいいだけでしょ?
自分で最後に答え書いてるじゃん!


中断中のコルーチンが参照されなくなった場合に GC 対象になるかどうかは
マニュアルにも明言されてない、どっちなの? って質問なら確かにわかりにくいとは思うが。

int main(int argc, char* argv[])
{
 lua_State* L = lua_open();
 luaL_openlibs(L);
 lua_State* thread = lua_newthread(L);

 luaL_loadstring(thread, "print('co1'); coroutine.yield(); print('co2');");

 lua_resume(thread, 0);

 //lua_settop(L, 0);

 lua_gc(L, LUA_GCCOLLECT, 0);

 lua_resume(thread, 0);

 lua_close(L);
 return 0;
}

lua_newthreadで積んだスレッドを潰す処理であるlua_settopの行のコメントを削除すると
二回目のlua_resumeの時点で落ちるところから「GC対象になる」が正解みたいやね。

130 :デフォルトの名無しさん:2009/07/31(金) 21:27:07
>>127 は根本的なところを理解してないようだ。スタックにあるんだからpop すればいいんだよ。

まず

lua_State *base = lua_newstate();
lua_State *ls = lua_newthread(base);

は、

lua_State *base = lua_newstate();
lua_newthread(base);
lua_State *ls = lua_tothread(base, -1)

と意味的には等価ね。

ここで ls は、あくまでスタック上にあるスレッドの情報を、
直接ポインタとして参照してるだけで、別にリファレンスを持ってるわけではない
lua_newthread がこれを返してるのは、単に便利だからにすぎない

この状態で、lua_pop(base,1) することで、スタックの末尾にあるもの=さっき作ったスレッドが
破棄されて解放されることになる。これでスレッドが破棄された後に ls にアクセスすると、
実体がなくなってるポインタの参照になるから誤動作を引き起こす

一般的には、スレッドをスタックにつんだままにしとくのはわけわかになるので、
>>126の言ってる通りに管理することになる

131 :デフォルトの名無しさん:2009/07/31(金) 21:52:47
>>129
お前も使い方間違ってるよ・・・

132 :131:2009/07/31(金) 21:59:29
と思ったけど、俺が間違ってる気がしてきた・・・
メインスレッドのスタックに、新しいスレッドと関数と引数を積んでlua_resumeを呼ぶ
と思ったけど、違うのか

133 :デフォルトの名無しさん:2009/07/31(金) 22:01:02
>>131
え? それだけ言われてもわかんない、どこどこ、教えて!

134 :デフォルトの名無しさん:2009/07/31(金) 22:04:32
>>132
ってなんじゃいゴルァ!w

いやそこは合ってるはずだよ、とゆーかみんなCで組み込むなら標準ライブラリのソース読もうぜ
組み込みの基本からトリッキーなものまで一通りそろってるぜ

135 :デフォルトの名無しさん:2009/08/01(土) 20:41:44
lbaselib.cのauxresume(L, co, narg)の所を見るとlua_resume(co, narg)となっている。
1番目の引数がLではなくcoだということがマニュアルを読んだだけではわからなかった。

136 :デフォルトの名無しさん:2009/08/10(月) 17:41:02
C++でPython組み込んでて
例えば
Pythonのソースにスペルミスがあったとして
それをC++側で知る方法が全く分からない
どなたか分かりませんか

137 :デフォルトの名無しさん:2009/08/10(月) 17:52:13
 
           ∩_
           〈〈〈 ヽ
          〈⊃  }
   ∩___∩  |   |
   | ノ      ヽ !   !
  /  ●   ● |  /
  |    ( _●_)  ミ/ Lua!!
 彡、   |∪|  /
/ __  ヽノ /
(___)   


138 :デフォルトの名無しさん:2009/08/10(月) 17:57:43
>>136
Pythonスクリプトのコンパイルエラーやら実行時エラーを取得したいっていうこと?

139 :デフォルトの名無しさん:2009/08/10(月) 18:02:39
>>138
そのとおりです。

PyErr_Print () の出力先を変えればいいのだと思うのですが。。。うまくいきません

140 :デフォルトの名無しさん:2009/08/10(月) 18:44:19
>>139
PyErr系はstdoutに出力するけど、これはcで定義されたstdoutではなく
python で定義されたsys.stdout を呼んでいるので、その変数を上書きすれば良い。
sys.stdout 変数を書き換えるコードを最初に実行する。

const char *s = "\
import sys\n\
sys.stdout = MyStdout\n\
class MyStdout:\n\
 def write(s):\n\
  call_c_function(s)\n";

てやって s を実行すれば、Python側の sys.stdoutが自作クラスで上書きされる。 
もちろんあらかじめ自作C関数を call_c_function で呼び出せるように登録しておく。


141 :デフォルトの名無しさん:2009/08/10(月) 21:11:59
>>139
PyErr_Occurred で存在を確認して、PyErr_Fetch で取得

142 :デフォルトの名無しさん:2009/08/10(月) 22:22:23
AngelScript2.17記念カキコ

143 :デフォルトの名無しさん:2009/08/10(月) 23:09:19
>>140-141
ありがとうございます
出来ました

144 :デフォルトの名無しさん:2009/08/11(火) 07:43:44
           ∩_
           〈〈〈 ヽ
          〈⊃  }
   ∩___∩  |   |
   | ノ      ヽ !   !
  /  ●   ● |  /
  |    ( _●_)  ミ/ Lua!!
 彡、   |∪|  /
/ __  ヽノ /
(___)   


145 :デフォルトの名無しさん:2009/08/13(木) 01:25:43
IronPython……。
開発効率はそんなに悪くないんだが、
スクリプトで書いたメソッドの実行のレスポンスが悪いような気がするなぁ。
最初の実行時に引っかかる感じ。2回目以降は問題ないんだが……。

146 :tor1.digineo.de:2009/08/17(月) 17:46:38
Q. 自動保守#K9K?_D[L とは一体何なのか?
A. 外部サイトへの突撃大好きな真性厨房

韓国突撃でお馴染みの自動保守
最近は自動焼人 ★として2ちゃんねるのボランティアにも精を出す日々
だがそんな彼にも、人間らしい部分はあったのだ…

名言集
『アパッチ砲はワシが作った』
『お前が規制系キャップ取れるか審査してやるよ』
『いつもサボってばかりのキャップがウゼえ』
『俺、100人規模の集団サイバーテロの主犯だったこともあるんだぜ』
『俺の経歴カックイイだろ?』

最近のニュース
 8月15日の韓国突撃の際に歴史的大敗を喫する。ラジオでの敗戦宣言のときに声が震えていた
 本人は体調不良と言っているが…


----------------------------------------------
この自動焼人 ★メールマガジンの配信停止をご希望される方は
http://qb5.2ch.net/test/read.cgi/sec2chd/1250169591/
にて自動焼人 ★までご連絡ください

147 :デフォルトの名無しさん:2009/08/19(水) 22:37:23
Xtalが 1.0.0.0になった気配

148 :デフォルトの名無しさん:2009/08/19(水) 22:48:59
         \   l´⌒\⌒\ \\ \
           \ ヽ   )  )   \\ \\   
              (   \ \∩___∩ \\ 
           \   \  ⌒⌒| ノ      ヽ  \\      
              \ \   /  ●   ● ト、\ \\\ 
               \  Y |    ( _●_)  ミ\  \\\  
               \ / 彡、_  |∪| ノ   \  \\\
                 (____)―ヽノ' ヽ      ̄ ̄ ヽ\\
                                \,  j  l l .l }
                         Lua!   l (_ノノノノ



149 :デフォルトの名無しさん:2009/08/20(木) 00:02:36
なん・・・だと・・・

150 :デフォルトの名無しさん:2009/08/20(木) 08:49:22
修正点まだあるみたいだね

151 :デフォルトの名無しさん:2009/08/20(木) 13:51:23
XtalってC++以外からは使いにくくない?
っていうか使えるんだろうか

152 :デフォルトの名無しさん:2009/08/20(木) 14:17:00
>>151
バインド部分がテンプレートべったりなんだから、そのままではC++以外で使えるわけがない。

ぼやき。
Squirrelを.NET向けに移植しようかと考えたこともあったが、
この分野ではIronPythonが便利すぎてやる気が失せた。
起動が重過ぎる点を除けば処理速度以外は特に不満点はない。

Luaに関しては.NET判処理系のNuaがあるみたいね。

153 :デフォルトの名無しさん:2009/08/20(木) 16:54:28
>>152
ですよねー
もうちょい汎用的なバインド方法が欲しいところだ

154 :デフォルトの名無しさん:2009/08/20(木) 19:43:09
>>151
試してないけど
extern "C" {}
でC言語リンケージに変換してみるとか。

155 :デフォルトの名無しさん:2009/08/26(水) 05:27:30
IronRubyも0.6まで着てたな。Ruby on Railsが動くまでになったらしい。
Rubyも楽に組み込めるといいんだけどね。例えば、スクレイピングの部分だけまかせるとかさ

156 :デフォルトの名無しさん:2009/09/07(月) 08:56:09
IGDAで Xtal を扱う勉強会があるみたい。
http://www.igda.jp/modules/bulletin/index.php?page=article&storyid=122


157 :デフォルトの名無しさん:2009/09/07(月) 11:13:19
Xtalっておいしいの?

158 :デフォルトの名無しさん:2009/09/07(月) 11:31:58
食わず嫌いはいけませんよ

159 :デフォルトの名無しさん:2009/09/07(月) 11:45:23
4時間で6テーマか。
Xtalに特に興味があるなら別のイベントに期待って感じかな。

160 :デフォルトの名無しさん:2009/09/07(月) 12:08:05
JITコンパイルでC並の速度で動く組み込み言語とかない?

161 :デフォルトの名無しさん:2009/09/07(月) 12:19:50
AngelScriptがJITコンパイルできるようになったらしいが、やり方がわからない…

162 :デフォルトの名無しさん:2009/09/07(月) 12:24:07
>>160
言語じゃないけど、NativeClient

163 :デフォルトの名無しさん:2009/09/08(火) 00:34:11
昔は高速な組み込み言語はLispだったな。
JITコンパイルじゃないが。

164 :デフォルトの名無しさん:2009/09/08(火) 12:15:39
>>160
ttp://www.compuphase.com/pawn/pawn.htm

165 :デフォルトの名無しさん:2009/09/08(火) 23:51:16
>>164
これ良さそうだけど人気ないのかな

166 :164:2009/09/09(水) 02:11:46
164 書いた後で発見
ttp://pawn.my-sv.net/index.php?%B4%F0%CB%DC

167 :デフォルトの名無しさん:2009/09/11(金) 08:52:36
現状Pythonの組み込みで満足してるというのに、他の言語を検討する必要性をまったく感じない……。

168 :デフォルトの名無しさん:2009/09/11(金) 11:08:55
>>167
帰れ

169 :デフォルトの名無しさん:2009/09/12(土) 12:24:04
>>160
LuaJIT 速いらしいよ。
C ほどじゃないだろうけど、Python には大体勝ってるみたい。
http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=luajit&lang2=python&box=1

170 :デフォルトの名無しさん:2009/09/12(土) 14:17:34
Lua は JIT じゃなくても python より速いよ

171 :デフォルトの名無しさん:2009/09/12(土) 14:30:54
IronPythonはLuaより倍ほど速いがな。(2.0.1)の場合。
2.6系ならさらに速くなってる。
ただし速いのは数値計算で、文字列計算などはPythonより遅かったりするが。

172 :デフォルトの名無しさん:2009/09/12(土) 15:36:57
組み込み言語って
「Cで書いた (だから速い)」と喧伝しながらこっそりと組み込むものではないのか?

173 :デフォルトの名無しさん:2009/09/12(土) 15:43:13
たぶn Luaやリス使っている人はゲームの組み込みが多いと思われるのですが、
Pythonを組み込みに使っている人は、どんなアプリに使ってますか?

174 :デフォルトの名無しさん:2009/09/12(土) 17:14:54
>>171
マジで!? IronPython スゴイんだな。
数値計算に関してなら、以前に計測したとき Lua は Python より2〜5倍速かったんだけど。
数値計算については .NET すごいということなのかな?

175 :デフォルトの名無しさん:2009/09/12(土) 19:32:49
LuaJITとかCに比べたら桁違いに遅いんじゃない?

176 :デフォルトの名無しさん:2009/09/12(土) 19:37:08
というか、Cで各プログラムと速度面で執拗に比較するやつがいるが、意味が分からない。
C/C++にスクリプト言語の動作を追加するのは柔軟性を増やすことで
開発・運用を容易にするためであって速度のためではない。

スクリプト言語で実装した部分が重いなら改めてC/C++側に移植することを考えればいいだけのこと。

177 :デフォルトの名無しさん:2009/09/12(土) 19:43:51
ユーザがプログラムを拡張するのに使えるだろ

178 :デフォルトの名無しさん:2009/09/12(土) 19:55:55
組込み言語に今注目してる業界にゲーム業界があるが、
ユーザによる拡張をばりばり推進するぜ派(洋ゲー、リアルタイム物メイン)と、
そんなもん完全にアウトオブ眼中だぜ派(和ゲー、アドベンチャー系メイン)で、
まっぷたつですな。

179 :デフォルトの名無しさん:2009/09/12(土) 20:10:01
社風の違いだからどうにもならない。
プログラマの部長級が開放的という幸運なケースであってさえ、
総務営業やら会社も巻き込むとやっぱり日本的感覚で
ゲームの内情を客に見せるのは御法度になるね。
プログラマ出身のワンマン社長のところしかありえないでしょう。



180 :デフォルトの名無しさん:2009/09/13(日) 09:18:47
プラットフォームの違いもある。
洋ゲーと言えども、360やPS3でMODを許しているものは少ないだろう。

>>178の(和ゲー、アドベンチャー系メイン)ってPCのエロゲ・ギャルゲのことを
指してるんだろうけど、俺としては違和感があるなぁ。


181 :デフォルトの名無しさん:2009/09/15(火) 23:34:31
ttp://www.amazon.co.jp/Programming-Lua-プログラミング言語Lua公式解説書-Roberto-Ierusalimschy/dp/4048677977/
この本持ってる人いる?
luaを始めて見ようと思ってamazonで検索して出てきて最新ぽいから買おうと思ってるんだけど

182 :デフォルトの名無しさん:2009/09/16(水) 21:34:58
>>181
読んでみようと思って大きな本屋まで行ってきたが、
SQLiteの本とDirectXの本読んでたら満足しちゃってそのまま帰ってきてしまった。

183 :デフォルトの名無しさん:2009/09/17(木) 05:14:33
>>181
リファレンスマニュアルの日本語訳も収録してるなら長く使えそうかも。
リファレンス読んでよくわからないところを本文で確認とかできそうだし。

http://sugarpot.sakura.ne.jp/yuno/html/lua51_manual_ja.html
よくここにお世話になるんだけど、内容が古いのか、
本家の英語版にくらべると結構抜けがあるんだよね。

184 :デフォルトの名無しさん:2009/09/17(木) 10:12:06
>>182
おいw

185 :デフォルトの名無しさん:2009/09/17(木) 18:27:44
ttp://blog-imgs-26.fc2.com/d/i/n/dinalia/WS000206.jpg
このSSで使用してるソフトご存知の方いたら教えていただけませんか

186 :デフォルトの名無しさん:2009/09/17(木) 21:15:21
ttp://mystone.jp/
ttp://tibid.seesaa.net/

187 :186:2009/09/17(木) 21:23:49
もしかしてエディタの方なら
ttp://www.vector.co.jp/vpack/browse/pickup/pw7/pw007523.html

188 :デフォルトの名無しさん:2009/09/17(木) 21:23:50
>>185
NoEditor

189 :デフォルトの名無しさん:2009/09/18(金) 12:39:47
ご回答ありがとうごじあましたー

190 :デフォルトの名無しさん:2009/09/25(金) 16:57:06
メインアプリ起動後に裏で常にLuaを複数同時に動かして
プラグインのようなことをさせたいのですが
何か参考になるサイトやソースコードはないでしょうか?

191 :デフォルトの名無しさん:2009/09/26(土) 06:26:45
>>190
メインと切り離す必要が本当にあるならプロセス間通信。
メインの内部で別スレッドを作って回すだけでいいならマルチスレッド。

192 :デフォルトの名無しさん:2009/09/26(土) 09:17:46
マルチスレッドだと今度はリソースのロックとかがめんどくさいから、
コルーチンで協調的マルチスレッドにするとかどうですか?

193 :デフォルトの名無しさん:2009/09/26(土) 09:51:46
>>191-192
貴重な意見ありがとうございます
コルーチンで実装してみて上手く行かないようなら
マルチスレッドを試す方向で行こうと思います

194 :デフォルトの名無しさん:2009/09/26(土) 14:57:40
オレの場合、最初はコルーチンで実装してたが早々にCPUリソースが足りなくなって
マルチスレッドに移行したがな。
ゲームで使用するリソースを開始前に一括してロードするような
FPS的な仕様にしないと単独スレッドの実装は難しい。

195 :デフォルトの名無しさん:2009/09/28(月) 13:19:32
>>190が言ってるような
一つのソフト上で同時に複数の
Luaスクリプトを動かす事って可能なの?

変数やスタックがバッティングしそうな気もするし
実際そういうことをしてるアプリ見たことないな

196 :デフォルトの名無しさん:2009/09/28(月) 13:21:09
lua_Stateを複数作ってそれぞれ別管理すればいいだけじゃ?

197 :デフォルトの名無しさん:2009/09/28(月) 13:59:39
ですね。

Luaはインタプリタの状態がグローバルにならない作りになってる。

198 :デフォルトの名無しさん:2009/09/28(月) 21:44:36
V8も以前は・・・

199 :デフォルトの名無しさん:2009/09/29(火) 09:55:14
Lua Programming Gems に、
Lua のコルーチンを改造してマルチスレッドにするという記事があるみたい。

http://www.lua.org/gems/
本は読んでないけど、サンプルコードがダウンロードできる。
Enhanced Coroutines in Lua
Patrick Rapin


200 :デフォルトの名無しさん:2009/09/29(火) 14:32:03
何かが引っかかると思ったら、コルーチンでLuaを複数回して
更にLua内でもコルーチンを使うからか
なんか富豪だな

201 :デフォルトの名無しさん:2009/09/29(火) 15:38:36
総合的な処理速度はSquirrelとLuaではどちらが上ですか?

202 :デフォルトの名無しさん:2009/09/29(火) 15:49:56
>>201
単純な数値計算ではLuaの方が倍くらい早い。
が、いずれにせよCなどの静的型付言語よりは10分の1以下のスピードなので、
あまりヘビーな処理はさせないようにすること。
とはいえ、80:20の法則で大部分のコードはスクリプト側に移行できるはず。
処理能力が足りなくなったら下回りからC/C++に再度移植していく。

203 :デフォルトの名無しさん:2009/09/29(火) 15:55:21
>>202
そうですか、一見するとSquirrelはLuaの欠点を補い
構文もC/C++に近いなど利点ばかりかと思っていたけど
それなりに欠点があってゲーム用に改良された割には
未だ使用例が少ないのが現状みたいですね

204 :デフォルトの名無しさん:2009/09/29(火) 16:14:07
>>203
いや、C++で書いてたころは普通にSquirrel使ってたよ。
とりあえず基本的なレベルでの不満はない。
オブジェクトの寿命は常に問題になるけどね。

今はもうC++でプログラムは書かないようにしてるから関係なくなった。

205 :デフォルトの名無しさん:2009/09/30(水) 18:40:24
>>204
気になるなw

> 今はもうC++でプログラムは書かないようにしてるから関係なくなった。
今は何で書いてるんですか?
.NET系?

206 :デフォルトの名無しさん:2009/10/02(金) 05:46:32
>>204
C#+IronPythonだ。レポはこのスレに何回も書いてるのでログを見てくれ。
しかし静的型付言語でいいならBooでもいいかも……(はっきり言ってこっちの方が速いし)
まあ今回は途中まで作ったからIronPythonでやってしまう予定だけど。

207 :デフォルトの名無しさん:2009/10/02(金) 05:47:14
204 → 205

208 :デフォルトの名無しさん:2009/10/03(土) 12:21:55
Luaステートを増やした(同時実行した)場合のGC負荷は
単純計算でステート数分増えるのかな?
検証してるサイトないか探したけど見当たらない

209 :デフォルトの名無しさん:2009/10/03(土) 12:29:14
そりゃ当たり前のことを検証する人は居ないだろう

210 :デフォルトの名無しさん:2009/10/04(日) 13:35:48
たまにLuaではcontinueやbreakは出来ないが
それを可能にするパッチがある、とあるけど
実際どこで配布されてます?
ここ数日ずっと探してるけど見つからず

211 :デフォルトの名無しさん:2009/10/04(日) 16:57:50
breakはできるだろ
continueは
http://lua-users.org/wiki/LuaPowerPatches
とか
http://lua-users.org/lists/lua-l/2009-06/msg00331.html
だな。

212 :デフォルトの名無しさん:2009/10/04(日) 18:56:28
初心者な質問なのですが、
VC++6.0でLua環境を構築しています。

「スクリプト言語による効率的ゲーム開発- C/C++へのLua組込み実践」 の中で
紹介されているtolua++を適応しています。
あるクラスの関数をtolua++を用いてLuaに公開しようと実装したのですが、
extern宣言した関数がリンカエラーでビルドする事が出来ません。

やりたい事は下記の様な感じです。
class CHoge
{
public:
char* GetName( CHage* pHage );

};

このGetName関数をtolua++でグルーコードに出力して、
VCのプロジェクトに登録しています。
出力したグルーコードに記述されている、GetName関数がリンカエラーになってしまいます。
*今はグローバル関数にして、extern宣言で対応しています。

クラスの関数をLuaに公開するには何か特別な方法が必要なのでしょうか?

上記の本にはクラスの関数の場合について記述されていない様なので質問しました。

宜しくお願いします。

213 :デフォルトの名無しさん:2009/10/04(日) 20:20:58
>>211
thx、無事適用完了しました

214 :デフォルトの名無しさん:2009/10/06(火) 04:29:51
>>212
http://www.codenix.com/~tolua/tolua++.html#classes
ここみると、クラスごとバインドするしかなさそう。
あるいは、登録したい関数をクラスメソッド(static 宣言)にするといいのかな。


215 :デフォルトの名無しさん:2009/10/06(火) 17:54:33
Luaでチャンクの区切りを改行ではなく ; (セミコロン)にしたいのだけど
それを可能にするパッチとか出てたりします?
自分で改造しようにも手に負えなくて

216 :デフォルトの名無しさん:2009/10/06(火) 18:01:45
配列を0から扱えるように悪銭苦闘したオレに似てるな
オレの場合は自力でやったけど複雑過ぎて無理だった orz
Luaってなんで配列が1からなのかね
いまでもムズムズ、どうにかならないものか

217 :デフォルトの名無しさん:2009/10/06(火) 18:28:12
lparser.cのstatement()のswitch文のreturnの前に
check(ls, ';');
って書けばいいんじゃないかな

218 :デフォルトの名無しさん:2009/10/06(火) 22:06:32
社会常識は1からだからな。

219 :デフォルトの名無しさん:2009/10/06(火) 23:39:10
マジでLuaの配列を0から扱えるようにするpatchありませんかね?

220 :デフォルトの名無しさん:2009/10/07(水) 01:28:23
>>214
回答ありがとうございます。
クラスのバインドで試してみます。

221 :デフォルトの名無しさん:2009/10/07(水) 12:03:44
>>216
ニューメリカルレシピ・イン・C っていう本にその逆のことが書いてあったな。
一般的な数学では添え字は 1 からはじまるのに C だと 0 からだから困ると。
で、その本では添え字を 1 から始めるように、配列のポインタを 1 つ前にずらしてた。

つまり、int arr[10] みたいな配列をつくったら、
int *arr1 = arr - 1 と定義しておけば、arr1[1]、arr1[2]、……、arr1[10]
っていうふうにアクセスできる。

222 :デフォルトの名無しさん:2009/10/07(水) 12:29:33
Fortranな人のための小ワザだけど、
厳密には、配列の範囲から外れたところを指してるポインタに
まつわる動作は未定義なので、仕様に煩い人には不評。
(C FAQ より ttp://c-faq.com/aryptr/non0based.html )

223 :デフォルトの名無しさん:2009/10/07(水) 13:11:48
>>215
>>219
SquirrelとかAngelScriptじゃダメなの?

224 :デフォルトの名無しさん:2009/10/07(水) 13:16:16
そもそも0とか1とかいうマジックナンバーを使ってはいけない。
パッチではなく、リファクタリングするべき。
#define FIRST 1

225 :デフォルトの名無しさん:2009/10/07(水) 13:16:36
言語はそのままの仕様で使うのが無難ではあるよなー

226 :デフォルトの名無しさん:2009/10/07(水) 13:21:29
>>223
Lua以外にするとメモリ消費や処理速度が劣ってしまうのが嫌で
やっぱり仕様に従って使うしかないですか

227 :デフォルトの名無しさん:2009/10/07(水) 14:04:47
      ∩∩ ;
      ;|ノ||`      ┬-‖
   __,/●●| __    | | ‖     L...Lua..
   | ; |`(_●)/ ミ   . Y ‖
   | .彡|∪||、 , .|     |  ‖
  /:~ ̄ ̄ ̄ ̄:/.|    |  ‖
  ,|:::::.   .......::/>>    /  ‖
 /.:::::  .. ...::::::|'(/\_/  ‖
../:.:::    .. :.:::/.:/     /‖\
/.:::.   ....:::..:::/.:/
' ̄ ̄ ̄ ̄ ̄ _/
|_| ̄ ̄ ̄ ̄|_|

228 :デフォルトの名無しさん:2009/10/07(水) 18:31:00
BASICでも配列作ると0からなのに・・・・

229 :デフォルトの名無しさん:2009/10/07(水) 18:57:15
ここは中間をとって0.5に

230 :デフォルトの名無しさん:2009/10/07(水) 19:28:51
BASIC はたいていの実装が OPTION BASE とかで配列の開始インデックスを変更できるぜ

231 :デフォルトの名無しさん:2009/10/07(水) 20:37:21
もう連想配列だけにしちゃおうぜ


232 :デフォルトの名無しさん:2009/10/07(水) 23:24:33
>>230
なつかしすぎてどっかから鼻血でたわw

233 :デフォルトの名無しさん:2009/10/07(水) 23:41:07
0からってのはポインタ的な発想で好かんわ

234 :デフォルトの名無しさん:2009/10/08(木) 13:50:08
Pythonでシステム組んでるが、配列のインデクスが何番からかほとんど意識することないな。
for文ではそのままイテレータをまわしてしまうし。

235 :デフォルトの名無しさん:2009/10/09(金) 19:50:43
Lua標準だと1ステートあたりのスタックサイズは1Kだけど
消費を抑えたくて手動設定する場合
どれくらいの値がベストだろう?

236 :デフォルトの名無しさん:2009/10/09(金) 23:42:36
デフォで使用メモリ量が80MBを越える俺の構築した処理系からすれば、
数十キロバイトの仮想スタックなんて小さな問題だ。

237 :デフォルトの名無しさん:2009/10/11(日) 01:41:47
新しい必殺技を思いついた
>>236 に捧ぐ
"O"zapper!!

238 :デフォルトの名無しさん:2009/10/11(日) 03:42:20
次こそはうまくやりますコンピューター!

239 :デフォルトの名無しさん:2009/10/11(日) 19:42:49
>>232
「どっかから」てお前はケツから鼻血がでるのかよw

>>236
RubyでフレームワークとしてRailsを搭載したかのようなメモリ消費量だなおいw

240 :デフォルトの名無しさん:2009/10/11(日) 19:52:53
>>239
IronPythonがもりもりメモリ食うからな。
ほんと環境にやさしくないスクリプトエンジンだぜ。

まあ、C#で組むにはこれが一番「普通」なスクリプティングエンジンなので。

241 :デフォルトの名無しさん:2009/10/11(日) 21:24:50
IronPythonすげえwそんなにメモリ食いすぎなのかw

242 :デフォルトの名無しさん:2009/10/14(水) 02:42:38
luaについてちょっと質問なんだけど、
乱数を表示させたあとに、もう一度同じプログラムを実行すると
シード値が変わらずにまったく同じ乱数が表示されてしまう。
どうすればこのシード値を初期化して、実行するたびに違う乱数を
表示させられるの?

243 :デフォルトの名無しさん:2009/10/14(水) 02:54:44
それこそシード値を「適当に」初期化してやればいい。
一般的には、タイマーの値とか、ユーザ入力の時間差を測定したりして、それを srand() につっこんで対応する。


244 :デフォルトの名無しさん:2009/10/14(水) 03:04:26
>>243
レスありがとう

まだはじめたばっかりでホームページさがしながらの手探り状態なんだけど、
math.random()で()の中に1から10までの値をいれるよね?
そしたらそれ以外にmath.randomseedを書けばいいってこと?

245 :デフォルトの名無しさん:2009/10/14(水) 03:16:42
そう。

プログラムの頭で math.randomseed(os.time()) とでもしておきなされ。


246 :デフォルトの名無しさん:2009/10/14(水) 03:22:08
できました!
本当にありがとうございました。

これからもっと勉強してきます

247 :デフォルトの名無しさん:2009/10/14(水) 13:48:26
実行中のLuaスクリプトを停止させるには
lua_errorで強制的に例外を発生させる方法以外に
何かありませんか?

1つのスクリプトを実行する一般的な使い方なら問題ないのですが
スレッド毎で同時に複数のスクリプトを実行させる場合
リソースの保護をしても違うスレッドからスクリプト(ステート)を閉じようとすると
原因不明のエラーで強制終了してしまいます

248 :デフォルトの名無しさん:2009/10/14(水) 14:52:00
>>247
コルーチン化していつでも終了できるように作っておくのがLWL流 :)

249 :デフォルトの名無しさん:2009/10/14(水) 14:57:04
つlua_yield

250 :デフォルトの名無しさん:2009/10/14(水) 15:03:25
>>248
肝心な部分を説明し忘れてました
私が今作ってるのは>>190の方が言われたような
luaを同時実行させてプラグイン機能を実現するもので

それをコルーチンでやるとなると実質スレッド1つで
全処理をすることになるのでCPUリソースの消費が激しく
ステートも一つだから変数の重複などが問題になって
それらを回避するためにマルチスレッド上で
それぞれスクリプトを動かす必要があるのです

しかしあるプラグインでエラーが起こり
それに関連するスクリプトを全部停止(解放)したい時
現スレッドから他スレッドのステートを閉じようとすると
強制終了につながるエラーが起きてしまう状況で

251 :デフォルトの名無しさん:2009/10/14(水) 15:35:28
>>250
ちがうよー。
コルーチンというのはプログラマが入力した任意のタイミングで
動作を中断できるようにした仕組み(yield)のことであって、
それを使って複数の仕事を1スレッドで同時に実行というのは二次的なものに過ぎないんだよ。

したがって複数のスレッドで実行しても(エンジンの実装に問題が無いなら)問題ない。

で、中断されて制御が戻ってきたタイミングでそのまま開放してあげればいい。

252 :デフォルトの名無しさん:2009/10/14(水) 15:54:24
>CPUリソースの消費が激しく
>変数の重複などが問題

>強制終了につながるエラーが起きてしまう状況

戦況が悪化してるが、今さら撤退する気はない
典型的なパターンですね

253 :デフォルトの名無しさん:2009/10/14(水) 16:07:52
>>250
lua はスレッドセーフじゃないから、別スレッドからの制御は根本的にできないよ

コルーチンでうごかせってのは、呼び出しに lua_call を使うんじゃなくて、lua_resume と while
ループでスクリプトを駆動させて、スクリプト側では定期的に yield するようにすれば、
その区切りで安全に実行中断できるよ、ってこと。

それぞれのスクリプトはそれぞれのスレッドで立ち上げて、ほかのスレッドから停止させるときは
フラグをたてておいて、そのフラグがたってたらwhileを抜けて速やかにスレッドを自滅させる
ような書き方にする。

コルーチン駆動&記述が面倒ってことなら、裏技チックだけど、lua_sethook を使って、
関数呼び出し、ないしは行ごとに終了フラグチェックさせて、もしフラグたってたら
lua_error で速やかにスクリプトを abort させるという手もある。
残念ながらhookにユーザパラメータは存在してないので、変数かレジストリに
参照するフラグのCポインタを格納しておく、とかの小ざかしいテクが必要。

254 :デフォルトの名無しさん:2009/10/14(水) 16:12:26
なるほど
Luaスクリプトを同時実行する際は
マルチスレッドのみでの制御は無理ということですか
改めてコルーチンについて勉強し直してきます
どうも助かりました


255 :デフォルトの名無しさん:2009/10/14(水) 17:04:30
スレッドって名前が紛らわしいな。
関係ないかもしれないが、非推奨な手法を使いにくくするとかいう話を思い出した。

256 :デフォルトの名無しさん:2009/10/14(水) 23:15:46
Luaは普通の呼び出しと、lua_yieldで一時停止して再度呼び出す場合とで使う関数が違うのが面倒くさくて逃げちゃったな俺…
AngelScriptだと同じ呼び出し方でOKなんだよなぁ…

257 :デフォルトの名無しさん:2009/10/15(木) 05:43:27
>>256
coroutine.wrap をつかえば、普通の関数呼び出しと同じように resume もできるよ。


258 :デフォルトの名無しさん:2009/10/15(木) 11:25:20
変態文法&バイトコードがエンディアン依存なluaを広めるのやめようぜ
手間が増えてスクリプトにしてる意味がねえよ

259 :デフォルトの名無しさん:2009/10/15(木) 11:27:46
luaって、oracleにアクセスするライブラリないですか?

260 :デフォルトの名無しさん:2009/10/15(木) 22:50:58
JavaからLuaを使うことってできる?

261 :デフォルトの名無しさん:2009/10/15(木) 23:24:54
JavaからC言語を使うことってできる?

262 :デフォルトの名無しさん:2009/10/16(金) 10:56:47
>>259
http://www.keplerproject.org/luasql/
Lua for Windows についてくるよ。使ったことないけど。
http://luaforwindows.luaforge.net/

263 :デフォルトの名無しさん:2009/10/16(金) 11:14:25
>>259
というかそんな『重い』プロダクトを扱うなら、
素直にPythonやRubyなんかのライブラリの整備されたスクリプト言語使ったほうがよくなくね?

264 :デフォルトの名無しさん:2009/10/16(金) 11:16:27
まあそんなこといいつつ、俺もPythonで軽量なDBラッパー探したら見つからなかったので
ActiveRecord互換のORMライブラリを自作したんだがな。

265 :デフォルトの名無しさん:2009/10/16(金) 11:24:25
>>258
Luaの速度に魅力を感じてる人がなんとなく多い気がするね。
あとは、リスとかに比べるとドキュメントの多さなんかが人気の秘訣?

266 :デフォルトの名無しさん:2009/10/16(金) 11:27:28
某MMORPGで使っているからだったりして。

267 :デフォルトの名無しさん:2009/10/16(金) 12:17:07
ああ、別にROに限らず採用実績っていうのは使う基準に十分なるだろうし。

268 :デフォルトの名無しさん:2009/10/16(金) 12:25:08
組み込みに求められるのは速度と少ないメモリ消費だから
多少なりと癖があろうとlua使っちゃうんだよね
他に比べて採用例も多い分、多言語との連携も充実してるし

269 :デフォルトの名無しさん:2009/10/16(金) 12:53:36
ORMの次は、C/C++とスクリプトのマッピングだ、というアナロジーだけで
動いてるやつがいるような気がしてきた

270 :デフォルトの名無しさん:2009/10/16(金) 13:04:45
>>組み込みに求められるのは速度と少ないメモリ消費だから
なんで? 別にそれは前提条件にならないと思うけど。

オレはゲームシステムを組んでいるところだが別にメモリ消費量は大して気にしてないぞ。
速度は大切だが、どうせ1スレッドでは間に合わなくなるのでマルチスレッド化するし、
ボトルネックはスクリプト部分ではないので問題ない。

271 :デフォルトの名無しさん:2009/10/16(金) 13:14:26
ヤマハ RTX1200 に Lua 実行機能搭載だってさ
ttp://www.rtpro.yamaha.co.jp/RT/docs/lua/index.html

272 :デフォルトの名無しさん:2009/10/16(金) 13:17:06
AngelScript使おうぜ

273 :デフォルトの名無しさん:2009/10/16(金) 13:37:08
まぁ、なんだかんだでluaが一番なんだけどね

274 :デフォルトの名無しさん:2009/10/16(金) 13:58:37
>>273
俺はそうは思わないけどな……。
触ったことあるけど文法がちょっと癖あるし、整数型がないし。

Pythonの方がよっぽどいい。

275 :デフォルトの名無しさん:2009/10/16(金) 14:01:01
>>274
いやいや、個人的にではなく一般的にね
上でも出てるけど書籍や採用例が多いとかさ

276 :デフォルトの名無しさん:2009/10/16(金) 16:06:28
このスレはIronPython使いと、AngelScript使いが一人ずつ常駐してるんだなw

277 :デフォルトの名無しさん:2009/10/16(金) 17:20:01
こんだけで組み込み言語として使えるわけで、
ttp://alpha.mixi.co.jp/blog/?p=236

でもphpに組み込みってなんだ。
ttp://www.mediawiki.org/wiki/Extension:Lua
まあPECL拡張は2年前で止まってるみたいだけど

278 :デフォルトの名無しさん:2009/10/17(土) 00:50:19
PHPはインタプリタを組み込めないライセンスだからなー。
この制限さえなければ今までなかった用途が色々できると思うんだけど。

279 :デフォルトの名無しさん:2009/10/17(土) 15:11:07
>>278
??どういうこと?

280 :デフォルトの名無しさん:2009/10/17(土) 15:38:39
>>279
うう〜ん……。問われたので改めて調べてみたが、どうやら間違った認識が一部あったようだ。
PHPインタプリタ本体はPHP License 3.01で配布されていて、
こいつは
・配布するソースコードまたはドキュメントに著作権表示、ラインセンス本文を記載すること
・PHP Groupから許可を得ずにPHPという名前を使用しないこと
(PHP Fooやphpfooはだめ。Foo for PHPはOK)
・文言の表示強制("This product includes PHP, freely available from <http://www.php.net/>")

だけだな。インタプリタ自体を内蔵することは問題なさそう。
契約なしに内蔵できないのはZendライブラリなんだそうな。
(Zend Frameworkは修正BSDライセンス。Zendライブラリとは何ぞや?)

281 :デフォルトの名無しさん:2009/10/17(土) 23:30:49
ここでzlibライセンスのSquirrelとAngelScriptの出番ですね!


282 :デフォルトの名無しさん:2009/10/18(日) 01:54:10
luaスクリプト上でコルーチンを作成をした場合は
明確的に破棄する方法はないようなのだけどC側から

//コルーチンを実行するのスレッド(ステート)を作る
lua_State *L = lua_newthread(luaL_newstate());

//C側からコルーチンの操作

//コルーチンのスレッドを閉じる
lua_close(L);


とした場合はコルーチンを実行する為に確保されたメモリは解放されますよね?

283 :デフォルトの名無しさん:2009/10/18(日) 03:54:02
そいや、Ioって言語はどうよ?
シンプル、軽量というのが売りらしいが。

284 :デフォルトの名無しさん:2009/10/18(日) 09:02:18
>>282
lua_newthreadで作成したコルーチンはlua_closeしちゃ駄目だよ。
開放はGCにまかせる。>>121あたりから同じ様な質問出てるから見てみ。


285 :デフォルトの名無しさん:2009/10/18(日) 09:33:44
>>284
指摘ありがとうございます
つまりスタックに積まれたコルーチンのスレッドを
lua_popで削除すればいいのですか
でもそれだとGCまかせでスグにコルーチン破棄はされないので

>>282のを
//コルーチンを実行するのスレッド(ステート)を作る
lua_State *L = luaL_newstate();
lua_State *T = lua_newthread(L);

//C側からコルーチンの操作

//ステートを閉じる
lua_close(L);

とすれば閉じるのはコルーチンのステートではないものの
lua_newthread は元のステートのオブジェクトを共有するみたいなので
コルーチンで確保されたメモリも同時に解放されますよね?

286 :デフォルトの名無しさん:2009/10/18(日) 10:07:08
>コルーチンで確保されたメモリも同時に解放されますよね?

まぁ、そらそうだが。
任意開放ならlua_gcじゃ駄目な理由でもあるの?

287 :デフォルトの名無しさん:2009/10/18(日) 10:29:55
駄目な理由はないのだけど
GCという目に見えない物に頼るより
自分で明確的に管理したくて

288 :デフォルトの名無しさん:2009/10/18(日) 10:37:32
つまりC#くそくらえってことですね

289 :デフォルトの名無しさん:2009/10/18(日) 10:43:50
(#^ω^)

290 :デフォルトの名無しさん:2009/10/18(日) 11:14:07
(C#^ω^)

291 :デフォルトの名無しさん:2009/10/18(日) 11:22:19
(Ruby#^ω^)

292 :デフォルトの名無しさん:2009/10/18(日) 11:27:18
>>287
Luaでは文字列もテーブルも関数もuserdataもGCで管理されてる訳だが、そういうのも自分で管理したいの?

293 :デフォルトの名無しさん:2009/10/18(日) 11:31:28
>>292
そこまではこだわってないです
それらはスクリプトに自分で定義しないと生成されないから
ある程度は管理出来るので

294 :デフォルトの名無しさん:2009/10/18(日) 11:54:51
>>285
元のステートごと閉じてたら、そのコストがでかすぎて全然うれしくないと思われ。
GCいやな人は lua 使うな、が精神的には正しい。squirrel にしときなされ。

295 :デフォルトの名無しさん:2009/10/18(日) 12:06:48
>>283
遅い
検索しづらい

296 :デフォルトの名無しさん:2009/10/18(日) 12:07:49
>>283
言語としては面白いよ
組み込みも簡単に出来るし
でもWinの開発環境を整えるの面倒

297 :デフォルトの名無しさん:2009/10/18(日) 12:26:45
ネットでの検索しやすいのさは大切だよね
iPhone 3G S もジョブスが発表後に iPhone 3GS に改名させたそうだ


298 :デフォルトの名無しさん:2009/10/18(日) 12:28:16
> ネットでの検索しやすいのさは大切だよね
「ネットでの検索のしやすさ」の間違いです…


自分でワロタ


299 :デフォルトの名無しさん:2009/10/18(日) 12:37:33
>>294
>元のステートごと閉じてたら、そのコストがでかすぎて
具体的にkwsk

300 :デフォルトの名無しさん:2009/10/18(日) 13:09:55
>>299
や、普通にグローバルな関数や変数も全部毎回順次解放&登録しなおすハメになるじゃん
そういったコストを下げるために共有させる仕組みなのに本末転倒だろう

それぞれのスレッドが完全独立で頻繁に起動するものでもないのなら止めはしない。

301 :デフォルトの名無しさん:2009/10/18(日) 13:17:45
>>285を見る限りコルーチンを実行し終わった時に
不要になったのを解放するのだから問題ないでしょ

302 :デフォルトの名無しさん:2009/10/18(日) 14:09:07
実際にはluaL_openlibsが必要だからコストが大きいよ
擬似コードにはいちいち書かないだろうけど
擬似コードを書くとどうしても、目に見えない物に頼りがちだよね

303 :デフォルトの名無しさん:2009/10/18(日) 16:00:28
ちょっと前にLuaで乱数を作っていたものだけど
今度は重複しない乱数を表示させたいと思っている。
でも何度やってもできない。。。
ヒントだけでも教えてください

304 :デフォルトの名無しさん:2009/10/18(日) 16:05:01
そもそも重複しないものは乱数とは言わない。もはや lua とは関係ない話なので手頃なアルゴリズム系の質問スレに移るのをオススメする
ヒント:シャッフル

305 :デフォルトの名無しさん:2009/10/18(日) 16:19:02
>>304
レスありがとう

ということは、最初に規定量の数値を指定しておいてそれをシャッフルすればいいってことか!
ありがとう。

306 :デフォルトの名無しさん:2009/10/18(日) 16:59:56
個人情報が流出しても、ニュー速民は困る人いないよね?
http://tsushima.2ch.net/test/read.cgi/news/1255851428/

307 :デフォルトの名無しさん:2009/10/18(日) 23:54:16
(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);
}


309 :デフォルトの名無しさん:2009/10/24(土) 00:21:40
1つ1つのLuaステートをLua_yield使って個別に動かすのはダメなの?

310 :デフォルトの名無しさん:2009/10/24(土) 00:42:33
あれ もしかしてAngelScriptって結構良いんじゃね?
名前が可愛いからちょっと舐めてたわ

311 :デフォルトの名無しさん:2009/10/24(土) 00:51:08
>>310
できたら、どの辺りが気に入ったか詳しく

312 :デフォルトの名無しさん:2009/10/24(土) 06:30:35
ついでに、このスレに常駐しているAngelScript信者の方にお聞きしたいのだが、
LuaやSquirrelと比べて優れている点は何がありまんすか?

313 :デフォルトの名無しさん:2009/10/24(土) 06:39:49
//
/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ AngelScript!!
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ


314 :デフォルトの名無しさん:2009/10/24(土) 07:09:44
AngelScriptの@がよくわからん。
オブジェクトの参照なのか?

 Hoge@ hoge;

みたいなの。
C++みたいに、インスタンス入れる変数と参照がわかれているのか?(C++詳しくないからなんtねいったらいいかわからん)
LLなのに面倒な言語だな…
全部、デフォで参照でいいと思うんだが

315 :デフォルトの名無しさん:2009/10/24(土) 12:38:48
>>314
スクリプト言語の癖に静的型付言語だからなぁ。
それって本当に意味あるのか? って思ってしまう。

Booとかも触ってみてその動作速度は認めるけど、スクリプトの記述が面倒に感じる。

316 :デフォルトの名無しさん:2009/10/24(土) 13:28:09
ActionScript3.0 もいちおうスクリプト言語だけど、静的型付言語。
まぁ、インタプリタじゃないけどね。

317 :デフォルトの名無しさん:2009/10/24(土) 23:43:43
>>312
・文法がC++まんまなので書きやすい
・C++との連携が簡単
・クラスとかほぼそのまま使える
・const〜やenumなど、定数定義が可能
・#includeも可能
こんなところか?

>>314
その例だと、「Hogeクラスの参照型」って扱いになる。
C++のHoge &という記述に近い。

318 :デフォルトの名無しさん:2009/10/25(日) 00:41:08
スクリプトを自分で改造して使いたいんですが、ライセンスが緩くて
ソースが読みやすく短い組み込みライブラリのお勧めを教えてもらえませんか?
今のところLuaが最有力候補だと思ってます。

319 :デフォルトの名無しさん:2009/10/25(日) 01:10:08
Squirrelがソース短いんじゃなかったっけ。読みやすさは知らんが。

320 :デフォルトの名無しさん:2009/10/25(日) 05:11:42
>>319
実質としてはそんなに悪いコードではないが、しかし決して良いコードではない。
そして、SqPlusは絶対に読むな。頭が痛くなること請け合い。

それはそうと、Xtalのコードは大変いいと思うぞ。
言語自体の仕様は首を傾げたくなるところがあるが。

321 :デフォルトの名無しさん:2009/10/25(日) 08:12:58
         \   l´⌒\⌒\ \\ \
           \ ヽ   )  )   \\ \\   
              (   \ \∩___∩ \\ 
           \   \  ⌒⌒| ノ      ヽ  \\      
              \ \   /  ●   ● ト、\ \\\ 
               \  Y |    ( _●_)  ミ\  \\\  
               \ / 彡、_  |∪| ノ   \  \\\
                 (____)―ヽノ' ヽ      ̄ ̄ ヽ\\
                                \,  j  l l .l }
                         Lua!   l (_ノノノノ



322 :デフォルトの名無しさん:2009/10/25(日) 17:53:23
>>320
Xtalのコードは俺の頭じゃ解析不可能だからLua読んでます。

323 :デフォルトの名無しさん:2009/10/25(日) 18:55:12
SqPlus使おうと思ったらもう全然更新してないのか
いったいどれにすれバインダ

324 :デフォルトの名無しさん:2009/10/25(日) 20:22:51
そもそもSquirrel自体全然盛り上がってないというか終わってるというか
始まる前に終わっちゃったよ的な

325 :デフォルトの名無しさん:2009/10/25(日) 20:29:35
Lua 5.2まだー

326 :デフォルトの名無しさん:2009/10/25(日) 22:01:57
>>323
SqPlusはダメすぎる、忘れましょう、使ってる人はたぶんいません
squirrelのバインダは自分で使い易いように自分で書いた方が1024倍マシよ

327 :デフォルトの名無しさん:2009/10/25(日) 22:15:15
そこでバインダとか無くても全然問題のないAngelScriptの出番だな

328 :デフォルトの名無しさん:2009/10/25(日) 22:36:22
>>326
ごめん、動いてるものはさわるな原則にのっとって使い続けてる^^;
一部手はいれてあるけど。
時間あったら新しいバインダにしたいんだけどなかなか……

329 :デフォルトの名無しさん:2009/10/25(日) 23:08:08
スクエニのゲームはSqPlus使ってるって
cedecのスライドに書いてあったよね。

330 :318:2009/10/26(月) 01:03:53
SquirrelとXtal読んでみます。
ありがとうございました。

331 :デフォルトの名無しさん:2009/10/26(月) 02:05:58
こうなったらLuaとSquirrelとAngelScriptの合わせ技でいくか

332 :デフォルトの名無しさん:2009/10/26(月) 14:10:36
angelscript初めて知った。いいなこれ!!
スタックゴニョゴニョしなくていいからコード読みやすいし
なによりデフォルトでメモリ上から「のみ」スクリプトコードをロードできるってのがイイ!
ゲーム開発だと裸のままスクリプトファイルが置いてあることなんてないからね。。。
モジュールのロードとかもオブジェクト指向で非常に素直に書けるぽいし
さっそくLuaを破棄して組み込んでみよう

333 :デフォルトの名無しさん:2009/10/26(月) 14:25:29
AngelScript つかう場合は、これ C++ だけでよくね?という思考に陥らないように注意な


334 :デフォルトの名無しさん:2009/10/26(月) 16:01:05
まんまC++なのがメリットでありデメリットでもある

335 :デフォルトの名無しさん:2009/10/26(月) 20:39:28
>>AngelScript つかう場合は、これ C++ だけでよくね?という思考に陥らないように注意な
前使おうとして陥った
ちょっと聞きたいんだが、AngelScriptを使っている人や使わなくなった人(他の言語に移った人)は
なんで使っている、使わなくなった?

C++そのままというか継承に制限があるのが大きくてSquirrelに移ろうと思ってるんだけど、
他の人はどう思ってるのか気になる
アプリ実行時にちょこちょこ書き直したり、コンパイル/リンク時間の省略とかスクリプト自体の
メリットは分かるんだが…


336 :デフォルトの名無しさん:2009/10/26(月) 21:10:20
コルーチン

337 :デフォルトの名無しさん:2009/10/26(月) 23:17:06
コルーチン

338 :デフォルトの名無しさん:2009/10/26(月) 23:21:46
チンコール

339 :デフォルトの名無しさん:2009/10/27(火) 08:20:18
           ∩_
           〈〈〈 ヽ
          〈⊃  }
   ∩___∩  |   |
   | ノ      ヽ !   !
  /  ●   ● |  /
  |    ( _●_)  ミ/ Lua!!
 彡、   |∪|  /
/ __  ヽノ /
(___)   


340 :デフォルトの名無しさん:2009/10/27(火) 09:35:24
>>335
C++との連携が簡単、C++クラスをほぼそのままで使える、複数のコンテキスト(LuaStateに相当?)を同時に処理させるのも簡単、
定数定義や列挙型も使える、といった点が便利なんで使ってる。

特にC++との連携はLuaやSquirrelより簡単だし、マニュアルもサンプルも英語だけどわかりやすい。

341 :デフォルトの名無しさん:2009/10/27(火) 18:19:47
コルーチン

342 :デフォルトの名無しさん:2009/10/28(水) 00:13:00
AngelScriptに乗り換えようかな
細かいとこがc++と違和感無くて簡単だわ

343 :デフォルトの名無しさん:2009/10/28(水) 04:00:43
そこで敢えてPawnという選択肢も

344 :デフォルトの名無しさん:2009/10/28(水) 04:39:16
コルーチ

345 :デフォルトの名無しさん:2009/10/28(水) 13:47:14
AngelScript と Luaって
メモリ消費や処理速度はどれほど違う?

346 :デフォルトの名無しさん:2009/10/28(水) 14:09:25
   /ヽ /ヽ
  ':' ゙''"  `':,
  ミ   ・ω・ ;,
 :; . っ     ,つLua!
  `:;      ,;'
   `( /'"`∪


347 :デフォルトの名無しさん:2009/10/28(水) 14:17:51
Pawnつえーな、使い勝手とか全然知らないけど
ttp://codeplea.com/game-scripting-languages

348 :デフォルトの名無しさん:2009/10/28(水) 14:48:51
これ見るとリス使いの俺涙目だわ

349 :デフォルトの名無しさん:2009/10/28(水) 15:50:27
・メモリ消費低
・静的型付
・スレッドセーフ
・スタック操作なし(またはLuaより容易)

で選ぶとしたら
やっぱりAngelScriptがいいのかな〜

350 :デフォルトの名無しさん:2009/10/28(水) 15:51:52
おなじくリス使いの俺涙目(笑)

まあ、リスはわかりやすいからいいんだよ!とか言ってみる。
でも Pawn の性能は魅力だな。とりあえず組み込みテストして
みてよさそうなら、静的スクリプト言語としての併用もかんがえてみよう

351 :デフォルトの名無しさん:2009/10/28(水) 15:53:37
まあなんとかとかんとかはトレードオフってやつだな

352 :デフォルトの名無しさん:2009/10/28(水) 18:03:22
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)


354 :デフォルトの名無しさん:2009/10/28(水) 18:39:16
>>353
すんまそ、環境を書いてなかった。
Squirrel 2.2.3 stable
VisualC++, cygwin, Linux, 何れでも発生。
Squirrel 3はまだ試していません。

355 :デフォルトの名無しさん:2009/10/29(木) 12:22:06
Pawn Language Guide っていうドキュメントみてみたけど、無名関数がつくれないっぽいね。
だとするとクロージャが作れないから、ちょっと不便かな。
状態遷移とかの記述に特化しているようだし、UnrealScript に似ているかも。


356 :デフォルトの名無しさん:2009/10/29(木) 17:27:53
347のリンク先見て思ったが、GameMonkeyが何気に性能いいな。

357 :デフォルトの名無しさん:2009/10/29(木) 20:25:50
>>353
拙い英語ですが報告しておきました。
temp_regがメタメソッドコール前にhookで使われるのが一因っぽいです。


358 :デフォルトの名無しさん:2009/10/30(金) 04:54:40
Squirrel フォーラムに代理の報告をしてもらえるなら、 sq_mem.cpp をはじめ
メモリ確保失敗についてまったく考慮してないのを修正してくれ、と頼んでみて
もらえまいか?

組み込み言語としてリソースの乏しい環境で使うことを考えれば、メモリ確保が
失敗しないなどという前提で組まれるとツライものがある。

359 :デフォルトの名無しさん:2009/10/30(金) 04:56:12
s/sq_mem/sqmem/

360 :デフォルトの名無しさん:2009/10/30(金) 04:57:50
なんで自分で報告しないのん?

361 :デフォルトの名無しさん:2009/10/30(金) 05:00:20
残念ながら英語で会話ができる自信がない。
リファレンスマニュアルを読む程度ならなんとかなるんだけど。

362 :デフォルトの名無しさん:2009/10/30(金) 05:20:40
パッチ作って送れば英語できなくてもだいじょぶじゃないかな。
here is a patch for memory allocation error
とか一文だけ書いとけば通じると思う。

363 :デフォルトの名無しさん:2009/10/30(金) 05:42:29
うーん。問題はコード全体に散らばってるんで、まずは全体的な方針をはっきり
決めてからじゃないとマズイ感じ。

sq_malloc や sq_realloc がいくつかのマクロを通して間接的に使われてるんだけど、
どれも呼び出し元で NULL が返ってくることが考慮されてない。

典型的なのは配列伸ばすのに p = SQ_REALLOC(p,oldsize,newsize) してるところ。
NULL 返したら元の領域がリークするうえに後続のコードでは確保成功したものとして
余裕でアクセスしてくる。

最初は、C++だからsqmem.cppの関数から例外投げろってことかと思ったんだけど、
呼び出し側で例外の発生も考慮されてないからまた別の理由でリークするし。

364 :デフォルトの名無しさん:2009/10/30(金) 10:21:32
AngelScriptでマルチバイト文字列を使おうとする場合の不具合も報告したほうがよさそうなんだけどなぁ…

365 :353:2009/10/30(金) 14:26:46
>>357
ありがとう!!

366 :デフォルトの名無しさん:2009/10/30(金) 17:39:48
>>364
なんか不具合あるの?
AngelScript試してみようと思ってるんで気になる
UTF8扱いたいんだ

367 :デフォルトの名無しさん:2009/10/30(金) 17:48:06
>>366
ライブラリをビルドする際にプリプロセッサでAS_DOUBLEBYTE_CHARSETを定義するんだけど、
それやるとビルドでエラーが出ちゃう。
しかもマルチバイト文字かシングルバイト文字かを判定するやり方もマズい。

最新版出るたびに毎回そこ修正してるよ。

368 :デフォルトの名無しさん:2009/10/30(金) 19:04:19
それは本家に報告してあげればみんな幸せに

369 :デフォルトの名無しさん:2009/10/30(金) 23:19:35
>>367
ソース弄ってみるよ

370 :デフォルトの名無しさん:2009/10/31(土) 00:09:14
>>221
それ新しい版では修正されてたと思った。


371 :デフォルトの名無しさん:2009/10/31(土) 10:39:11
AngelScriptでUTF8を使う場合、ソースの修正なくても、

asIScriptEngine *lpEngine=asCreateScriptEngine(ANGELSCRIPT_VERSION);
lpEngine->SetEngineProperty(asEP_SCRIPT_SCANNER, 1);

みたいな感じでエンジンの設定すれば大丈夫だったと思う。

372 :デフォルトの名無しさん:2009/11/01(日) 23:04:23
あら、ありがと

373 :デフォルトの名無しさん:2009/11/02(月) 06:54:37
AngelScript2.17.2で試してみた
UTF8はデフォルトでサポートしてるっぽく読めたんでDLしたまんまビルド
static const char* scriptString =
"void hellow()"
"{"
" Print( \"hellow world\" );"
" Print( \"UTF8テスト\" );"
"}";
とりあえずこれOKだった
ホストへstd::stringで渡せたり楽だわあ

374 :デフォルトの名無しさん:2009/11/02(月) 13:25:04
次の更新でUTF16もサポートするみたいなことが書いてあるね

375 :デフォルトの名無しさん:2009/11/03(火) 16:16:50
>>374
それできたらShitJIS対応の改造しなくて済むな。

376 :デフォルトの名無しさん:2009/11/04(水) 10:58:55
Linuxでx64運用してるんだが、ファイルをHDD中でコピーするだけでファイルが壊れてしまう状態になって、
パーツを電源も含めて色々入れ換えてみたところ、
SATAケーブルをノイズに強いタイプに変更したら改善した。

残念ながら完全には直ってないようだけど、十分実用レベルには戻った。
資金に余裕ができたらHDD買い足してパーティションを作り直そう……。

377 :デフォルトの名無しさん:2009/11/04(水) 10:59:54
おっと。スレ違いスマン。

378 :デフォルトの名無しさん:2009/11/07(土) 09:41:07
pawnダウンロードして、マニュアル読みながらcmake使ってVC++用のプロジェクトファイル作るところまではできたんですが…
プロジェクト開いても、なんかファイル構成がよくわからないです。
もしかしてこれ、コンパイラとVMが別のプロジェクトファイルになっているんでしょうか?
luaみたいに、単純にヘッダファイルとlibファイルだけが欲しいんですが…
もしかしてDLLしかない??

379 :デフォルトの名無しさん:2009/11/07(土) 16:02:52
>>378
pawnについていいなと思い試してみたはいいものの
詳しく使おうとするにつれてファイル構成が?で
投げ出した俺と同じ状態だね
確かにあれはわかりにくい

380 :デフォルトの名無しさん:2009/11/08(日) 02:12:15
>>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 っぽい。

381 :デフォルトの名無しさん:2009/11/09(月) 16:15:58
となると、マルチバイト判定用のコールバック関数を登録できるような改造した方がいいのかな。
2箇所いじれば大丈夫っぽいし。

382 :デフォルトの名無しさん:2009/11/10(火) 04:57:26
>>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と直接は関係ない話でゴメン。

384 :デフォルトの名無しさん:2009/11/10(火) 09:30:35
試してないけどソース見る限り、UTF-16用の文字コードクラス使うと、
文字列長取得時にサロゲートペアのことも考慮してるようだ

他の文字コード用のも、一文字進めるとか比較とかも変えられるようにはしているようではあるが、
今のところ文字単位での文字列長取得しか違いはないようだ

385 :デフォルトの名無しさん:2009/11/11(水) 11:02:15
AngelScript、TCHARとかにも対応できて、Unicodeとマルチバイトのどっちでもビルドできるようにしたいが、
かなりの大部分を修正しないとダメだなぁ…
Squirrelは最初から対応してるみたいだけど。

386 :デフォルトの名無しさん:2009/11/11(水) 22:18:49
// .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;
}


387 :デフォルトの名無しさん:2009/11/11(水) 22:20:25
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ができている。それがコンパイラ。


388 :デフォルトの名無しさん:2009/11/11(水) 23:56:32
Goのビルドが早いらしいので期待age

389 :デフォルトの名無しさん:2009/11/12(木) 00:07:43
ttp://jp.techcrunch.com/archives/20091110google-go-language/

390 :デフォルトの名無しさん:2009/11/12(木) 13:31:44
そのGoって組み込みじゃないんじゃ・・・・

391 :デフォルトの名無しさん:2009/11/12(木) 17:18:47
ゴルーチン

392 :デフォルトの名無しさん:2009/11/12(木) 23:59:48
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のような気がする

393 :デフォルトの名無しさん:2009/11/13(金) 00:23:26
you ain't gonna need it

394 :デフォルトの名無しさん:2009/11/13(金) 11:03:02
GCサポートとあるけどc++好きにはウケナイ気がする
GC無しでc++的にガチガチに使えるなら使いたい
c++は0xも控えてるしGoは微妙な位置に落ち着きそう

395 :デフォルトの名無しさん:2009/11/13(金) 11:47:27
そういや0xって後50日くらいで終了するんだなぁ

396 :デフォルトの名無しさん:2009/11/13(金) 12:51:11
C++0xはコンセプトを捨てて再調整中で、まだ時間がかかるようだ
最近はC++1xと呼ばれている・・・

397 :デフォルトの名無しさん:2009/11/13(金) 12:52:17
っていうか検索しにくさでDに勝負挑んでんの? って感じのネーミングなんだが……。

398 :397:2009/11/13(金) 13:00:17
あ、ごめんなさい誤爆。Dスレに投げたつもりだった……。

399 :デフォルトの名無しさん:2009/11/13(金) 18:49:47
Squirrelの画像検索のしにくさよりはましだろ

400 :デフォルトの名無しさん:2009/11/13(金) 19:04:49
16進数だと思って欲しいだって
びょーん?さんのお知らせ

401 :デフォルトの名無しさん:2009/11/14(土) 02:54:01
で、誰かPawnつかってみた? 激高速ぽいし、静的型付けで余計なバグも少なそうだし、かなり使えそうだけど…


402 :デフォルトの名無しさん:2009/11/14(土) 21:13:23
>>388
GoはLinuxとMacにしか対応していません。

403 :デフォルトの名無しさん:2009/11/15(日) 21:54:06
この手の組込スクリプトエンジンをShiftJIS対応させる場合、基本的にWindows用に組んじゃって大丈夫なのかな。
Unicode対応させる場合はWindowsだけじゃダメだよね?

404 :デフォルトの名無しさん:2009/11/15(日) 23:22:05
修正を公開するつもりが無いならどうしたって構わないよ
#ifで切り分けるくらいはしておけばいいんじゃないか

#if (defined WIN32)
 実装
#else
 naiyo!!
#endif

これならWindows以外で使いたい人が中を見て、流用できそうならそうすることも出来るだろう

405 :デフォルトの名無しさん:2009/11/15(日) 23:56:52
thx!

406 :デフォルトの名無しさん:2009/11/16(月) 00:09:23
>>404
上手くいけば公開しようかなと思ってる。
ただ、Windowsでしかプログラム組んでないんで、Linuxでもちゃんと動くようにするための技法とかさっぱりわからないんだ。

ちなみにShiftJIS対応は簡単だけど、Unicode対応はソースあちこちいじらないとダメなんで無理かも…

407 :デフォルトの名無しさん:2009/11/16(月) 07:08:38
UTF-8でもなければUCS2やUTF16でもなく、UNICODEと言っている時点で、
何にも分かってないのが丸わかりだからやめておけ。

408 :デフォルトの名無しさん:2009/11/16(月) 08:00:11
   /ヽ /ヽ
  ':' ゙''"  `':,
  ミ   ・ω・ ;,
 :; . っ     ,つLua!
  `:;      ,;'
   `( /'"`∪


409 :デフォルトの名無しさん:2009/11/16(月) 08:10:51
ぅあたんおはよう

410 :デフォルトの名無しさん:2009/11/16(月) 10:48:18
しかし、今時ShiftJISはねえなあw

411 :デフォルトの名無しさん:2009/11/16(月) 11:48:04
WindowsだとまだShiftJIS現役だしなぁ…

412 :デフォルトの名無しさん:2009/11/16(月) 13:12:23
WindowsのNTFSのファイル名とかUTF-8にする方法ある?

413 :デフォルトの名無しさん:2009/11/16(月) 13:25:40
それ以前に一つ確認しておくが、NTFSのファイル名のエンコードがどうなっているのかは理解しているのか?

414 :デフォルトの名無しさん:2009/11/16(月) 14:27:33
ICUとか無駄にでかいのを勧めてみる
そういう話じゃないんだろうけど、Windows依存の話はもう勘弁しておくれなんし

415 :デフォルトの名無しさん:2009/11/16(月) 14:56:21
ファイル名ってUNICODEじゃなくてmbcsだろ
mbcsにUTF-8そのまま突っ込んでもファイルは出来るが
望みのものにはならない訳で


416 :デフォルトの名無しさん:2009/11/16(月) 15:05:36
http://www-06.ibm.com/jp/domino01/mkt/cnpages7.nsf/page/default-007ACA9B

417 :デフォルトの名無しさん:2009/11/16(月) 17:13:46
>>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 対応が行われる。

418 :デフォルトの名無しさん:2009/11/16(月) 17:18:13
ファイル名の場合、NFDにも注意ね

419 :デフォルトの名無しさん:2009/11/16(月) 17:23:01
>>418
OSX はさっさと直せよと思う。まじで

420 :デフォルトの名無しさん:2009/11/16(月) 18:20:29
Microsoftのコンパイラは wchar_t は2byteなので、全部一文字って訳にはいかないです
サロゲートペアに対応させようとかおもった場合は手動で処理してやらんとダメです。
少なくともVS2008時点では、_tcsincやCharNextといった ポインタを進める関数がサロゲートペアをちゃんと処理してくれない
(おそらくOSがサロゲートペアに対応する前のコードとの互換性を気にしてるのだろう)
もっとも、クロスプラットフォーム名コード書くなら、CharNextとか使わずに自前で処理してるだろうけど・・・

421 :デフォルトの名無しさん:2009/11/16(月) 19:20:13
書かれてる事の意味が解らないままレスする人多すぎ
ここが組み込み系言語のスレな事も考えず読んでる人も多すぎ

422 :デフォルトの名無しさん:2009/11/16(月) 22:46:16
>>420
落ち着いて考えるんだ。
組み込みスクリプトごときでサロゲートペアが関係してくるようなややこしい話がどれくらいある?
まあ、議論自体は有意義だとは思うが。

423 :デフォルトの名無しさん:2009/11/16(月) 22:52:23
素直にTRONコードを使え

424 :デフォルトの名無しさん:2009/11/16(月) 23:33:37
とりあえずVSで使う時に、文字セットを「Unicode文字セットを使用する」にしてちゃんと使えればそれでOkだな。
Squirrelはデフォでいけたが。

425 :デフォルトの名無しさん:2009/11/17(火) 10:17:44
知れば知るほどVSなんぞ捨てた方がマシ
UTF8はBOM有り前提とか諸々腐ってるし(VS2005までしか知らんけど)
Windows環境で作業しなきゃならんなら
gcc、devc++、エディタ、こんだけでいいよ

426 :デフォルトの名無しさん:2009/11/17(火) 10:23:35
>>425
お前……VisualStudioまともに使いこなせてないだけだろ?
UTF-8 BOM付きなんて使う機会ほとんどないぞ。

427 :デフォルトの名無しさん:2009/11/17(火) 10:28:50
VSでエンコード付きテキストエディタを指定するとUTF-8はシグネチャ付きとなしと両方選べる。
つまりどっちも扱える。

428 :デフォルトの名無しさん:2009/11/17(火) 10:47:43
IDEの方に問題は出ないが、VCのコンパイラ側がBOM無しだと、
文字コードの認識に失敗する。

429 :デフォルトの名無しさん:2009/11/17(火) 11:18:43
ttp://msdn.microsoft.com/ja-jp/library/xwy0e8f2%28VS.100%29.aspx
BOM無しUTF-8の時 文字コードの認識に失敗するんじゃなくて、そもそも対応していないだけ
IDEでBOM無しUTF-8で保存可能なのは、ドキュメントとか編集するときのためだろうか?

430 :デフォルトの名無しさん:2009/11/17(火) 23:42:08
Squirrel 2.2.4 stable来てるね
3.0もbeta1になった

431 :デフォルトの名無しさん:2009/11/18(水) 09:19:38
おー、Squirrelのバージョンアップまじか
色々バグ修正されてるのかな
BuildとShift-JISパッチ入れるのめんどくさいけど、今夜試してみるわ

432 :デフォルトの名無しさん:2009/11/19(木) 04:33:19
>>429
WEBの世界だとそれが標準だからだと思うよ>BOM無しUTF-8で保存可能
Visual Web Developper あわせの対応であって、VC はスルーされてるってことかと。

コンシューマ機が UTF-8 ベースに移ってるのでそれあわせでコード共有しようとするときに地味に困る > VC がUTF-8をまともに扱えない
BOM つけると今度は gcc がこけるんだぜ……

433 :デフォルトの名無しさん:2009/11/19(木) 10:47:44
LuaでLua_Stateの解放をせずに、グローバル変数等の環境を個別に初期化する
サンプルはどこかにないでしょうか?

434 :デフォルトの名無しさん:2009/11/19(木) 11:56:04
グローバル環境を空のテーブルに置き換えるのって
普通にできんかったっけ?

435 :デフォルトの名無しさん:2009/11/19(木) 12:37:17
じゃあこんな感じで良いのかな?

Lua_State *L;

〜 一回load、callして使用 〜

lua_newtable(L);
lua_setfenv(L, LUA_GLOBALSINDEX); //グローバル変数だけ初期化される?

lua_gc(L, LUA_GCCOLLECT, 0); //念のためにGCも走らせるべき?

〜 Lにまたloadして再利用 〜

436 :デフォルトの名無しさん:2009/11/19(木) 18:16:26
426の読解力に溜息が出るよ

437 :デフォルトの名無しさん:2009/11/20(金) 08:36:36
>>429
UTF-8てそもそも既存のシステムに手をなるべく加えないで動かすための文字コードじゃないのか?
よくわからんな

438 :デフォルトの名無しさん:2009/11/20(金) 08:45:59
そもそも文字列はハードコーディングするべきじゃない。
外部リソースとして、入出力時にコードを調整すればいいだけのこと。

439 :デフォルトの名無しさん:2009/11/20(金) 08:49:56
print loadstring(0x34d3a6b8);

こんなプログラミングが歓迎されるんですね

440 :デフォルトの名無しさん:2009/11/20(金) 09:00:17
>435 を試してみたのですが、lua_setfenvだとグローバル環境の操作は無理なようです。
グローバル環境テーブル全体に対する操作関数って無いのでは?

441 :デフォルトの名無しさん:2009/11/20(金) 09:34:40
>>438
スクリプトを読み込んだ際に特定の文字コードに変換して、内部の処理はその文字コードで統一って感じかな?
だとすると、何に変換するのがいいんだろう。UTF16?

442 :デフォルトの名無しさん:2009/11/20(金) 09:47:54
スクリプトファイルは基本UTF-8、
ネイティブに引き渡すときはUTF-16、面倒ならUCS2にするのが一番問題が少ない。

443 :デフォルトの名無しさん:2009/11/20(金) 11:51:20
>>437
その恩恵にあやかれるのはASCIIコードしか使ってない欧米人だけだけどな。
非ASCIIコード圏は、既存のエンコード方式と区別ができないので余計に混乱する。

全てのプレーンテキストがUTF-8に置き換わるまでの過渡期は、BOM付きUTF-8が
一番無難な選択だと思うけどね。

俺はWindows上でgccとか使わないので、FTPクライアントにBOMの有無を変換する
機能さえついてくれればあまり問題ない。

もっとも、MSは独自にBOM付きUTF-8を強行するのではなく、非ASCIIコード圏で
過渡期にはBOMが必要であることを訴えて、規格に盛り込ませるべきだと思うが。

444 :デフォルトの名無しさん:2009/11/20(金) 12:26:22
>>437
「ファイルの中身」自体が最大のレガシーシステム。だから UTF-8 が使われるようになってる。
日本人は一度 SJIS やら EUC やらで通った道をもっかい世界規模で通り直してるだけではある

>>438
なにが一番困るって、ファイル名中の「コメント」

コメントに日本語つかうな?ごもっとも(苦笑)



445 :デフォルトの名無しさん:2009/11/20(金) 12:27:06
ファイル名中じゃねえ、ファイル中

446 :デフォルトの名無しさん:2009/11/20(金) 12:31:33
>>443
> 全てのプレーンテキストがUTF-8に置き換わるまでの過渡期は、BOM付きUTF-8が
> 一番無難な選択だと思うけどね。

この上の記述はわかるし、それはよくわかるんだが、
実際はBOM付きでトラブることが多くて、俺は折れたわw
BOMなしで上手く行くようにすべき

447 :デフォルトの名無しさん:2009/11/20(金) 12:44:29
あ、437 のいってること完全によみちがえてたや。すまん。

動作上は問題ないに決まってるんだから、ツールで対応できない意味がわからんってことだな。

既存エンコードと混在したのを自動判定する必然性は別にないんだから、
ツール側に「MBCSではなくUTF-8として扱う」スイッチだけつければすむことだ。
MS1社が対応するだけで世界は平和になるんだからさっさとそうしてくれってことだな

448 :デフォルトの名無しさん:2009/11/20(金) 12:56:28
>>443
もう手遅れ
MSがいまだにSJISを強行している時点で終わってる

449 :デフォルトの名無しさん:2009/11/20(金) 13:38:56
SJISを強行しているように見えるのはロケールを日本語にして使っているからなんだが、
なんでそんなに視野が狭いんだろう?

ちなみにOSのロケールを英語にすると、UTF-8も無しでコンパイルが通るぞ。

450 :デフォルトの名無しさん:2009/11/20(金) 13:40:42
BOM無しで

451 :デフォルトの名無しさん:2009/11/20(金) 13:58:43
thx!
おまいあたまいいな

452 :デフォルトの名無しさん:2009/11/20(金) 14:03:05
>>449
L"日本語" って正しく通る?

453 :デフォルトの名無しさん:2009/11/20(金) 14:12:51
ロケール変えて見た
こりゃええわw
まともなアプリと糞アプリの違いが一目瞭然になったw

454 :デフォルトの名無しさん:2009/11/20(金) 14:16:50
やっぱりコマンドプロンプトは糞のままだったw

455 :デフォルトの名無しさん:2009/11/20(金) 14:23:06
http://boost.cppll.jp/HEAD/
このサイトが初めてエンコード選ばなくても
日本語で文字化けせずに表示されましたw
ほんとうにありがとうございましたw

456 :デフォルトの名無しさん:2009/11/20(金) 14:24:23
日記はチラ裏で

457 :デフォルトの名無しさん:2009/11/20(金) 14:41:12
>>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
>>457
ああごめん
ここのことね
http://boost.cppll.jp/HEAD/libs/date_time/doc/BuildInfo.html


460 :デフォルトの名無しさん:2009/11/20(金) 14:50:07
スレ違い

461 :デフォルトの名無しさん:2009/11/20(金) 17:39:18
質問どうぞ

462 :デフォルトの名無しさん:2009/11/20(金) 20:08:17
>>440
lua_replace(L, LUA_GLOBALSINDEX)
ならどう?

463 :デフォルトの名無しさん:2009/11/21(土) 08:14:53
>>462
できました!
ありがとうございます

464 :デフォルトの名無しさん:2009/11/21(土) 09:04:14
Luaのテーブルってキーを使ってアクセスするようになってますが、
キーが分からない場合に全ての項目を調べたい時のサンプルってありますか?

465 :デフォルトの名無しさん:2009/11/21(土) 09:14:26
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せずに再使用するのは大変みたいですね。

467 :デフォルトの名無しさん:2009/11/21(土) 10:09:26
>>465
thx
pairsやnextでなめれるんですね

468 :デフォルトの名無しさん:2009/11/21(土) 10:14:16
lua_openlibは副作用でレジストリにも変更加えるからじゃね?
走らせたいチャンクを一旦スタックに積んで
そいつの環境を置き換えるのはどう?

469 :デフォルトの名無しさん:2009/11/21(土) 10:56:34
>>468
具体的なやり方が今一思いつきません。
load〜で積んだあとに空の環境に置き換えるって意味じゃないですよね?

470 :469:2009/11/21(土) 11:03:04
そもそもスクリプト側で使ったグローバル"変数"だけ初期化して
ライブラリ等のテーブルは使いまわせたらlua_Stateの再構築の
コストを減らせて、細かいスクリプトの連続呼び出しに良いのではと
考えていたんですが、Luaは変数も関数もその他色々もテーブル分けて
ないので、選択的に変数だけで消すのに無理がある気が・・・


471 :デフォルトの名無しさん:2009/11/21(土) 11:04:51
何でデフォの宣言がglobalなんだろうかね・・・

472 :デフォルトの名無しさん:2009/11/21(土) 11:52:21
>>469
いや、そういう意味。走らせるチャンク毎に独自の環境を差し込む。

luaL_openlibsに関しちゃ対象がグローバル環境決め打ちのサポート関数でしかないんで
どのみち使えないんだけど、そこはチャンクの環境に差し替えるテーブルの__indexにフックかけて
グローバル環境に委譲してしまうって感じでどうか。

これならlocalをつけない変数宣言はチャンク毎の独自の環境に登録されるだけなので
グローバル環境の汚染も防げる。やってることはmodule関数と大体いっしょ。

コード書いて検証したわけじゃないのでうまくいくかは知らんw

473 :デフォルトの名無しさん:2009/11/21(土) 13:01:22
--ライブラリ等のテーブル_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
なるほど、こうやるのですか。
ありがとう!

475 :デフォルトの名無しさん:2009/11/22(日) 10:32:35
ゲーム内にN個のオブジェクトが存在する。
それぞれのオブジェクト固有の状態を保存するために、Cプログラム側でN個のテーブルを用意する。
オブジェクトの行動を定義したluaファイルをロードしてlua_Stateインスタンスを作る。
オブジェクトはN個だが、このインスタンスは1つしか作らない(みんな行動パターンは共通なので)
で、個々のオブジェクトの状態を更新するときに、そのオブジェクトに対応するテーブルを引数にして
lua関数を呼び出し、テーブルを更新させる。

というのをやりたいのですが、N個のテーブルを作るのが「?」です。
テーブル作ってスタックに積むのはいいんですが、なんせスタックに積むわけですから、
どこかの操作で勝手にPOPされたり、消えたりしませんかね??


476 :デフォルトの名無しさん:2009/11/22(日) 12:35:08
>>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 としてスタックから取得して
保持できる。概念としてはこっちのがシンプル。


477 :デフォルトの名無しさん:2009/11/23(月) 03:18:07
ぶった切りすいません

luaは組み込みに最適だと思うんですが、
lua単独でGUIを表示してゲームを作り、実行ファイル(exe)に変換はできるのでしょうか?

もしできるなら、教えてください。
ぐぐっても探すことができなかったので・・・

478 :デフォルトの名無しさん:2009/11/23(月) 04:22:36
自前で組み込むの前提の言語でそういうもの作ってもあまり嬉しくないのでだれも作ってないと思います

479 :デフォルトの名無しさん:2009/11/23(月) 05:02:50
言ってることが良く分からないが、Lua単独ではGUIは無理だと言っておく
そもそもこのスレで紹介されてる言語は、用途を特定しないスクリプトであって組み込んでどのように動かすかはその人次第
そういう用途なら○○ツクールやHSPにしておきなさいな

480 :デフォルトの名無しさん:2009/11/23(月) 08:23:05
厳密には単独ではないけど、Luaのモジュールか何かでSDL使うのとか無かったっけ?

481 :デフォルトの名無しさん:2009/11/23(月) 09:34:33
自分でGUI処理の組み込み部分を作り、スクリプトリソースをリンクすれば、
単独exeに出来るだろ。

482 :デフォルトの名無しさん:2009/11/23(月) 10:12:43
>>477
その用途なら、Pythonじゃね?

483 :デフォルトの名無しさん:2009/11/23(月) 12:08:15
I think so.

484 :477:2009/11/23(月) 16:28:01
みなさん、レスありがとうございます。

どうしてもluaでゲームを開発しなくてはいけない状況なのです。
ウィンドウの表示がわからないため、苦戦しています。
どの参考書を読んでも書いてなくて。

別の言語にウィンドウを作らせて、動作はLUAだけで、などでできますでしょうか?

485 :デフォルトの名無しさん:2009/11/23(月) 16:30:06
>>484
なんでできないと思うの?

486 :デフォルトの名無しさん:2009/11/23(月) 16:38:15
>>485
レスありがとう

みんなやってないし、コマンドプロンプト上か
ほかの言語に組み込むだけのものかと思いまして・・・

487 :デフォルトの名無しさん:2009/11/23(月) 16:46:43
http://aims.dna-softwares.com/
こことか見てみ
Luaを主体にしたゲームエンジン作って、このサークルのソフトは殆どLuaで作られてる

それにしても、その知識量からどうしてもLuaで作らなきゃいけない状況が発生するなんて
いったいどんな大見得切ったんだよ

488 :デフォルトの名無しさん:2009/11/23(月) 16:53:23
参考書読んだのなら、Luaを使っている人がどのような目的と仕組みで走らせるのかは理解した?
あくまで組み込みスクリプトなんだよ?
ウィンドウズを表示するという関数を組み込んでもらって、
Luaにインターフェース提供してもらわないとprintやscanすらままならないよ
ゲーム開発でスクリプタとして働くのならLuaの言語仕様を覚えるのと、PGからバインドした関数一覧もらってこれば良いよ

489 :デフォルトの名無しさん:2009/11/23(月) 17:00:01
レスありがとう

正直、大学のゼミでこの言語を使うということに決めたんです
いくつもある言語から選んで、luaを選んだのは自分だけ。
頼る人もいないので、本とネットで勉強してるかんじです。

>>487
サンプルをdlして参考にしていますが、難しい。
もっとじっくり読んでみます。

>>488
用途は理解しているつもりですが、これをメインにしてプログラムを組んでいかなくてはいけなくて・・・
やはり、ウィンドウを表示する関数をCなどで書いて、luaからその関数を持ってくることが一番楽なんですかね。

490 :デフォルトの名無しさん:2009/11/23(月) 17:11:31
明日、学校でごめんなさいして
もっと詳しくて質問できる奴のいる言語で
最初からやり直す方がましのような気がする。

491 :デフォルトの名無しさん:2009/11/23(月) 17:13:36
>>490
それはしたくないというか、結構この言語は気に入っているので辞めたくないんですよ

492 :デフォルトの名無しさん:2009/11/23(月) 17:17:17
それでここきてなんとかしようなんてあますぎる

493 :デフォルトの名無しさん:2009/11/23(月) 17:18:29
C側とのデータのやり取りがめんどいから余り良い言語とは・・・

494 :デフォルトの名無しさん:2009/11/23(月) 17:26:23
>>489
> やはり、ウィンドウを表示する関数をCなどで書いて、luaからその関数を持ってくることが一番楽なんですかね。

Lua を使うと言って、こういったバインド系の作業はしたくないとか、意味がわからん。
もともとそうやって使う言語だろうに。

「みんなやってない」とか言ってるが、何個のプロジェクトを見て言ってるのか怪しいもんだ。

495 :デフォルトの名無しさん:2009/11/23(月) 17:26:36
Luaの言語を理解して使えるようになる手間を1とすると、
ゲーム用のC/C++ライブラリを組むのが最低10倍〜ぐらい手間も時間かかるよ
Win32APIからDirectXかOpenGLまで使えるようにならないと話にならない
ゲームライブラリは既存のものでいいならC素人ならDXライブラリを組み込むのが多分もっとも最短だと思う
ゼミテーマが「組み込みスクリプト研究」で実例として「ゲーム」を選んだのなら、外部ライブラリにどっぷり頼っていったほうが幸せだとは思う

496 :デフォルトの名無しさん:2009/11/23(月) 17:27:39
怒られたくなくて嘘を付いている幼児じゃあるまいし
無理せず諦めておけよ

497 :デフォルトの名無しさん:2009/11/23(月) 17:33:10
>>493
つまりAngelScriptがいいって事ですね。
わかります。

498 :デフォルトの名無しさん:2009/11/23(月) 17:42:29
自分の実力より遙かに上の事をやろうとしても無駄になるだけだぞ
ちょっと上ならともかく分不相応すぎ。諦めろ

499 :デフォルトの名無しさん:2009/11/23(月) 17:48:07
Luaじゃ宿題スレも使えないしねえ。
(答える奴はどうせこのスレも見てる)

500 :デフォルトの名無しさん:2009/11/23(月) 18:23:45
HSPスレに逝けよ

501 :デフォルトの名無しさん:2009/11/23(月) 21:35:31
とりあえず、この本みてみて、何とかなるか考えてみたら。

スクリプト言語による効率的ゲーム開発 C/C++へのLua組込み実践
http://www.amazon.co.jp/dp/4797348550
サポートページ
http://lua.mine.nu/w/LuaBookSupport

どうなんだろうなあ。

502 :デフォルトの名無しさん:2009/11/23(月) 21:46:36
ttp://en.wikipedia.org/wiki/Category:Lua-scriptable_game_engines
Luaでルーチンいじれるゲームとかゲームエンジンとかあるけど
日本語の資料があんまりないと思う

503 :デフォルトの名無しさん:2009/11/24(火) 10:46:49
Lua for Windows: A batteries included Lua installation on Windows.
http://luaforwindows.luaforge.net/
これいっこダウンロードしてインストールすれば、
GUI から OpenGL から DB 接続までなんでもはじめから入ってるよ。
ウィンドウ作る程度なら、サンプルそのまま使える。

504 :デフォルトの名無しさん:2009/11/25(水) 07:48:34
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;
}





505 :デフォルトの名無しさん:2009/11/25(水) 07:49:39
// 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);
}


506 :デフォルトの名無しさん:2009/11/25(水) 14:11:52
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)
];

508 :デフォルトの名無しさん:2009/11/25(水) 17:56:07
Lua詳しくないんでアレだが、lua_pushlightuserdataではダメなの?


509 :デフォルトの名無しさん:2009/11/26(木) 09:43:19
Luaで実行状態を全部ファイルに保存して、また復帰するようなことは可能ですか?

510 :デフォルトの名無しさん:2009/11/26(木) 10:10:30
>>509
Lua側でioで記録、読み込みするコード書くしかないかも

511 :デフォルトの名無しさん:2009/11/26(木) 10:18:51
Smalltalkなら可能です

512 :デフォルトの名無しさん:2009/11/26(木) 11:32:21
>>509
言語機能としてはないので、無理やりやることになる。

一応こういうのはあるけど、安定してるかどうかは不明。
http://lua-users.org/wiki/PlutoLibrary

513 :デフォルトの名無しさん:2009/11/26(木) 13:19:28
>>508
試してみましたが、luabindではligthuserdataではなくuserdataを使用して
独自の型ID等を付加してチェックしているようで、無理でした。
luabindのソースを追ってみたところ、luabind::detail::convert_to_luaで
C++側の変数の参照をluaのスタックに積めることが分かったので、
これでどこかのテーブルに置くとか引数で渡すとかの方法が使えそうです。
luabindのドキュメントにもサンプルにも、こういったスタックを使う方法が
記載されていないので、本来の使い方とは違う気もしますが。

514 :デフォルトの名無しさん:2009/11/26(木) 13:24:32
>>513
通常、スクリプトにはC++クラス型のインスタンスのポインタを渡してポインタで操作させる。
C++の参照はC++固有の機能なので他の言語では使えないと考えたほうがいい。
別の変数に代入した瞬間(参照で無く実体のコピーとして)にコピーコンストラクタが発動したって文句言えないぞ。

まあバインダがエラー吐いてコンパイルの段階で失敗すると思うが。

515 :デフォルトの名無しさん:2009/11/26(木) 13:29:57
休止モードを呼び出せばいいんだよ。

516 :デフォルトの名無しさん:2009/11/26(木) 14:09:30
>>514
bind側に参照を渡した場合は、ポインタに変換して管理してるみたいですね。

517 :デフォルトの名無しさん:2009/11/27(金) 08:47:27
>>510 >>512
ありがとうございます。
Pluto調べてみます。

518 :デフォルトの名無しさん:2009/11/28(土) 09:36:22
LuaでGUIムリだろと思ってたら、意外とバインダが出てくるもんだなw
お前ら優しすぎw

519 :デフォルトの名無しさん:2009/11/28(土) 10:21:52
小学生に方程式ムリだろと思ってたら、意外と鶴亀算が出てくるようなもんだな

520 :デフォルトの名無しさん:2009/11/28(土) 11:31:33
最近はメインループのかなりの部分まで組み込みスクリプトで作っちゃうのが主流になりつつあるのかな。

521 :デフォルトの名無しさん:2009/11/28(土) 12:02:53
Luaだと入力補完のあるエディタが無いから
逆にやり難いと感じる俺

522 :デフォルトの名無しさん:2009/11/28(土) 12:11:48
>>520
大半を組み込み言語化した結果、パフォーマンスの壁にぶちあたって
機能分離可能なところはどんどんC++化していく、ってのが定番だとオモ

サンプル:俺

523 :デフォルトの名無しさん:2009/11/28(土) 12:45:05
まあ通常、動的(型付け)言語はネイティブコードと比べて10倍以上は遅いからな。
オレもスクリプトでゲーム開発環境を一通り書き上げたところだが、
60フレームまわしたらそれだけで意外にCPU食ってしまうので、ちと困ってる。
最低ラインがPentium 4 2.4GHzくらいになった。

524 :デフォルトの名無しさん:2009/11/28(土) 14:49:37
JIT付き静的型付けスクリプト言語
穴場だから誰か作れば
有名になれるかもよ

525 :デフォルトの名無しさん:2009/11/28(土) 15:10:52
>>524
すでにあるっちゅうねん。
.NET Framework向けだがな。

526 :デフォルトの名無しさん:2009/11/28(土) 15:54:13
>>.NET Framework向けだがな。

駄目じゃん

527 :デフォルトの名無しさん:2009/11/28(土) 16:18:55
作りたいと本気で思ってる俺が来ましたよ
もし作るならスクリプトで定義したクラスのインスタンスがC++から簡単に作れて、マルチスレッドとか使って同時に複数のインスタンスを参照してもおかしくならない仕様にしたいな

528 :デフォルトの名無しさん:2009/11/28(土) 16:46:03
つAngelScriptJIT
ただしやり方は不明。

529 :デフォルトの名無しさん:2009/11/28(土) 18:52:02
LuaJIT ってなかったっけ?

530 :デフォルトの名無しさん:2009/11/28(土) 19:09:51
Luaは静的じゃないでしょ

531 :デフォルトの名無しさん:2009/11/28(土) 19:18:30
ああごめん、静的を見落としてた

532 :デフォルトの名無しさん:2009/11/29(日) 13:59:21
luaのlua_pcallのerrfncが呼ばれたときに、元のエラーメッセージとは
別にソースファイル名、行番号を収集する場合なんですが、
lua_getstackのレベル指定で、1から++しながら順にたどって
最初にcurrentlineの値が-1以外になったレベルがソースファイルの
階層と判断して問題ないでしょうか?


533 :デフォルトの名無しさん:2009/11/29(日) 15:45:53
メンバアクセスの:と.ってどう違うの?

534 :デフォルトの名無しさん:2009/11/29(日) 17:27:09
.が通常のメンバアクセスで、:でアクセスする場合は
v.(v ,〜 に展開される。
例: v:open(arg) -> v.open(v, arg)

535 :デフォルトの名無しさん:2009/11/29(日) 17:53:43
d

536 :デフォルトの名無しさん:2009/11/29(日) 18:04:12
>>17 問題1
使用言語: R

f <- function (n) {substr("abcdefghijklmnopqrstuvwxyz",1,n)}

> f(6)
[1] "abcdef"
> f(30)
[1] "abcdefghijklmnopqrstuvwxyz"

537 :デフォルトの名無しさん:2009/11/29(日) 18:06:04
すみません。
書くところを間違えました。
ごめんなさい。

538 :デフォルトの名無しさん:2009/11/29(日) 18:06:48
聞かれてないけどついでに補足すると.は[]に展開される
v:member(arg) -> v.member(v, arg) -> v[menbe](v, arg)

539 :デフォルトの名無しさん:2009/11/29(日) 18:09:23
v['menber'](v, arg)

540 :デフォルトの名無しさん:2009/11/29(日) 18:17:00
へー
じゃあメンバアクセスのたびにマップ検索してんのか
遅くならないのかな

541 :デフォルトの名無しさん:2009/11/29(日) 18:28:37
空想具現化プログラミングというところから落としたlua5_1_3_Win32_mbenc_a2.zipを展開したところbin2c5.1.exeにウイルス検知ソフトが反応したんですが、これは大丈夫なんでしょうか?

542 :デフォルトの名無しさん:2009/11/29(日) 18:31:42
>>540
そりゃ勿論遅いだろうさ

543 :デフォルトの名無しさん:2009/11/29(日) 18:41:44
メンバだけの話じゃないだろうし。
変数名からなにから全ての識別子の判定で毎回どこかのテーブル見てるはず。

544 :デフォルトの名無しさん:2009/11/29(日) 18:59:47
>>541
カスペルスキー系の誤検出のはず。
bin2cとか別に普段使うものでもないから削除しておいても良いかと。

545 :デフォルトの名無しさん:2009/11/29(日) 19:20:09
>>543
ローカル変数は実行時はテーブル見ない。例えば、
local a = b * c + d

local a = b * c
a = a + d
に変えても速さは変わらない。

546 :デフォルトの名無しさん:2009/11/29(日) 19:37:56
>>544
ありがとうございます安心しました

547 :デフォルトの名無しさん:2009/11/29(日) 23:33:25
静的型付けならPawnいかがかな?

548 :デフォルトの名無しさん:2009/11/30(月) 22:05:16
ちょっと確認したいんですが

lua_registerで登録した関数を呼び出すときには新しいスタックが毎回生成される、したがって
Glue関数内部ではlua_gettopでスタックの数を確認する必要なしにスタックの1番目が最初の引数、2番目が・・・としてよい
同様に、返り値もスタックの1番目が最初の返り値、二番目が・・・としてよい(何も考えずにスタッククリアして返り値を積めばいい)

これは正しいですか?

549 :デフォルトの名無しさん:2009/12/01(火) 00:52:46
うむ

550 :デフォルトの名無しさん:2009/12/01(火) 06:17:28
>>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


551 :デフォルトの名無しさん:2009/12/01(火) 21:46:34
Luaについて質問です。
10進数で書かれた文字列、たとえば「\130\160\130\162\130\164」は
Lua上で「あいう」となりますが、外部ファイルに記述したものを
io.linesで取り出したものだと、コード列が返ってきてしまいます。
これを通常の文字列に変換したものとして使いたいのですが、どうしたらいいのでしょうか。

552 :デフォルトの名無しさん:2009/12/01(火) 21:50:08
>>549
ありがとうございます

553 :デフォルトの名無しさん:2009/12/01(火) 22:20:40
>>551
多分C側でバイナリに変換しないとダメじゃないだろうか。
Luaの標準ライブラリでももしかしたら出来るかもしれないが、
Cの方がてっとり早いだろう。

554 :デフォルトの名無しさん:2009/12/01(火) 23:27:17
SquirrelのほうがLuaよりゲーム向けなんかな?
どっちも知識なしだったらSqから勉強でいいのだろうか

555 :デフォルトの名無しさん:2009/12/01(火) 23:54:06
>>554
どちらも汎用スクリプトだから処理系単体ではどちらがよりゲーム向けということはない。
周辺ライブラリやバインダの入手性や使い勝手の差はあると思うけど。

556 :デフォルトの名無しさん:2009/12/02(水) 01:51:00
>>554
速度がLua>Sqで結構大差あったりするんで
ttp://ja.wikipedia.org/wiki/Squirrel
のLuaとの違いに強い魅力を感じるんでなければLuaがオススメ。
特に知識なしなら、Luaのほうが日本語資料が充実してるんで勉強しやすいかと思う。


557 :デフォルトの名無しさん:2009/12/02(水) 02:00:16
lua は文法がな……

558 :デフォルトの名無しさん:2009/12/02(水) 08:15:39
日本語は文法がな・・・

559 :デフォルトの名無しさん:2009/12/02(水) 09:41:13
AngelScript|Д゚)ジー

560 :デフォルトの名無しさん:2009/12/02(水) 11:48:28
>>551
loadstring をつかえばできるよ。

local str = "\130\160\130\162\130\164" -- io.lines で取り出した文字列
local decode = loadstring("return \"" .. str .. "\"")
print(decode())


561 :デフォルトの名無しさん:2009/12/02(水) 15:29:08
>>449
コンパイラがOSロケールに依存してるから英語にしましょうなんて愉快すぎるわ
他のロケール依存アプリ全部道連れにする方法なんぞ万人に薦められんだろ

562 :デフォルトの名無しさん:2009/12/02(水) 16:39:37
問題が起こるのはShiftJISを決めうちして作っている一部の馬鹿アプリだけだろ。
なぜ全部とか間抜けな話になるのか、頭の悪い奴の考えはさっぱり分からん。

563 :デフォルトの名無しさん:2009/12/02(水) 16:40:53
バカアプリの代表が Visual Studio って話じゃないのん?

564 :デフォルトの名無しさん:2009/12/02(水) 18:39:01
そんな事よりお前ら、GameMonkeyについて語るんだ。


565 :デフォルトの名無しさん:2009/12/02(水) 18:47:34
winアプリにスクリプト組み込む場合、メッセージ(WM)処理どうしてる?
自分はマルチスレッドにしてるんだけど、WM_CLOSE受けたときに
スクリプトが走ってたら、スレッド他殺していいものなのかどうか。

566 :デフォルトの名無しさん:2009/12/02(水) 18:57:22
保存したいデータがあるかどうかで判断しね?

567 :デフォルトの名無しさん:2009/12/02(水) 19:00:15
データ保存しない場合はどんなタイミングで落としても問題無いってこと?

568 :デフォルトの名無しさん:2009/12/02(水) 19:16:24
スクリプトを複数スレッドで別々に動かす状況がわからんな…
Luaだと、Lua_yieldでスクリプトの処理を一時停止させて次のスクリプト、という感じではダメなの?

569 :デフォルトの名無しさん:2009/12/02(水) 19:43:49
それだとスクリプト書く側に停止を意識させないとダメですよね?

570 :デフォルトの名無しさん:2009/12/02(水) 22:23:10
スクリプト側にメインループを置いて処理してるの?

571 :デフォルトの名無しさん:2009/12/03(木) 00:38:27
winmainでメッセージループ、別スレッドでスクリプト。
スクリプトは入力待ち(マウス等)で関数無いで停止することがあって、
その間にメッセージループ側にWM_CLOSEとか来た場合にどうやって
終了させるかで色々迷っている、と。

スクリプトで割り込みを意識するような書き方は手間なので、
スレッドごと落とせると楽なんだけど、lua_Stateってスレッドごと
落とした後にlua_closeに渡して大丈夫なのか?ってのが疑問な
わけですよ。

lua_call系にステップ実行があると良かったんですがね。
ステップ数も指定できたりするのが。

572 :デフォルトの名無しさん:2009/12/03(木) 09:26:27
>>571
スレッドを強制終了したら、基本的に何が起こってるか不明というか
たとえばガベコレの途中だったりしたら(その他でもあらゆる不明な原因で)
異常な状態になるからやめたほうが良い。

手段としては、別スレッドのほうの処理をコルーチンで構成しておいて、
コルーチンがyieldしたタイミングでコルーチン呼び出し側のコードで
終了チェックするようにする。

あとウエイトが絡む関数については、待ちループで終了チェックをするようにして、
終了フラグが立っていたらyieldを起こすようにする。

とかそんな感じじゃないの。

573 :デフォルトの名無しさん:2009/12/03(木) 09:30:46
>>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でスクリプトを呼び出せばいいような気がする。


575 :デフォルトの名無しさん:2009/12/03(木) 11:28:06
>>565
他のスレッドはいきなり殺したらあかんでしょ。
メインスレッドからフラグたてて、よしなに自殺

576 :デフォルトの名無しさん:2009/12/03(木) 11:29:49
てか、この辺のマルチスレッドの話ことってLua関係なくないか?

577 :デフォルトの名無しさん:2009/12/03(木) 11:44:10
>>571
(before)
入力待ち(マウス等)で関数内で停止する

(after)
yieldを使い、外で停止する
入力が来たらresumeで関数内に戻る
WM_CLOSEが来たらresumeしないまま終了

578 :デフォルトの名無しさん:2009/12/03(木) 12:59:28
lua関係ないよな。普通にC++だけで書いてても全く同じだ。

まあ、lua (ないしは squirrel) なら、yield のタイミングで同期を
とるようなコードにしておくのが無難ってのはその通りだと思われ

579 :デフォルトの名無しさん:2009/12/03(木) 20:42:03
>>573
なるほど、それならステップ実行できますね。

>>他のレスくれた方々
具体的に書いた例だとマルチスレッドになってるけど、根本は
WindowsでLua使うときにメッセージ処理をどうしてるかって話ですから。
避けて通れないだろうから、実際に組み込んでる方々はどう対処してるかが
気になったもので。

580 :デフォルトの名無しさん:2009/12/03(木) 22:32:02
>>579
シングルスレッドモデルで組んであれば処理の流れ的に問題になるようなことは別にない

あとはオブジェクトをどう管理してるかの問題。

ウインドウのインスタンスを lua 配下にしてある(生成もlua側から)なら、それぞれのウインドウの
メッセージ処理部から、lua でのインスタンスの適当なメソッド (onCloseとか) をイベント的に callback
させて閉じるかどうかをスクリプト側に判定させればいいだろう

ウインドウのインスタンスがグローバルなら、lua 側も同様に
グローバルメソッドをイベントとして呼び出して判定させるように組めばいい





581 :デフォルトの名無しさん:2009/12/04(金) 18:14:29
Luaのスタックとか文法とかにいまいち馴染めないからエンゼルスクリプトをやってみようかと思ったが日本語資料がなさすぎて泣いた

582 :デフォルトの名無しさん:2009/12/04(金) 18:28:07
>エンゼルスクリプト

なんか可愛いな

583 :デフォルトの名無しさん:2009/12/04(金) 18:39:34
つ英文マニュアル
結構読みやすいよ。
あと、WIPのtest_featureに入ってるサンプルもわかりやすい。

584 :デフォルトの名無しさん:2009/12/04(金) 20:37:59
エンゼルスクリプトって速度どれくらい?

585 :デフォルトの名無しさん:2009/12/04(金) 21:19:06
>>584
>>347

586 :デフォルトの名無しさん:2009/12/04(金) 21:19:32
>>584
>>347

587 :デフォルトの名無しさん:2009/12/04(金) 21:20:21
おい、結婚するか

588 :デフォルトの名無しさん:2009/12/04(金) 21:46:45
そうだな。結婚すると良いよ。

589 :デフォルトの名無しさん:2009/12/04(金) 21:49:36
じゃあ俺が息子になろわ

590 :551:2009/12/04(金) 21:52:36
>>553,560
回答が遅くなってすみません。
>>560さんの方法で望みの動作になりました。
お二方とも、本当にありがとうございました。

591 :デフォルトの名無しさん:2009/12/04(金) 23:34:54
>>581
tolua++を使えばいいと思います。
ttp://lua.mine.nu/w/LuaBookSupport

592 :デフォルトの名無しさん:2009/12/04(金) 23:36:01
日本語資料が無いから辛いと書いてるのにそんなの勧めるなよw

593 :デフォルトの名無しさん:2009/12/04(金) 23:46:07
Pawn何で人気ないん?

594 :デフォルトの名無しさん:2009/12/04(金) 23:49:03
Luaの入門書読み終わったけどユーザーデータについてあんまし書いてなかったぜ
ポインタ渡せないとオブジェクトの操作ができないジャマイカ

595 :デフォルトの名無しさん:2009/12/04(金) 23:49:50
Luaの入門書ってどれのこと?

596 :デフォルトの名無しさん:2009/12/05(土) 00:06:50
入門Luaプログラミングというやつなんだけど、ちょろっと1Pくらいしか説明がなくてわかりにくかった

597 :デフォルトの名無しさん:2009/12/05(土) 00:21:15
luaといえば、下の二つのスクリプトを順に実行すると、

--a.lua
local v = 1
local function f()
 print(v)
end
fv = f

--b.lua
fv()

結果
1

感じになるんだが、関数の実体もガベコレされてるのかな?
関数内で使ってるlocal変数もコピーかリファレンスを持つことになると?

598 :デフォルトの名無しさん:2009/12/05(土) 00:32:19
>>597
Luaはよく知らないが、単にグローバル変数を
2つのスクリプトで共有してるだけなんじゃね?

599 :デフォルトの名無しさん:2009/12/05(土) 05:19:56
>>597
fv が f をつかんでいる間はつねに f のなかから v が参照可能だよ。
Lua の関数も参照されなくなればもちろんガベコレされる。

> 関数内で使ってるlocal変数もコピーかリファレンスを持つことになると?
Lua ではこういう変数のことを upvalue と呼んでますが、
必要に応じてスタックからヒープへコピーされるみたい。
http://www.lua.org/docs.html
ここにある The implementation of Lua 5.0 っていう論文に、
イラストつきで説明があります。


600 :デフォルトの名無しさん:2009/12/05(土) 06:44:46
>>599
完全な回答をありがとう。凄くすっきりしました。
この辺の仕様はとても良くできてるなと思いますね。

601 :デフォルトの名無しさん:2009/12/05(土) 07:34:58
closureみたいなもん?

602 :デフォルトの名無しさん:2009/12/05(土) 08:39:50
>>601
そう。レキシカルクロージャです。

603 :デフォルトの名無しさん:2009/12/05(土) 11:28:25
すっきりとした仕様だね。
Schemeライクというか。

604 :デフォルトの名無しさん:2009/12/05(土) 12:22:26
squirrel だと同等のものは「Free variables」と呼ばれててこちらは対象の明示指定が必要だね

605 :デフォルトの名無しさん:2009/12/05(土) 14:12:22
未踏ユースにLua高速化が採択されているんですね。

スクリプト言語Luaの高速化と省メモリ化 (2009年度上期未踏ユース)
http://www.ipa.go.jp/jinzai/mitou/2009/2009_1/youth/gaiyou/sk-3.html
hogelog/lua (ソースコード)
http://github.com/hogelog/lua
[lua]記事一覧 - hogeなlog (開発者ブログ)
http://d.hatena.ne.jp/hogelog/archive?word=*%5Blua%5D

606 :デフォルトの名無しさん:2009/12/05(土) 15:06:08
>>605
エエー、あんな古臭い言語を今更高速化するのが予算つくのか。
LuaJITだってあるのに。

607 :デフォルトの名無しさん:2009/12/05(土) 15:20:44
ヒント: 電気通信大学

608 :デフォルトの名無しさん:2009/12/05(土) 17:15:48
>>606
ところがLuaJITのGCにはあんま手が入ってはいないんだ。

609 :デフォルトの名無しさん:2009/12/05(土) 17:41:58
こんなんで採択されるのかよw
ローカルなスクリプト言語
高速化してたら切りが無いぞ

610 :デフォルトの名無しさん:2009/12/05(土) 17:43:19
本家と連絡取らずにやってるんなら残念な結果になる可能性が高い気がする。

611 :デフォルトの名無しさん:2009/12/05(土) 17:45:53
よーしじゃあパパAngelScriptを高速化しちゃうぞー


612 :デフォルトの名無しさん:2009/12/05(土) 17:56:48
C言語そのままスクリプトにしたようなのってありますか?

613 :デフォルトの名無しさん:2009/12/05(土) 18:10:43
>>612
文法のことならSquirrelとかPythonがある程度近いと思うがそのまんまってのはたぶんない

614 :デフォルトの名無しさん:2009/12/05(土) 18:14:43
>>612 http://csl.sourceforge.net/csl.html

615 :デフォルトの名無しさん:2009/12/05(土) 18:17:18
>>612
C++だけど、CINT

616 :デフォルトの名無しさん:2009/12/05(土) 23:16:35
クロージャとコルーチンさえあればもうCでいい気がしてきた俺には十分魅力的だなぁCINTわ

617 :デフォルトの名無しさん:2009/12/06(日) 08:17:06
CINTにクロージャとかコルーチンとかあったか?

618 :デフォルトの名無しさん:2009/12/06(日) 08:25:09
>>616
それだったらGoのほうがいいんじゃ。

619 :デフォルトの名無しさん:2009/12/06(日) 11:33:15
Cっぽい文法ならAngelScriptでいいじゃない

620 :デフォルトの名無しさん:2009/12/07(月) 11:25:54
pawnとgoとgamemonkeyのスルーっぷりw

621 :デフォルトの名無しさん:2009/12/07(月) 11:32:15
C言語みたいなプログラム書きにくい言語でスクリプト記述したいとか、どんなマゾよ?

622 :デフォルトの名無しさん:2009/12/07(月) 11:34:23
世の中、なにか一つ習得するとそれにしがみつくのが習性という猫もいるんだ。

623 :デフォルトの名無しさん:2009/12/07(月) 17:37:44
>>621
これってたまに見かけるが、Cってそんなに書きにくいか?

624 :デフォルトの名無しさん:2009/12/07(月) 17:49:32
>>623
慣れだよ

625 :デフォルトの名無しさん:2009/12/07(月) 17:56:34
Cの書きにくさは、資源管理(malloc/free)がプログラマ任せであることや、
文字列操作がめんどいことにあって、構文や文法自体はそんなに書きにくくは
ないよね。Cが書きにくいなら、JavaがあそこまでCを引き継いだような仕様には
なってないと思う。

# でもまぁCが書きにくいと主張する人は、JavaはCから書きにくさを継承したと
# 主張するか。

626 :デフォルトの名無しさん:2009/12/07(月) 18:04:16
Cの書きにくさ
・クロージャがない
・ガベージコレクションがない
・メモリアクセス保護がない
・文字列型がない
・というかコレクション型が一切ない
・というかforeachがない
・せめてイテレータくらい付けて
・関数オブジェクトの定義が面倒(定義と関数ポインタの扱いが別)
・というかファーストオブジェクトになってない

とまあ、仮にオブジェクト指向でなかったとしてもこれくらいあるわけだ。

627 :デフォルトの名無しさん:2009/12/07(月) 18:06:45
アセンブラに比べたら格段に書きやすい

628 :デフォルトの名無しさん:2009/12/07(月) 18:10:14
あー複雑な型の宣言や定義の構文は魔境入ってるかw

629 :デフォルトの名無しさん:2009/12/07(月) 20:04:32
Cは40年近く前に出来た化石言語だからな。
当時のスペックのコンピュータで動かすためにキモイ仕様にしてるから書きづらくて当然。

630 :デフォルトの名無しさん:2009/12/07(月) 21:35:50
ネイティブ系ではテンプレートの便利さに触れると、C++以外の言語を受け付けなくなるよ。

631 :デフォルトの名無しさん:2009/12/07(月) 21:57:19
>>630
ふーん……。
D言語とかOCamlとかHaskellは触ってみたことあるの?

632 :デフォルトの名無しさん:2009/12/07(月) 22:09:32
臭いものに蓋をするのがITの正道
蓋をしないネイティブ系・組み込み系は邪道だな

633 :デフォルトの名無しさん:2009/12/07(月) 23:16:45
なでしこやろうぜ!

634 :デフォルトの名無しさん:2009/12/07(月) 23:20:52
>>632
怖いものみたさor言われるままに蓋を開けて
自分の足を撃つのがITの正道

635 :デフォルトの名無しさん:2009/12/08(火) 12:43:40
>>630
テンプレートでほら、関数型言語っぽいプログラミングも可能になる!!!

とか言われてもぶっちゃけあれキモいんだけど実際のところどうなの?

636 :デフォルトの名無しさん:2009/12/08(火) 12:51:44
boost spiritとかboost lambdaは、使う使わないは別として、
キモいと思わない人はいないんじゃないかと。

637 :デフォルトの名無しさん:2009/12/08(火) 13:51:30
C++をメインで使ってるけど、ぶっちゃけDirectXやライブラリの対応が
いいネイティブの別言語ができたらそっちに乗り換える。


638 :デフォルトの名無しさん:2009/12/08(火) 13:57:23
>>637
そういうのは、ラッパーライブラリひとつで解決できる話なのさー。(他言語対応)
ただし動作検証用のコードは一部C++で用意しとかないといけないと思うが。

639 :デフォルトの名無しさん:2009/12/08(火) 14:01:28
その使い勝手のいいラッパーが無いという話をしているんだろう。

640 :デフォルトの名無しさん:2009/12/08(火) 15:47:16

boost::lambdaを使いこなしてない奴はC++を理解していない(キリッ

641 :デフォルトの名無しさん:2009/12/08(火) 20:17:26
>>636
あれはその、なんていうかキモかわいい。

642 :デフォルトの名無しさん:2009/12/08(火) 21:15:09
Brainf**kやろうぜ!

643 :デフォルトの名無しさん:2009/12/08(火) 21:42:40
コンパイルにかかる時間が可愛くなさすぎる。

644 :デフォルトの名無しさん:2009/12/08(火) 21:54:01
その視点で見るとGoは実に可愛らしい

645 :デフォルトの名無しさん:2009/12/09(水) 05:14:24
Goって組み込めるの?

646 :デフォルトの名無しさん:2009/12/09(水) 08:05:54
         \   l´⌒\⌒\ \\ \
           \ ヽ   )  )   \\ \\   
              (   \ \∩___∩ \\ 
           \   \  ⌒⌒| ノ      ヽ  \\      
              \ \   /  ●   ● ト、\ \\\ 
               \  Y |    ( _●_)  ミ\  \\\  
               \ / 彡、_  |∪| ノ   \  \\\
                 (____)―ヽノ' ヽ      ̄ ̄ ヽ\\
                                \,  j  l l .l }
                         Lua!   l (_ノノノノ



647 :デフォルトの名無しさん:2009/12/09(水) 11:00:26
>>637-638
お前、なにかよさげなライブラリある度にラッパー作ってたDelphi使いの俺をなめるなよ。
さすがにもう嫌になってDelphi使ってないわ(´・ω・`) 昔は良い言語だったんだが

648 :デフォルトの名無しさん:2009/12/11(金) 09:36:15
ああ、次はDelphi用Lua、Delphi用Squirrel、Delphi用AngelScriptだ…

649 :デフォルトの名無しさん:2009/12/12(土) 02:30:59
ぶった斬りすいません

luaでテキストから文字を読み込んで使いたいのですが、
そのあとに文字入力のために同じ関数(io.read)を使うと文字入力できなくなってしまいます。
文字読み込みのio.readと、キーボード入力のio.readの区別をつけるにはどうすればいいのでしょうか?

よろしくお願いします。

650 :デフォルトの名無しさん:2009/12/12(土) 02:34:20
>>649

651 :デフォルトの名無しさん:2009/12/12(土) 05:21:19
テキストってテキストファイルのこと?
それとも標準入力?

652 :>>649:2009/12/12(土) 21:22:55
>>651
レスありがとうございます。

テキストファイルから文字を取り出してluaの配列に入れています。

653 :デフォルトの名無しさん:2009/12/14(月) 14:27:50
>>504-505
これってコンパイル済み(.amx)ではなくて
普通のPawnファイル(.p)も実行出来ます?

654 :デフォルトの名無しさん:2009/12/14(月) 15:13:42
と思ったらPawnはコンパイル済みのしか実行出来ないみたいですね
スレ汚しすみません

655 :デフォルトの名無しさん:2009/12/14(月) 19:25:17
 

656 :デフォルトの名無しさん:2009/12/14(月) 19:26:52
Luaファイルって、配布するときに隠すことできる?
Cの組み込みで使おうと思っているのだけれど、Cはコンパイルすれば自動的にソースは見えなくなってくれるからおk。
けど、Luaファイルで記述した部分がもろばれになってしまうので、どうにかならないかなぁということです。

657 :デフォルトの名無しさん:2009/12/14(月) 19:43:00
隠すというのがコンパイル後のバイナリでOKというなら、Luaもバイナリ出力することができるよ。

658 :656:2009/12/14(月) 20:47:13
まじか。
http://blog.dlixia.com/index.php?UID=1243877250
こんな感じなのか。

なんとなくだけど、Luaは簡単にリバースエンジニアリングできそうな予感がするな。。。
まぁ及第点はあるよね、きっと。
ありがとう!

659 :デフォルトの名無しさん:2009/12/14(月) 23:07:40
javascriptを組み込んだらいいんじゃね?
ユーザー多いし、資料多いし。

って思ったら、処理系実装が軒並みLGPLとかMPLとか・・・・


660 :デフォルトの名無しさん:2009/12/15(火) 00:00:39
スクリプト言語から離れるが、自作のファイルアーカイブクラスでメモリにスクリプトやコンパイル後のバイナリを読み込み、
そのメモリの内容をコンパイル、もしくはバイナリ読み込みするようにすればいいと思う。

661 :デフォルトの名無しさん:2009/12/15(火) 00:34:42
>>659
CRIScriptとかはどうなんだ?
BSD風ライセンスらしいが

662 :デフォルトの名無しさん:2009/12/15(火) 00:35:06
さげわすれた・・・・

663 :デフォルトの名無しさん:2009/12/15(火) 02:36:52
CRIScriptね。
どうなんだろ、使用感を聞いたことがない。
あれ、主開発者がApple行っちゃったけど大丈夫かな、CRIなのにww

いや、すごく期待はしてるんだよ

664 :デフォルトの名無しさん:2009/12/15(火) 03:14:13
SpiderMonkeyかな

665 :デフォルトの名無しさん:2009/12/15(火) 05:28:35
>>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() を使えば良いんじゃないかな?


666 :デフォルトの名無しさん:2009/12/15(火) 10:54:38
あー、もう!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意味が分からない、資料少なすぎ助けて・・・・


667 :デフォルトの名無しさん:2009/12/15(火) 10:57:56
追記

Pawn ファイルで include <###> をしていない物は正常に実行出来た

668 :デフォルトの名無しさん:2009/12/15(火) 12:14:25
ドキュメントが全てpdfだったり、インストールが実行形式だったり
変なところで敷居上げてる気はするな
敷居を下げる配慮をした結果なのだろうとは思うが

669 :デフォルトの名無しさん:2009/12/15(火) 12:47:31
PawnはFloat使おうとして挫折した。なんで組み込み型じゃないんだよ。。。。


670 :デフォルトの名無しさん:2009/12/15(火) 14:54:37
スレタイにある「Squirrel」の読みはアメリカ英語で「スクワール」で、
イギリス英語だと「スクウィール」のようです。

671 :デフォルトの名無しさん:2009/12/15(火) 15:21:23
Luaのライブラリを最小限のサイズにしたいのだけど
削っても動作に影響ないファイルとかあります?

672 :デフォルトの名無しさん:2009/12/15(火) 16:48:46
>>671
パーサー部分は削った?
参考→Lua書庫内etc/noparser.c

673 :デフォルトの名無しさん:2009/12/15(火) 17:42:19
最近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]
バインドするときに戻り値が何型であるかを設定する方法があるんでしょうか?

674 :デフォルトの名無しさん:2009/12/15(火) 20:37:30
バインドの方法がおかしいんだろう。クラスインスタンスを返す場合は、その返したいクラスに対して sq_createinstance
して squirrel のインスタンスとしての構造を作ったものに sq_setinstanceup したものを返す必要があるんだがそうしてるかい?

675 :デフォルトの名無しさん:2009/12/15(火) 21:07:46
>>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;
}


677 :デフォルトの名無しさん:2009/12/15(火) 23:30:53
Cの組み込みでLuaって速度的にどれぐらい出る?
ゲーム作ってるんだけど、1fps≒16msの間にpcall呼びまくったりしても大丈夫かな。
ざっと3000回ぐらい。

678 :デフォルトの名無しさん:2009/12/15(火) 23:43:58
ソース読んでたけど、よくわからん?

sq_getclassでクラスをスタックに
sq_createinstanceでそのクラスのインスタンスを作成し、スタックへ
sq_setinstanceupでユーザーポインタをインスタンスにセット

と思ったんだが、最初のsq_getclassでどうやれば返り値のクラスを取得できるんだ・・・

679 :デフォルトの名無しさん:2009/12/15(火) 23:56:21
bzr

680 :デフォルトの名無しさん:2009/12/15(火) 23:57:02
間違えたぜ

681 :デフォルトの名無しさん:2009/12/16(水) 01:05:04
>>678
主要なバインダには該当コードあるんだからそれを探して読もうよ。

sq_getclass はインスタンスのクラスを取得するもの。sq_createinstance をする場合に
参照するクラスはあらかじめわかってるんだから、C側で参照を保持しておくか、
あるいは global から名前指定しで取り出して使う


682 :デフォルトの名無しさん:2009/12/16(水) 10:10:40
>>672
それはどうやれば良いですか?

noparser.c でググったのだけど
ファイルサイズが削れるだけの説明ばかりで

683 :デフォルトの名無しさん:2009/12/16(水) 14:42:20
>>670
PCのスペックも環境も書いてないのにそんな話しても無駄だが、
最近のPCで本当にただpcall呼ぶだけなら3000回くらい平気じゃないかね。

684 :デフォルトの名無しさん:2009/12/16(水) 14:43:41
>>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

686 :デフォルトの名無しさん:2009/12/16(水) 17:10:52
意味無いことを

687 :デフォルトの名無しさん:2009/12/16(水) 17:18:42
下手をすると、Cでは変数が後で利用されていないと、
最適化でごっそり無かったことにされるから気をつけろ。

688 :デフォルトの名無しさん:2009/12/16(水) 17:33:31
コンパイル時に計算済ませていきなり即値代入して終了とかな。

689 :デフォルトの名無しさん:2009/12/16(水) 17:44:46
>>687
あるあるww
最初測ったら0秒だったよ
今回はLuaの1/15くらいだからこんなもんでしょ


あと、rubyをコケにしてるような書き方になってしまった
あれは便利さ重視だからスピードは二の次
rubyユーザーごめん
引き合いに出したのは、自分がよく使ってて、一応組み込めるから。

690 :デフォルトの名無しさん:2009/12/16(水) 17:48:38
オブジェクト生成するからな。
とにかく意味が無い例であるのはたしか。

691 :デフォルトの名無しさん:2009/12/16(水) 20:15:55
>>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);


692 :デフォルトの名無しさん:2009/12/16(水) 20:57:00
>>691
作りにもよるけどたいていは sq_setreleasehok 処理も必要

693 :デフォルトの名無しさん:2009/12/16(水) 21:08:29
>>692
ん?sq_setreleasehookってコンストラクタの中じゃないの?


694 :デフォルトの名無しさん:2009/12/16(水) 21:46:22
>>693
sq_createinstance はまさに構築済みの C++オブジェクトをラップして返すために
あるもので、squirrel のコンストラクタをよばない。

普通のコンストラクタは中で C++のインスタンスを new してるから、
呼んでしまうと余分なC++インスタンスがつくられる上に、さらに
別のインスタンスを sq_setinstanceup した時点でリークしちゃうからね。

で、よばれないから、たいていコンストラクタでやってるはずの
sq_setreleasehook は別途必要になる






695 :デフォルトの名無しさん:2009/12/16(水) 22:27:12
>>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*をセットする

なんか、他の部分も怖くなってきました。リファレンスだけじゃわかりませんね。


697 :デフォルトの名無しさん:2009/12/17(木) 00:34:19
>>685-689
Rubyて感覚的には30分走らせる代わりに10分でコード書く。C言語は1時間でコードかくかわりに1分で走らせるとか、比喩があったなw

698 :デフォルトの名無しさん:2009/12/17(木) 09:54:34
C言語と30年戦う代わりに1年で味方につけるべきだったな。

699 :デフォルトの名無しさん:2009/12/17(木) 10:16:12
AngelScript|Д゚)ジー

700 :デフォルトの名無しさん:2009/12/17(木) 11:05:57
>>696
記述自体はそれであってるけど、sq_setreleasehook するのは sq_setinstanceup が成功したのを確認した後でしょう。

終了時あぼんは、そりゃどっかプログラムが悪いんだろうとしか言えない。
その b->getGraphics() でとった Graphics が勝手に独自に解放されて大丈夫な構造で作られて
ないのなら setreleasehook してはダメ、って、&つけてるってことはメンバ変数か。それはダメかも

C++で管理を単純化するために、親が責任もって解放してるので、子オブジェクトは
ポインタ参照したあともそのまま放置したのでOK、という書き方は実際よくあって、
そういったものをsquirrel に移すときは、子オブジェクトにポインタ渡してオブジェクトとして
作るけど sq_setreleasehook はしないという書き方にする必要がもちろんある。

親が先に死んだ状態で子をさわるとポインタ腐ってるのでクラッシュするけど
それはそういうもの。squirrel は機構は提供してくれるけど、自動で判断してくれるわけでは
ないから、あくまで C++ 的に破綻しないように注意して書く必要がある。

そういうのいやならオブジェクトを全体的にリファレンスカウント
方式とかで管理するようにするしかない。
そして循環参照トラップにはまるw

701 :デフォルトの名無しさん:2009/12/17(木) 11:44:13
循環参照嫌うなら弱参照系ないしはGCの実装が必要

もっとも、squirrel 自体がリファレンスカウントもGCも弱参照ももってるから、
既存ライブラリを持ってくるのではなく最初から書くのなら、C++ 側を
squirrelの機構にべったりのっかるように書くという考え方もある。

個別のオブジェクトはごく単純にバインドするようにして、C++ 側でオブジェクトの親子構造を持つ場合は、
C++そのもののポインタではなく、squirrel のオブジェクトを一旦作ってそれを HSQOBJECT で持つようにする。
さらには、配列や辞書が必要なら、STL とかを使うのではなく、squirrel の array / dictionary を使う。

C++ 側で元のオブジェクトを参照する場合にも squirrel の機構を経由する必要があるので一手間増えるけど、
squirrel に値を返す時は持ってる HSQOBJECT を sq_pushobject するだけになるからとても簡単になるし、
オブジェクトの寿命管理も squirrel 側になるから、いつ誰が破棄しても安心

702 :デフォルトの名無しさん:2009/12/17(木) 14:23:49
>>700
あー、やっぱり、新しくインスタンス作ってるんじゃないんならsetreleasehookはいらないんですね。
なんか中で気持ち悪いことやっててGraphicsインスタンス作ったつもりはないのに解放関数与えないとダメなのかと思いました。
(ソース読んだ限りではそういう記述が無かったので、疑問には思ってましたが・・・)

あとは、終了時あぼんの原因を探れば動きそうです。ありがとうございました。

ていうかBCC5.5ってテンプレートが弱いからSqPlusとか使えないんですね・・・。メチ不便

703 :デフォルトの名無しさん:2009/12/18(金) 15:54:55
xtalの新verが出てる。
デバッガー早くできるといいな。

704 :デフォルトの名無しさん:2009/12/18(金) 16:06:30
Squirrelの演算子一覧に => ってあって
え!? と思ったら単なるtypoだった・・・

705 :デフォルトの名無しさん:2009/12/18(金) 16:07:52
ぅあ

706 :デフォルトの名無しさん:2009/12/18(金) 19:09:29
squirrelで
{};hoge
をコンパイラが受け付けないのには何か理由があるの?
疑似BNF見る限り許容されそうなものだけど
ワンライナーだとついテーブルコンストラクタに ; 付けてしまう

707 :デフォルトの名無しさん:2009/12/19(土) 13:49:00
nscryptみたいな軽量な物で小数点も扱えるのあればなぁ
luaとかは無駄な部分が多すぎて

708 :デフォルトの名無しさん:2009/12/19(土) 14:00:18
他の部分がNスクで十分なら、多分Nスク作者に要望を投げてみるのが、
その要望の解決にはいちばんいいと思う。

709 :デフォルトの名無しさん:2009/12/19(土) 14:17:21
>>708
出来るならそうしたいけど
nScript作者はここ最近活動休止中みたいで
そのスクリプトも含め更新と言う物が一切されてないから期待出来ない

だから自分で実装しようとしてるけど
元々Cのみで書かれてないから移植作業がまず大変

710 :デフォルトの名無しさん:2009/12/19(土) 14:40:00
はてな日記見てみたけど、なんか次世代エンジンに注力してるみたいね。
そのへん追いついてなかった。

711 :デフォルトの名無しさん:2009/12/19(土) 14:46:52
あ、あと、どう使うつもりか知りませんがライセンス大丈夫ですよね?
Nスクのライセンスは全く見ずに言いますが。

712 :デフォルトの名無しさん:2009/12/19(土) 14:47:50
>>711
個人利用のみだから問題ないはず、と思う

713 :デフォルトの名無しさん:2009/12/19(土) 14:48:14
nScriptってWWWCの作者のだよな?
NScripterと話がごっちゃになってね?

714 :デフォルトの名無しさん:2009/12/19(土) 14:51:05
突っ込もうと思ったら怒涛の勢いでレスが・・・
確かに混同してるな

715 :デフォルトの名無しさん:2009/12/19(土) 14:53:30
>>713
このことです
ttp://www.nakka.com/soft/ns/

716 :デフォルトの名無しさん:2009/12/19(土) 14:55:29
あれ、ソースみてるけどフルCでね?
windows.hに依存してるのはあるかもしれんが

717 :デフォルトの名無しさん:2009/12/19(土) 15:02:33
パイソンとかルビーをゲームに使ってる人はいますか?

718 :デフォルトの名無しさん:2009/12/19(土) 15:07:10
>>716
フルCに見えるけど一部Winの機能使ってて
手直し必須だと思う

719 :デフォルトの名無しさん:2009/12/19(土) 15:37:08
スクリプト実行する根っこの部分でWinの機能つかってるから
一部と言うより根本的な修正が必要だなこれ

720 :デフォルトの名無しさん:2009/12/19(土) 17:09:35
ところでお前ら、この手のスクリプトエンジンに手直し入れる場合、どのぐらいまで手を入れますか?
基本命令や文法とかまで変えたりする?

721 :デフォルトの名無しさん:2009/12/19(土) 17:10:05
>>717
ノシ IronPython使用中。
1週間ほどあればスクリプト部分はcPythonにも移植出来るかな。
特に問題ないよ。
スクリプト内でマルチスレッド化が普通にできるのが強みだな。

722 :デフォルトの名無しさん:2009/12/19(土) 17:58:46
>>720
本家バージョンアップの度にパッチ当てるの面倒だから基本的にそのまま
作業を楽にする目的で文法いじるとしたらプリプロセッサとかトランスレータを間にいれるかな
文法変えずに必要な機能が実現できないなら言語の選択に問題があるかと

ライブラリレベルならアーカイブが透過的に扱えるようIOを自作のに差し替えてる

723 :デフォルトの名無しさん:2009/12/20(日) 02:05:39
誰か>>715のnScriptをCのみで動かせるように
手直ししてくれる人いません?

メモリ管理や足りない型の再定義とかはなんとかなるけど
マルチスレッド処理には詳しくないから
同期処理とある部分の代用関数が分からない


724 :デフォルトの名無しさん:2009/12/20(日) 02:28:47
そもそもCにスレッドなんて無いような

725 :デフォルトの名無しさん:2009/12/20(日) 04:55:19
TCP使えるネットワークライブラリでC汎用なのも無いきが

726 :デフォルトの名無しさん:2009/12/20(日) 14:10:06
luaはどうも記述が冗長になる・・。
if ~ then ~ endとか。

「関数先頭でリソース割り当て。割り当て成功してたら
終わりで開放。」見たいなコード書くとフラグ使って
最後でif文みたいな感じになるけど、
C#のIDisposable見たいな機能があると便利かと。
割り当て・開放のコードが集約できるから見やすそう。


727 :デフォルトの名無しさん:2009/12/20(日) 16:26:27
Cでそういうの書けばいいねん

728 :デフォルトの名無しさん:2009/12/20(日) 17:54:01
・テーブルに関数をpushする
・テーブルが空になるまで関数をpopして呼び出す
の2つを簡単に出来るようなライブラリを作ればいいと思う

729 :デフォルトの名無しさん:2009/12/20(日) 17:55:48
>>728
で、それが種々のbinderになるわけですが何か。

730 :726:2009/12/20(日) 18:18:19
きっと欲しいのはこんな感じ
do
 local resource=...
 finaly
  finnalize(resource)
 end
 :
 :
end -- ここでfinalyの内容が自動で呼ばれる。

自動で呼ばれるとなると言語サポートは必須かと。
metaluaあたりで作れるかな?

731 :デフォルトの名無しさん:2009/12/20(日) 18:25:56
何のためにGCがあると思ってるんだろうか

732 :726:2009/12/20(日) 18:28:56
javaのGCじゃリソース管理できないから
C#はIDisposable入れたんじゃないの?


733 :デフォルトの名無しさん:2009/12/20(日) 18:33:54
>>732
違うよ。
本来的にアンマネージドなリソースの管理はGCじゃなくてプログラマの責任だから、
プログラマが明示的にDispose()かける仕組みになってるんだよ。

734 :726:2009/12/20(日) 18:44:32
え?
C#はかじった程度しかしらんのでうそ言ってるかもしれんが、
usingとIDisposabeなクラス組み合わせると
リソース開放漏れが(ファイルのクローズとか)が防げますよー
って使い方するんじゃないの?(C++のRAIIみたいな)


735 :デフォルトの名無しさん:2009/12/20(日) 18:46:57
これでどうだ

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でよろしく ノシ (冗


737 :デフォルトの名無しさん:2009/12/20(日) 19:04:56
>>734
IDisposableを継承したクラスはusing構文で使うことが推奨されているわけだが、
当然この構文が使えない使い方があるわけで。
(using構文を使うと実用上スタックに載せているのと同じなわけで、ヒープに置きたい場合だってあるだろう、という話)

で、ユーザーが手で作ってホールドしているIDisposableなインスタンスは当然自分で明示的に破棄しないといけない。

738 :デフォルトの名無しさん:2009/12/21(月) 03:50:01
//
/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ AngelScript 2.18.0!!
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ

739 :デフォルトの名無しさん:2009/12/21(月) 15:13:06
AngelScriptが2.18.0になってるな

740 :デフォルトの名無しさん:2009/12/21(月) 15:16:21
ASの本だれか書いてくれ

741 :デフォルトの名無しさん:2009/12/21(月) 15:39:12
ActionScriptなら

742 :デフォルトの名無しさん:2009/12/21(月) 16:54:21
仮想マシンをいくつもopenするのって良くないですか?

743 :デフォルトの名無しさん:2009/12/21(月) 17:13:43
同時に動かす必要が無いなら良くないんじゃない

744 :デフォルトの名無しさん:2009/12/21(月) 19:21:29
良くないですね

745 :デフォルトの名無しさん:2009/12/21(月) 21:23:01
>>740
まずは2.18.0のShiftJIS対応版だ…

746 :デフォルトの名無しさん:2009/12/22(火) 00:10:03
sjis対応なんて激変してない限りいつも同じ手順だろうに

747 :デフォルトの名無しさん:2009/12/22(火) 00:38:06
AngelScriptはこまめに更新されるから、結構手間なのよ。


748 :デフォルトの名無しさん:2009/12/22(火) 07:10:33
ShiftJIS<->UTF-8の変換を間に挟むだけなんだから、
一度書いたら別に毎度手間がかかる訳じゃないだろ。

749 :デフォルトの名無しさん:2009/12/22(火) 07:53:25
       //
     /  /   パカッ
     //⌒)∩__∩
    /.| .| ノ     ヽ
    / | |  ●   ● |     
   /  | 彡  ( _●_) ミ Lua!!
   /  | ヽ  |∪|  /_
  // │   ヽノ  \/
  " ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ



750 :デフォルトの名無しさん:2009/12/22(火) 09:25:42
>>748
AS_DOUBLEBYTE_CHARSETで有効になる部分に、そのままだとビルドエラーになる部分があって、
そこを毎回毎回直さなきゃならないんだ。

公式に知らせたほうがいいとは思うが英語が苦手でね…

751 :デフォルトの名無しさん:2009/12/22(火) 10:12:37
とりあえずdiff 取って投げれないの?

752 :デフォルトの名無しさん:2009/12/22(火) 10:37:03
>>735
こういうの、JavaScriptとかRubyとかやってると思いつくよなw

753 :デフォルトの名無しさん:2009/12/22(火) 10:38:18
毎回なおすってまさか手でなおしてるんじゃ・・・
バージョン管理してパッチ吐いたりして、どうしてもパッチあたらないときは手で直すとかしたらどうかと

754 :デフォルトの名無しさん:2009/12/22(火) 11:34:26
>>751
自分がいじったファイルをリポジトリにコミットって事?

>>753
まさかの毎回手直し。
あと、
>バージョン管理してパッチ吐いたりして、どうしてもパッチあたらないときは手で直すとかしたらどうかと
ってのは、TortoiseSVNの「パッチを作成」「パッチを適用」を使えって事?

質問ばかりですまん。

755 :デフォルトの名無しさん:2009/12/22(火) 12:01:22
>>754

公式は svn かな。それなら

1. 公式から任意のバージョンをエクスポートしてきて、それで自分の手元で自前の svnレポジトリを作る
2. 自分の更新はそこに任意にコミットする
3. 公式の svn から適当なタイミング(リリースがあった時とか)で更新を「マージ」する

これでおおむね安全に手元作業できるはず

svn は以前は外部レポジトリからのマージができなかったので、
手元のレポジトリに「ベンダーブランチ」として公式の内容をまるごとコピーして、さらにそこからマージする
必要があったんだけど、今のは普通に外のレポジトリからマージできるのでこの手の作業は楽になった

あるいは最先端技術でいくなら、bazaar のような、svn プロトコルに対応した分散構成管理ツールをつかうという手もある。
svn のマージはわりとややこしいし、ログの類もマージ作業に依存してしまうので、こっちのが構造的にははるかにスマート。
この場合、自分の変更分はローカルコミットとして維持する形になる

756 :デフォルトの名無しさん:2009/12/22(火) 12:26:40
>>755
詳しい説明d。
ただ、AngelScriptはWIPのみsvnを公開してるみたいなので、

>手元のレポジトリに「ベンダーブランチ」として公式の内容をまるごとコピーして、さらにそこからマージする

というやり方になりそう。
ちょっと試してくる。

757 :デフォルトの名無しさん:2009/12/22(火) 12:38:19
>>756

WIPってなにかと思ったら work in progress か。
まあ、そりゃ svn ってのはそういうものだから^^;

えーと、任意のリリースバージョンならタグうたれてるみたいだから

ttps://angelscript.svn.sourceforge.net/svnroot/angelscript/tags/

からとれるかと。
バージョン間でのマージ処理したければ、ここのツリーの差分をひろってくればいい

758 :デフォルトの名無しさん:2009/12/22(火) 16:40:58
そもそも
英語が苦手とか駄々こねてんじゃねえよクソが
死ねばいいのに

759 :デフォルトの名無しさん:2009/12/22(火) 17:24:49
ごめん誤爆してた

760 :デフォルトの名無しさん:2009/12/22(火) 17:30:59
>>759
ということにしたいんですね

761 :デフォルトの名無しさん:2009/12/22(火) 17:34:46
メインラインにマージしてもらえば今後そのケースで悩む必要は無いというのに
英語が出来ないからというそれだけの理由で一生無駄な作業をしつづけるんだろうな
英語が出来ずともパッチ送るだけで十分なのに

762 :デフォルトの名無しさん:2009/12/22(火) 17:39:17
そういうのはそう思う人がやればよろし。おしつけはおーぷんそーすの精神に反するのでいくない

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
>>762の人気に嫉妬

768 :デフォルトの名無しさん:2009/12/22(火) 23:16:08
4800円もするpython入門書が古い版でしかもC組み込みについて全然触れてなかったでござる

769 :デフォルトの名無しさん:2009/12/22(火) 23:33:42
何も文章書かずにパッチだけいきなり送るとか、どんだけ失礼なんだよ。

770 :デフォルトの名無しさん:2009/12/23(水) 02:41:15
お歳暮だって何も文章書かずにいきなり送りつけてくるだろ。

771 :デフォルトの名無しさん:2009/12/23(水) 02:58:59
最近お歳暮という日本の習慣を覚えたばかりの外国人の方ですか?

772 :デフォルトの名無しさん:2009/12/23(水) 07:42:11
つまりパッチにoseiboって書いて送れと

773 :デフォルトの名無しさん:2009/12/23(水) 07:56:22
おう、てめーらサンタさんディスってんのか

774 :デフォルトの名無しさん:2009/12/23(水) 13:52:13
サンタさんはいい子にしかこないけど、
いい子以外にもパッチを送りつけるような真似はいかがなものかと。

775 :デフォルトの名無しさん:2009/12/23(水) 15:55:19
ASが悪い子だと

776 :デフォルトの名無しさん:2009/12/25(金) 21:46:07
>>769
gitなんかdiff形式のメール生成して送る機能なかったけ?w

777 :デフォルトの名無しさん:2009/12/25(金) 21:48:17
まーでも、こういうときってgithubとかbitbucketみたいなサービス使って欲しくはある。
forkして変更して、変更を相手に送る(pullリクエストする)というのがシステムに組み込まれているから、
パッチ送るのも気軽なんだよね。

778 :デフォルトの名無しさん:2010/01/04(月) 14:49:54
コムラッドのタカネ終わってるな
http://namidame.2ch.net/test/read.cgi/venture/1260791115/l50
http://set.bbspink.com/test/read.cgi/sm/1246009466/l50
http://set.bbspink.com/test/read.cgi/sm/1249183350/l50

779 :デフォルトの名無しさん:2010/01/04(月) 15:51:39
オイ俺のコピペ脳、まで読んだ。

780 :デフォルトの名無しさん:2010/01/06(水) 09:15:42
Lua について相談なんですが、
メタテーブルの __newindex を使えば、
テーブルに新しい key を追加するときにフックをかけることができるけど、
同じような感じで、テーブルの既存の key の値を変更するときに、
フックをかけることってできないかな?


781 :デフォルトの名無しさん:2010/01/06(水) 10:36:17
メタテーブルの__indexは調べた?

782 :デフォルトの名無しさん:2010/01/06(水) 11:26:52
__index は調べたんですが、
キーがすでにテーブルにある場合は __index はなにもしないですよね。
Metatable の index の擬似コードから抜粋:

local v = rawget(table, key)
if v ~= nil then return v end ← キーが存在するならその値を返す。

http://www.lua.org/manual/5.1/manual.html#2.8


783 :デフォルトの名無しさん:2010/01/06(水) 11:52:07
単純に、テーブル本体は何も仕事をしないでメタテーブルにすべて丸投げしたい
と考えれば簡単なことなんだけどな。
空のテーブルにメタテーブルを持たせて key が何も無い状態を維持すれば良い。

いったんメタテーブルに丸投げするが、データを保持する仕事はテーブル本体でやる
と考えるとややこしくなるよな。

784 :デフォルトの名無しさん:2010/01/06(水) 12:20:51
確かに! 間に空テーブルをかませばいいんですよね。
ありがとうございました。

785 :デフォルトの名無しさん:2010/01/11(月) 00:41:10
Lua 5.2.0 work1 出てるね
ファイナルもうすぐかも

786 :デフォルトの名無しさん:2010/01/11(月) 18:50:02
> ファイナルもうすぐかも
それはない

787 :デフォルトの名無しさん:2010/01/12(火) 01:12:00
環境周りが結構変わったのかな?
- lexical environmentsの導入(in EXP do BLOCK end)
- setfenv/getfenvがなくなった(debugのはある?)
- 全thread(コルーチン)で環境はひとつのみ?
自作ライブラリは結構見直さないとなー


788 :デフォルトの名無しさん:2010/01/12(火) 03:37:11
こうですか?わかりません
local x = 1 do
 local y = 2 do
  ・・・
 end
end

in {x = 1} do
 in {x = x, y = 2} do
  ・・・
 end
end

789 :デフォルトの名無しさん:2010/01/12(火) 10:13:28
lexical environment は、ECMAScript (JavaScript) の with みたいなもんかな。
set/getfenv は関数に対して破壊的な操作をしてしまうので、新しいやり方のほうがきれいに書けるかも。


790 :デフォルトの名無しさん:2010/01/12(火) 11:19:29
空テーブルをsetfenvするモジュールシステムに慣れてる人なら、
もともと空っぽの環境を破壊されてもほとんど困らないけどね

791 :デフォルトの名無しさん:2010/01/12(火) 21:19:47
破壊的なのは「グローバルな関数の環境を変えてしまう」って
とこじゃないの?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

793 :デフォルトの名無しさん:2010/01/13(水) 01:02:20
Tropico3という箱庭(miniスケープの方の)ゲームでlua使われてた。
なんかzlib圧縮(?)されてるから.luaファイルみてもわからんけど

794 :デフォルトの名無しさん:2010/01/13(水) 09:45:12
>>792
それであってるんじゃないかな?
print が global_f の外側で local で宣言されていれば global_f が作られた時点で固定化される(レキシカル変数として)けど、
そうでなければグローバル変数として参照されるので、
環境を変えればその影響を受ける。

795 :791:2010/01/13(水) 19:13:03
実際にビルドして試したので「間違い」で正しいかと。
本質的にはスレッドに対するsetfenvと同じで
>94の勘違いと同質な問題。
子供の関数の呼び出しまで影響を受けるとなると
危険極まりないのも事実だし。(トレードオフではあるが)

それよりもpcalやCスタック先からyield可能になったのは大きい。


796 :デフォルトの名無しさん:2010/01/14(木) 07:28:39
あ、ごめんなさい。勘違いしてた。
関数が定義された場所の環境をそのまま引き継ぐってことですよね。
だから、スクリプトファイルを読み込むとき(dofile とかで)に in ... do を使うと、
以後、そのファイル内で定義された関数はサンドボックス環境で実行されるわけか。

797 :デフォルトの名無しさん:2010/01/14(木) 18:43:54
Luaって

table =
{
element1 = 3
element3 = "str"
func element2() ...... end
}

みたいなことできませんか?

798 :デフォルトの名無しさん:2010/01/14(木) 18:52:44
事故解決しました。。。。ごめんなさい

799 :デフォルトの名無しさん:2010/01/15(金) 06:58:28
Lua 5.2 work2キタ━━
ファイナルもうすぐかも

800 :デフォルトの名無しさん:2010/01/15(金) 08:28:47
URLください

801 :デフォルトの名無しさん:2010/01/24(日) 11:27:15
lua5.1.dllがノートンでウィルス扱いされるな

802 :デフォルトの名無しさん:2010/01/24(日) 11:46:33
なにそれこわい

803 :デフォルトの名無しさん:2010/01/24(日) 18:24:53
そういやShiftJIS対応Lua5.1.3もノートンでウィルスありと判定されてたな。
誤検出なのかな?

804 :デフォルトの名無しさん:2010/02/03(水) 00:46:56
皆luaスクリプトの暗号化はどうやってるん?
リファレンスマニュアル探したけど、それらしい物が無かったんだが…

805 :デフォルトの名無しさん:2010/02/03(水) 00:53:24
Luaってシリアライズできなかったっけ

806 :デフォルトの名無しさん:2010/02/03(水) 01:12:18
lua_load/lua_dumpで自前で暗号化するくらしかできんよね

807 :デフォルトの名無しさん:2010/02/03(水) 08:55:04
暗号化したファイルを読み込んで復元し、文字列にする>luaL_loadbufferやluaL_loadstringにその文字列を渡してコンパイル
って手順ではダメ?

808 :デフォルトの名無しさん:2010/02/03(水) 10:27:02
Python人気ねーな。luaより断然コード書きやすいのに。遅いけど

809 :デフォルトの名無しさん:2010/02/03(水) 12:43:27
>>808
>>4

810 :デフォルトの名無しさん:2010/02/03(水) 12:46:04
Luaがもうちょっとキモくない文法ならいいんだけどなぁ

811 :デフォルトの名無しさん:2010/02/03(水) 12:49:10
文法だけ変換するプリプロセッサかトランスレータのようなものを作ればいいんじゃないだろうか

812 :デフォルトの名無しさん:2010/02/03(水) 13:02:55
たった数十kbくらいのサイズで
Cライクな文法が使える超軽量な組み込みないかな
LuaとかPawnも、小さい部類だろうけど不要な物が多すぎる

813 :デフォルトの名無しさん:2010/02/03(水) 18:35:51
asじゃあかんの

814 :デフォルトの名無しさん:2010/02/03(水) 21:16:11
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バイトになってる
どこがおかしいのかわからん

815 :デフォルトの名無しさん:2010/02/03(水) 21:57:11
整数も浮動小数点で計算するからだそうだ‥‥
64bit integerに対して64bit doubleじゃ精度足りないっての

パッチがあったからつっこんでみるが、ちゃんと動くか心配だ

816 :804:2010/02/03(水) 21:57:40
>>805->>807
アドバイスありがとう。
luaL_loadbufferやluaL_loadstringを使うという発想は思いつきませんでした。

817 :デフォルトの名無しさん:2010/02/04(木) 15:53:15
>>811
Euphoria, t3x, moto, JavaなどCトランスレータを実装している言語は探すと色々あるものの、
トランスレート後に吐いたCソースとハンドコードしたCソースとのリンク方法が
文章化されてなかったりするするんだよな。

>>812
小さくはないが...elastiCは?
ttp://www.elasticworld.org/

818 :デフォルトの名無しさん:2010/02/04(木) 19:12:28
Luaスクリプトってバインダなしで使い物になるレベル?

819 :デフォルトの名無しさん:2010/02/04(木) 19:41:20
何らかのバインダ及びグルーが無いと、スクリプトの意味が無い気が。

820 :デフォルトの名無しさん:2010/02/04(木) 21:35:40
mingw ,gcc を前提としてるバインダが多い様な気がして
lua手を出しにくいのです。。。

821 :デフォルトの名無しさん:2010/02/04(木) 21:52:42
lua51.libとlua5.1.libって何が違うんだろう

822 :デフォルトの名無しさん:2010/02/04(木) 21:53:06
それは気のせいないし思い込みでは……

823 :デフォルトの名無しさん:2010/02/04(木) 21:57:42
.so を makefile でつくる、という事例にちょくちょく
遭遇しまうまう・・・orz

824 :デフォルトの名無しさん:2010/02/04(木) 22:02:22
バインダはLuaではなくバインダという言語である!!


825 :デフォルトの名無しさん:2010/02/04(木) 22:04:46
$(CC) を $(CL) とか代えて、pkg-config はそのままでも
nmake -f makefile でビルドできるもんなんだろうか・・・

826 :デフォルトの名無しさん:2010/02/05(金) 00:11:51
pkg-configはシェルスクリプトだからmsysなりcygwinなり要るだろ

827 :デフォルトの名無しさん:2010/02/05(金) 00:39:23
nmakeには、一から書き直して食わしてる
必要なobjぐらいなら写せるだろ

828 :デフォルトの名無しさん:2010/02/05(金) 00:52:13
それ全然lua関係ないじゃん

必要なc/cppファイルひろって Makefile 書き直すなり
Visual Studio でプロジェクトファイルつくるなりぐらいやりなされ。
そんな難しいもんじゃない。

829 :デフォルトの名無しさん:2010/02/05(金) 11:59:44
>>828
こういう問題を回避するためにSquirrelのソースパッケージをCMake対応にして
フォーラムに投げてみたら、いらないって言われた……。

830 :デフォルトの名無しさん:2010/02/05(金) 18:05:55
オレはCMakeで固まろうとした

831 :デフォルトの名無しさん:2010/02/06(土) 12:14:44
luaのuserdataとlightuserdataの違いって

userdata
・lua側でアロケート
・lua側でデアロケート(GC)
・Cには参照のみが渡される
・Cからは寿命が分からない

lightuaserdata
・C側でアロケート
・C側でデアロケート
・luaには参照のみが渡される
・luaからは寿命が分からない

これ以外になんか有りますか?
それとluaとCでuserdata、lightuserdataの寿命を同期させる方法は有りますか?

832 :デフォルトの名無しさん:2010/02/06(土) 12:41:41
meta tableの有無も違ってたかも

833 :デフォルトの名無しさん:2010/02/06(土) 14:15:34
>>831
これは心の贅肉をそのまま箇条書きにしたみたいで面白いな

考え方としてはとりあえず
lightuserdataは無くても整数値で代用できる、と割り切ってしまうほうが簡単
そうすると、整数とuserdataを比較するのは無意味だとわかる

834 :デフォルトの名無しさん:2010/02/06(土) 21:32:49
|Д゚)<バインダが面倒な人向けにいいもの置いておきますね
|Д゚)つ[AngelScript]
|ミ サッ  [AngelScript]

835 :デフォルトの名無しさん:2010/02/06(土) 21:47:45
//
/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ AngelScript!!
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ

836 :デフォルトの名無しさん:2010/02/06(土) 23:25:21
>>832,833
レスどうもです
メタテーブルの有無は重要ですね
いろいろいじってようやくユーザークラスをLuaに公開できるところまでこぎつけました
しかしlightuserdataは使い道がわからず・・・

837 :デフォルトの名無しさん:2010/02/07(日) 10:50:27
lightuserdataはCからのポインタの入れ物として使うのが想定されているらしい。

838 :デフォルトの名無しさん:2010/02/07(日) 14:36:10
lightuserdataは、スクリプトで操作したいクラスのインスタンスとか放り込むんじゃないの?
ゲームとかだとひとつのスクリプトで複数のオブジェクトを制御する必要があるし。

839 :デフォルトの名無しさん:2010/02/07(日) 15:41:29
C++のオブジェクトとLuaのオブジェクトが混在するのか・・・
C++/CLIならもっとすごいことになるな

840 :デフォルトの名無しさん:2010/02/07(日) 17:14:33
C++のオブジェクトをスクリプトで操作する感じかな。
例えばスクリプトで

SetSpeed(1,20)

とかいうような関数があった場合、C++側でlightuserdataを取り出し、

//lightuserdataからObjectのポインタを取り出す
Object *lpObject=(Object*)GetLightUserData(L);

//Objectを操作する
lpObject->SetSpeed(x,y);

って感じの処理をするグルー関数を用意する。

841 :デフォルトの名無しさん:2010/02/07(日) 18:22:00
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

842 :デフォルトの名無しさん:2010/02/07(日) 18:44:41
userdataとlightuserdataは全く別物。用途が違う。
パソコンでできることがケータイではできないと嘆いているようなもんだぞ?

843 :デフォルトの名無しさん:2010/02/07(日) 19:23:56
>>841
そういうことができなくなってる分軽いわけなんだが……



844 :デフォルトの名無しさん:2010/02/07(日) 19:31:07
じゃあlightuserdataは何に使うんだろう
コールバック的な使い方でしょうか

845 :デフォルトの名無しさん:2010/02/07(日) 19:44:12
だから主にC側で作ったインスタンス(のポインタ)の受け皿だって

846 :デフォルトの名無しさん:2010/02/07(日) 19:51:50
>>844
てか、マニュアルにもCのポインタそのものだって書いてあるだろう。
Cでよくあるハンドルスタイルやコールバックスタイルの構造を直接扱うためにある。
例えば fopenの帰り値の FILE* を void* にキャストして lightuserdata として持ってそのまま使う。

処理する時には、必ずCの関数をいちいち呼び出すのを前提として、
「LUA側は持ってるだけで何もさわらないデータ構造」として準備されてる。

これの使い方が直感的にわからない人がいるってのが驚きだった^^;

847 :デフォルトの名無しさん:2010/02/07(日) 20:54:46
わからない人というか、深読みする人もたまにいるな。
ひどくなると「それはただの××だよ」と言われると反論してくる。
「お前はそうやって分かったつもりになってるだけだ」とか。

848 :デフォルトの名無しさん:2010/02/07(日) 21:05:07
lightuserdataはテーブルのキーとして使う。
自前のオブジェクトのアドレスや、OSから渡されるハンドルをキーにしてテーブルを参照すれば、同じアドレスやハンドルに同じuserdataを対応させることができる。
ちなみに、この時のテーブルはweak tableにしておくといい。

ということを初めて知った時は目から鱗だった。

849 :デフォルトの名無しさん:2010/02/07(日) 22:40:47
何かLuaって面倒くさいな(´ω`)

850 :デフォルトの名無しさん:2010/02/07(日) 23:14:16
ひたすら軽量さが売りの言語って感じだなあ。

851 :デフォルトの名無しさん:2010/02/07(日) 23:22:51
ところで848のテクニック?のサンプルソースとかどっかでダウンロードできないかな?

852 :デフォルトの名無しさん:2010/02/07(日) 23:50:34
>>841みたいにuserdataの方にクラスのインスタンスのポインタを格納して
Luaから呼ばれるC++側の関数で取り出して使ってるんだけど、>>831
みるとuserdataはLua側でGCかかるの?

853 :デフォルトの名無しさん:2010/02/08(月) 00:40:38
http://codepad.org/8Z7d8J62

うーんこんな感じですかね?
ポインタをキーにという発想はすごい便利そうな予感がしますね
しかしグルーコード内のエラー処理とかってどうすればいいんだろう
C++例外を投げるべきなのか、関数内でもみ消してlua_errorするべきなのか

854 :デフォルトの名無しさん:2010/02/08(月) 07:40:28
>>852
「C++側」と「Lua側」をきっちりと分離したいんだな。
組み込み言語は、そういう幻想にうんざりしてる人のためにあるんだと思うけどな。

855 :デフォルトの名無しさん:2010/02/08(月) 10:48:05
Luaって速度が同じぐらいで、文法が素直な組み込みスクリプトが作られたらあっという間に駆逐されそう

856 :デフォルトの名無しさん:2010/02/08(月) 11:02:47
>>855
作られてないから駆逐されてない訳で

857 :デフォルトの名無しさん:2010/02/08(月) 11:04:23
もともとマイナーな分野なのに亜流が既にいくつも出ていてそれができないってことは
実際のところLuaのバランスが優れているってことでしょ

858 :デフォルトの名無しさん:2010/02/08(月) 12:13:32
罠を避けるのが上手い。
静的型 クラス メタプログラミング 並列処理 遅延評価 参照透明性 ・・・

859 :デフォルトの名無しさん:2010/02/08(月) 12:58:59
文法重視で速度気にしてない人は squirrel 使ってるし普通に棲み分けになってんじゃね?

860 :デフォルトの名無しさん:2010/02/08(月) 13:04:33
自分がLua選んだ理由は日本語の資料が一番多かったからだな。
次点の理由はスタティックリンクできたから。

861 :デフォルトの名無しさん:2010/02/08(月) 19:55:29
文法が嫌いとかいうやつって、
自分の英語ができないのは分法を教えるからって口だろ

862 :デフォルトの名無しさん:2010/02/08(月) 20:54:28
まぁ855の言うことが真ならSquirrelによってあっという間に駆逐されてるはずだな。

863 :デフォルトの名無しさん:2010/02/08(月) 20:56:42
>>861
逆だよ。
文法ができないから英語できないんだよ。

864 :デフォルトの名無しさん:2010/02/08(月) 21:00:44
>>863
>861が何を言ってるのか分かってるの?w

865 :デフォルトの名無しさん:2010/02/08(月) 21:12:14
俺スクリプトをLuaのVM用のバイトコードにコンパイルすればいいじゃん

866 :デフォルトの名無しさん:2010/02/08(月) 21:19:01
yieldをライブラリとして提供するのは実装の幅を狭めてると思う

867 :デフォルトの名無しさん:2010/02/08(月) 23:28:24
>>862
>>347みる限り速度はでLua>>>>Sq

868 :デフォルトの名無しさん:2010/02/08(月) 23:34:53
はじめて日が浅いけど L とか -1 が乱舞する
C拡張に馴染む日はくるんだろうか俺・・・

869 :デフォルトの名無しさん:2010/02/08(月) 23:37:30
>>868
俺は2日で拡張できるようになったぞ

870 :デフォルトの名無しさん:2010/02/09(火) 09:34:09
>>347では速度がLuaより早いにも関わらず日本ではあまり使われていないGameMonkey。
ざっと見た感じは文法も特に変な感じじゃないから、使いやすそうな感じはするんだけどね。

日 本 語 資 料 皆 無 だ け ど な

871 :デフォルトの名無しさん:2010/02/09(火) 11:26:11
>日本語資料
月並みなことを言うと
因果関係ではなく相関関係ならあるかもしれない

872 :デフォルトの名無しさん:2010/02/09(火) 11:32:07
Pawnも文法はシンプルに見えるが流行らないのはやっぱり何かが足りないんだろうな

873 :デフォルトの名無しさん:2010/02/09(火) 14:25:57
足りないというよりはLuaの情報量や実績やユーザ数を
代えられるほどのものではないということだろう

874 :デフォルトの名無しさん:2010/02/09(火) 16:13:12
Luaってゲーム以外で使われてますか?

875 :デフォルトの名無しさん:2010/02/09(火) 16:40:55
>>874
SciTEとか

876 :デフォルトの名無しさん:2010/02/09(火) 17:04:31
apacheとかwiresharkの拡張に地味に使われてたりする
もともとゲーム向けってわけじゃないしね

877 :デフォルトの名無しさん:2010/02/09(火) 17:50:35
Schemeが以外と流行らなかったな

878 :デフォルトの名無しさん:2010/02/09(火) 17:56:04
>>874
TextAdept
http://caladbolg.net/luadoc/textadept2/manual/1_Introduction.html
半分以上 Lua で記述され、また Lua で拡張可能なテキストエディタ
iconv で読み書きし内部は UTF-8 なので、日本語も使用可

879 :デフォルトの名無しさん:2010/02/09(火) 21:54:30
>>874
tokyotyrantでLua知ったよ

880 :デフォルトの名無しさん:2010/02/10(水) 14:33:21
http://dev.pocoo.org/projects/pygments/browser/pygments/lexer.py
http://www.frykholm.se/files/markdown.lua
http://coderay.rubychan.de/

プロジェクト管理ツール を作ろう
Redmin, Retrospectiva, Trac

基本組み込み用途だよね、とツールを作る用途で
移行する気が起きない理由はこの辺にありそうだとさっき気がつきました・・・

881 :デフォルトの名無しさん:2010/02/10(水) 17:47:01
lua5.1のDLL版を使ってるんですが、グルーコードの呼び出し規約は__cdeclでいいんでしょうか?
それとも__stdcallにしたほうがいいですか?

882 :デフォルトの名無しさん:2010/02/10(水) 20:55:07
>>881
たぶん__cdeclだけど仮に間違っていたとしても
name manglingの違いで簡単に見分けられるような気がする

883 :デフォルトの名無しさん:2010/02/10(水) 20:57:16
DLLを使う側の言語の規約に合わせるんだ
Cでしか使わないのなら目的にもよるがどっちでもいいと思うがな

884 :デフォルトの名無しさん:2010/02/10(水) 22:45:42
>>882
>>883
thxです
さっきluaのヘッダ見たところ呼び出し規約は書いてなかったので多分C言語デフォルトのcdeclでよさそうですね

885 :デフォルトの名無しさん:2010/02/11(木) 14:50:36
Programming in Lua携帯するにはしんどいな
PDFで売ってくれりゃいいのに

886 :デフォルトの名無しさん:2010/02/11(木) 15:59:41
ばらして持ち歩けよ

887 :デフォルトの名無しさん:2010/02/11(木) 16:49:25
組み込んで歩けよ

888 :デフォルトの名無しさん:2010/02/11(木) 18:52:41
lua で連想配列形式のテーブルの要素数を調べる方法ある?
配列形式だったら #tbl で、出来るみたいだけど・・・。

889 :デフォルトの名無しさん:2010/02/11(木) 20:14:39
userdata型に型情報を与えて
BOOL isHoge(lua_State *, index);
の形で使いたいんですが
luaのほうで予め提供されてる方法はありますか?
それとも、自分で独自にマップするものなんでしょうか?

890 :デフォルトの名無しさん:2010/02/11(木) 20:46:48
>>888
pairsやnextかな

891 :デフォルトの名無しさん:2010/02/11(木) 21:04:58
nextだとnilが設定されたフィールドでハマるので
pairsを使った方がいいんじゃまいか

892 :デフォルトの名無しさん:2010/02/11(木) 23:23:44
luabashがすばらしすぎる。

bashにluaインタプリタ機能追加してbashの拡張ができる&
bashが生きている間luaインタプリタも生きているのでlua変数を
保持し続ける。これ重要。

ファイル操作が多いとやっぱりシェルスクリプトが楽だけど
コマンド間の結果の連携を環境変数orファイル書き出しで
実装するのはかったるい時に大活躍な予感。


893 :デフォルトの名無しさん:2010/02/14(日) 01:40:15
組み込み用途以外でLua使おうなんて思わんな
汎用的に使うには標準ライブラリ貧弱だし
thenとかdoとか書くの面倒だし

894 :デフォルトの名無しさん:2010/02/14(日) 02:40:47
低レベルな質問で申し訳ないのですが
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
このコメントが鍵のような気もするのですが正直意味が分かりません・・・

895 :デフォルトの名無しさん:2010/02/14(日) 03:09:57
誤爆ってる、失礼しました

896 :デフォルトの名無しさん:2010/02/14(日) 11:30:21
   /ヽ /ヽ
  ':' ゙''"  `':,
  ミ   ・ω・ ;,
 :; . っ     ,つ Lua!
  `:;      ,;'
   `( /'"`∪


897 :デフォルトの名無しさん:2010/02/15(月) 16:13:25
自作型で__gcでC側のリソースを開放してるんだが
__gcをうっかり書き換えてしまわないように
メタテーブルを隠蔽あるいは変更不可にすることはできるだろうか?

898 :デフォルトの名無しさん:2010/02/15(月) 19:19:53
__gcということはユーザーデータか。ならばスクリプト側からはメタテーブル自体の変更はできない。
さらにメタテーブルに__metatableを追加しておけば隠蔽も可能になり、メタメソッドの変更、追加を防止できる。
ただしこれらはC側やdebugライブラリには効果がないし、制限する手段も(多分)無い。


899 :デフォルトの名無しさん:2010/02/15(月) 21:52:18
C++でRAIIをうっかり忘れてしまうレベルだ
初期化以外でsetmetatable()を使うのか?

900 :デフォルトの名無しさん:2010/02/15(月) 22:33:58
>>898
__metatableというのがあったのか
というかユーザデータはもともと変えられないって知らなかったorz
レスthxでした

>>899
metatableをうっかり書き換えるのはクライアントで、クラスじゃない
RAIIをうっかり忘れるのとmetatableをうっかり書き換えるのは別次元の問題
そのクライアントのついうっかりを封印して出来なくしてしまえれば安心して寝れる

901 :デフォルトの名無しさん:2010/02/15(月) 23:37:24
>>900
なにが別次元だ
ファイルを読んだり書いたりdllをロードしたりする、普通の言語じゃないか

902 :デフォルトの名無しさん:2010/02/19(金) 02:15:03
(◞≼◉ื≽◟◞౪◟,◞≼◉ื≽◟ )

903 :デフォルトの名無しさん:2010/02/19(金) 20:31:33
           ∩_
           〈〈〈 ヽ
          〈⊃  }
   ∩___∩  |   |
   | ノ      ヽ !   !
  /  ●   ● |  /
  |    ( _●_)  ミ/ Lua!!
 彡、   |∪|  /
/ __  ヽノ /
(___)   


904 :デフォルトの名無しさん:2010/02/21(日) 15:46:38
(´・ω・`)

905 :デフォルトの名無しさん:2010/02/22(月) 16:32:07
LuaInterface 使ってる?

906 :デフォルトの名無しさん:2010/02/22(月) 16:55:48
(`・ω・´)

907 :デフォルトの名無しさん:2010/02/22(月) 17:51:50
ルアのmodule(name)のnameが被ったらどうなるの?


908 :デフォルトの名無しさん:2010/02/22(月) 20:06:58
name ru houkei

909 :デフォルトの名無しさん:2010/02/25(木) 02:06:10
local foo = function ()
  local c = 0

  return function ()
    c = c + 1
    return c
  end
end


f1 = foo()
f2 = foo()

この場合f1とf2に渡される情報はcと関数の参照だけ?
それともcを含めて関数まるごとコピーされちゃったりする?

910 :デフォルトの名無しさん:2010/02/25(木) 08:44:16
クロージャとしては別々だけどコードはもちろん共有

911 :デフォルトの名無しさん:2010/02/25(木) 08:54:10
UpValとProtoの参照
それとenvの参照

912 :デフォルトの名無しさん:2010/02/26(金) 02:47:27
なんかロベルトさんがLua5.2のグローバルとか環境まわりの仕様変え始めたような。lua-l参照。

913 :デフォルトの名無しさん:2010/02/26(金) 14:12:12
バージョンアップは無能レベルに到達するまで止まらない
でも5.2はまだリリースされてないから止めようと思えば止められるけど

914 :デフォルトの名無しさん:2010/03/03(水) 04:05:04
イエルサリムスキー教授の翻訳本にuserdataのメタテーブルはLuaからCを出しぬいて手出しすることはできないから安全、みたいなことが書いてあるんだけど

ud = create_ud()
getmetatable(ud).__gc = nil

のようにごくごく普通にアクセスできるように思えるんですが・・・これは本の間違いじゃないですかね?

915 :デフォルトの名無しさん:2010/03/03(水) 08:33:03
>>914
保守的GCって知ってるか
解放すべきかどうか疑わしいときは、解放しないほうが安全

916 :デフォルトの名無しさん:2010/03/03(水) 11:12:19
>>915
今ググって知りました
しかし、保守的GCの話は>>914の話とは関係ないように思えるのですが、実は何か関係があるんでしょうか?

917 :デフォルトの名無しさん:2010/03/03(水) 11:20:30
Squirrelに興味があるやつは見ておけ。
よく考えられてるサンプルだと思う。
http://ruriko.denpa.org/201002c.html#23

918 :デフォルトの名無しさん:2010/03/03(水) 18:44:23
>>914
userdataはsetmetatableはできないがgetmetatableはできる。
よってその例のようなアクセスはできる。
禁止したいなら__metatableを適切な値に設定するといい。

919 :デフォルトの名無しさん:2010/03/03(水) 19:47:36
安全とは禁止することと見つけたり・・・

920 :デフォルトの名無しさん:2010/03/07(日) 11:27:59
coroutineの利点がいまいちわかんね
state:update()の戦略の方がコスト低いしわかりやすいと思うんだが

921 :デフォルトの名無しさん:2010/03/07(日) 12:48:09
利点がわかんないなら
君には不要って事なんだよ
無理して使う必要ない

922 :デフォルトの名無しさん:2010/03/07(日) 15:01:14
自分の理解している範囲の外に利点があることだって普通にあると思うけど。

923 :デフォルトの名無しさん:2010/03/07(日) 15:08:48
複数回に分けて動かさないといけない処理を継続的な処理として実装可能になる。
結果として同期処理の不要な軽量スレッド的な実装ができるようになる。

924 :デフォルトの名無しさん:2010/03/07(日) 15:46:16
コルーチンは、ゲームで「アイテムを取った直後に一定時間白くなる」という処理を書くときとか便利だな。


925 :デフォルトの名無しさん:2010/03/07(日) 16:04:54
>>921
むちゃくちゃな論理展開わろた^^

>>922
ですよね

>>923
複数回に渡って処理を分割するのってstateパターンでも普通にできることだと思う
コルーチンじゃないとどうしてもできない、あるいは明らかに優れてるっていう要素が自分には見えないんすよね

926 :デフォルトの名無しさん:2010/03/07(日) 16:07:46
Stateパターンが「普通」?
Stateパターンのような回りくどいことをしないといけないのがおかしいとは思わない?

927 :デフォルトの名無しさん:2010/03/07(日) 16:23:51
>>925
どうしてもできないから、で使ってる人はいないよ。
機能的にすぐれてる部分は全く無い。ぶっちゃけコルーチンも、
全状態保持を言語側が担ってくれてるだけのおおがかりな state だから。

State パターンで何個もあったり、さらには個数が変動したりするオブジェクトの複雑な
挙動のからみあいとか、考えたくもないけど、コルーチンだとわりとすっきり書ける。

最初に仕様にあわせて組んでいくだけなら State でもいいんだけど、
後から見直す時とか、細かい修正に対応する時とか、コルーチンのが圧倒的に読みやすいし記述も楽。
遷移図をそのまま if や while やら使って書き起こすだけだけになるからね

コルーチン切り替えのコストは、固定で組まれた State 切り替えよりかなり大きくなってしまうけど、
表記の楽さがそれを上回る、と判断した人が使うもの。あらゆる状態遷移を頭の中だけでさくさくくめてしまえるので、
State のが簡単だよって言う人は知り合いにもいるけど、それ、凡人には無理ですからー


928 :デフォルトの名無しさん:2010/03/07(日) 16:36:19
そもそもオブジェクト指向におけるデザインパターンというのは、
言語側でサポートしきれていないニーズを無理やり克服するためのバッドノウハウのようなものだ。

929 :デフォルトの名無しさん:2010/03/07(日) 18:44:20
>>925
例えばFizzBuzzの通常版が既に完成していて
function fizzbuzz(n, print) for i = 1, n do ... print("FizzBuzz") ... end

後になってState版が必要になったときに使う。
co = coroutine.create(function() fizzbuzz(100, coroutine.yield) end)

930 :デフォルトの名無しさん:2010/03/07(日) 22:20:25
コルーチンの便利さは、記述が簡単になるって点だな。

931 :デフォルトの名無しさん:2010/03/07(日) 22:34:16
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. とか

おつかい行って来てよ、と丸投げしまう簡便さ
でもちゃんと帰ってこれるのかな・・・的不安

932 :デフォルトの名無しさん:2010/03/08(月) 08:18:34
>>930
コルーチンは記述が簡単なだけに非同期対応が面倒に感じるんだよな
>>924みたいな単純な処理ですら、アイテムを連続で取るとキャラが白くならなかったり、
直後にゲームクリアしてもキャラが白いままだったり、直後にキャラが変身するとハングしたりとか
Stateパターンならちゃんと回避できる人がコルーチンだと回避し忘れるのはありがちなこと

933 :デフォルトの名無しさん:2010/03/08(月) 14:56:36
(何言ってんだコイツという眼差し)

934 :デフォルトの名無しさん:2010/03/08(月) 23:06:08
>>932
他の人はコードで例を示しているんだから、君もコルーチンよりStateパターンが明らからに優れているという例をコードで示したら?
そうでないと、ただの知ったか君と区別つかないよ

935 :デフォルトの名無しさん:2010/03/08(月) 23:32:20
>920の「state:update()の戦略」が良く判らん……トランザクションのこと?

936 :デフォルトの名無しさん:2010/03/09(火) 00:01:37
Stateパターンを理解してりゃ、そこは判らない文脈じゃないと思うけど。

937 :デフォルトの名無しさん:2010/03/09(火) 00:07:39
switch(state) { case WALK: … case WAIT: … case ATTACK: … }
をちょっと格好付けただけ
コルーチンと比較されるような使い方の場合は特にメリットもない

938 :デフォルトの名無しさん:2010/03/09(火) 00:47:56
>>936
ハイハイ、逃げないでコードで示してね
それともやっぱり、知ったか君だったのw

939 :デフォルトの名無しさん:2010/03/09(火) 01:02:11
そもそもコルーチンと組み込み系言語って何か関係あるの?

940 :デフォルトの名無しさん:2010/03/09(火) 01:15:03
このスレで話題になることが多い lua と squirrel が搭載している、以上のものではないかな
他何が搭載してたっけ

941 :デフォルトの名無しさん:2010/03/09(火) 01:20:31
よくわかんないけど状態遷移するたびにStateインスタンスを破棄、生成してれば
切り替わるタイミングが明確になって後片付けとかが確実になるとかそういうことなんじゃないの

942 :デフォルトの名無しさん:2010/03/09(火) 02:34:51
ちなみに型が厳密な言語でコルーチンを扱うと複雑になるか、制約が大きくなる
どのみちオブジェクト指向が好きならJavaとかC#とかで正解なんだよ

943 :デフォルトの名無しさん:2010/03/09(火) 02:43:45
小規模だとコルーチンのがキモチイイけど、遷移が複雑になってくると機械的に遷移図からコードに直せるステートのほうがいいかなって感じる


944 :デフォルトの名無しさん:2010/03/09(火) 03:03:14
画面遷移処理とか、ADV的な演出の逐次制御とかはコルーチンがいいかんじにはまるね

945 :デフォルトの名無しさん:2010/03/09(火) 09:40:22
コルーチン=呼び出すと区切りの部分まで実行してくれる関数オブジェクト
みたいな感じで理解してるな。
Luaの場合、coroutine.resumeで呼び出すと、次のcoroutine.yieldの部分まで実行してくれる。

946 :デフォルトの名無しさん:2010/03/09(火) 12:51:46
10回繰り返し、という処理を、途中でイベントを受け取ったりしながらでも、
for (i = 0; i < 10; ++i) ですらっと書けるのがコルーチン。

947 :デフォルトの名無しさん:2010/03/09(火) 15:59:05
cでcoroutineを自作しようと思ったら難しかったでござる。

948 :デフォルトの名無しさん:2010/03/09(火) 16:26:47
奇怪で制約の多いマクロを組むか
sjljでコンテキストを書き換えるかの二択だな

949 :デフォルトの名無しさん:2010/03/09(火) 17:11:31
その話題までいくともう組み込み言語まったく関係ないな。

950 :デフォルトの名無しさん:2010/03/09(火) 20:01:13
マルチスレッドで済む処理まで凝るーチン

951 :デフォルトの名無しさん:2010/03/10(水) 13:54:54
ルアってなんであんなテーブルマンセーなの?

952 :デフォルトの名無しさん:2010/03/10(水) 14:17:35
シンプルだからじゃない?
このテーブルひとつで普通の配列も連想配列も
オブジェクトまでも扱えるから...
でも無理やりオブジェクト指向マネるくらいなら
ほかのスクリプト言語を検討するよ

953 :デフォルトの名無しさん:2010/03/10(水) 15:10:04
Luaは初心者向けに見えて
実は玄人向け

954 :デフォルトの名無しさん:2010/03/10(水) 17:48:04
違うな
M向け
マニアとマゾ

955 :デフォルトの名無しさん:2010/03/10(水) 18:37:58
AngelScript|Д`)<呼ばれたので飛んできました 
GameMonkey|Д`)<俺もー
CRIScript|Д`)<俺もー

956 :デフォルトの名無しさん:2010/03/10(水) 18:51:20
         \   l´⌒\⌒\ \\ \
           \ ヽ   )  )   \\ \\   
              (   \ \∩___∩ \\ 
           \   \  ⌒⌒| ノ      ヽ  \\      
              \ \   /  ●   ● ト、\ \\\ 
               \  Y |    ( _●_)  ミ\  \\\  
               \ / 彡、_  |∪| ノ   \  \\\
                 (____)―ヽノ' ヽ      ̄ ̄ ヽ\\
                                \,  j  l l .l }
                         Lua!   l (_ノノノノ



957 :デフォルトの名無しさん:2010/03/14(日) 18:29:44
過疎

958 :デフォルトの名無しさん:2010/03/14(日) 18:55:01
コルーチンのAAください

959 :デフォルトの名無しさん:2010/03/14(日) 19:23:00
●)(●):::\ .\ ::::::::::::::::::::::::::::::::::::::::::::::::
(__人__)./ ̄ ̄ ̄\::::::::::::::::::::::  / ̄ ̄ ̄\ コルーチン
::` ⌒´./  ⌒  ⌒ ヽ:::::::::::::::  /  ⌒  ⌒ ヽ
:::::  ./   (●)(●) |::::::::::::  /  ( ●)(●) |
\  |    (__ / ̄ ̄ ̄\  |    (__人__) }  コルーチン
  \/、.     /  ⌒  ⌒ ヽ/、..    ` ⌒´  .ヽ
    \    /   (●)(●) |             |
  \  \  |     (__ / ̄ ̄ ̄\.      | /
   |\   \/、.     /  ⌒  ⌒ ヽ──┐ |丿 コルーチン 
  | .\  \    /   (●)(●) |──┤ | 
  |  |\  \   |    (__人__) }──┤ |
  |  |  \  \/、.    ` ⌒´ ヽ\



960 :デフォルトの名無しさん:2010/03/14(日) 20:37:44
   /ヽ /ヽ
  ':' ゙''"  `':,
  ミ   ・ω・ ;,
 :; . っ     ,つLua
  `:;      ,;'
   `( /'"`∪


961 :デフォルトの名無しさん:2010/03/14(日) 20:50:30
lldebugみたいな感じのデバッガって、他のスクリプト言語にあるんだろうか?
JavaやPythonとかだと余裕でありそうだけど、SquirrelとかAngelScriptとかにはなさそうだ…

962 :デフォルトの名無しさん:2010/03/14(日) 22:45:16
>>961
SquirrelはVisual Studioのデバッガが普通に使えますが何か?

963 :デフォルトの名無しさん:2010/03/14(日) 23:35:29
>>962
マジで!?
VS上でスクリプトにブレークポイント付けたり、スクリプト内の変数見たりできるの?
やり方教えて。

964 :デフォルトの名無しさん:2010/03/15(月) 15:21:36
>>962
Squirrel Visual Studio 2008 Integration
ttp://squirrel-lang.org/forums/post/3072.aspx
これのこと?

965 :デフォルトの名無しさん:2010/03/20(土) 00:16:05
lua 5.1.4 mswin32(VC7) シフトJIS文字列定数対応版リリース

http://mynickname.web.fc2.com/lua-patch.html

966 :デフォルトの名無しさん:2010/03/21(日) 12:46:57
AngelScript用の何かいいエディターない?
入力補間とキーワードの強調が出来ると嬉しい。
とりあえすSciTE使ってみたけど引数のヒントくれなかったり色々と書きにくい。。

967 :デフォルトの名無しさん:2010/03/21(日) 12:50:31
むしろSciTEで入力補助がある方が驚きだな。
まあそんなマイナー言語、カスタマイズの利くエディタ側の機能で何とかするしかないだろ。

968 :デフォルトの名無しさん:2010/03/21(日) 13:16:12
>>967
c++と構文同じだから単純にc++の編集機能使ってるだけなんだ。
無いよりはましくらい。

969 :デフォルトの名無しさん:2010/03/22(月) 00:19:45
>>964
遅レスだが、すごいのがあるんだな。
AngelScript用のもあったりするんだろうか。

970 :デフォルトの名無しさん:2010/03/22(月) 14:55:58
angelscriptってどうなの

971 :デフォルトの名無しさん:2010/03/22(月) 15:37:49
>>970
文法がC/C++やC#そっくり、C++とのバインドが簡単、OOPも一応できる。
こんな感じか?
ただ、スクリプトでメイン部分を記述する用途には向いてないと思う。

972 :デフォルトの名無しさん:2010/03/22(月) 19:35:20
   ∧_∧  / ̄ ̄ ̄ ̄
  ( ・∀・) <  Lua!!
⊂/  9)  \____
q(   /
  >  >



973 :デフォルトの名無しさん:2010/03/23(火) 07:09:00
GDC2010 Lua Tutorial http://www.kore.net/company/luagamedev.html

974 :デフォルトの名無しさん:2010/03/25(木) 03:26:03

 V V
(´・ω・`) うさちゃんピース

975 :デフォルトの名無しさん:2010/04/09(金) 09:33:12
CRI Scriptの公式サイトなくなってる?

976 :デフォルトの名無しさん:2010/04/10(土) 02:20:44
>>975
中の人がAppleに転職したから、メンテ出来ないんで閉じたんじゃない?

977 :デフォルトの名無しさん:2010/04/10(土) 09:35:10
>>976
d
ちょっと残念。

978 :デフォルトの名無しさん:2010/04/17(土) 22:31:23
Squirrelやってみたいんだが情報が少なすぎて不安になるな

979 :デフォルトの名無しさん:2010/04/18(日) 02:28:10
v8についての質問なんだけど
組み込んでjavascriptから呼べるようにした組み込み関数なりクラスを
javascript上の名前空間に押し込める方法ってない?
もちろんjavascriptに名前空間そのものは無いので、オブジェクトのプロパティとして表現するんだけど

var x = hoge_ns.apple

みたいに呼び出したい。
javascript上で事前にラップする方法は考えたけど
元の名前が無効になるわけじゃないので、なんだかな。



980 :デフォルトの名無しさん:2010/04/18(日) 02:30:09
>>978
日本語でのフォーラム的なものはちょっと欲しいかなーと思うことはあるな。誰か設置してくれたら使うよ。


981 :デフォルトの名無しさん:2010/04/18(日) 02:34:23
>>979

var x = hoge_ns.apple
じゃなくて

var x = new hoge_ns.apple
ですね。訂正します。

javascriptは楽でいいよ。
遅いからゲームのAIとか記述するのには全く向いてないが。



982 :デフォルトの名無しさん:2010/04/18(日) 08:41:07
         \   l´⌒\⌒\ \\ \
           \ ヽ   )  )   \\ \\   
              (   \ \∩___∩ \\ 
           \   \  ⌒⌒| ノ      ヽ  \\      
              \ \   /  ●   ● ト、\ \\\ 
               \  Y |    ( _●_)  ミ\  \\\  
               \ / 彡、_  |∪| ノ   \  \\\
                 (____)―ヽノ' ヽ      ̄ ̄ ヽ\\
                                \,  j  l l .l }
                         Lua!   l (_ノノノノ



983 :デフォルトの名無しさん:2010/04/18(日) 09:37:11
javascript速いでしょ
最もパフォーマンスの最適化が研究されてる言語じゃね

984 :デフォルトの名無しさん:2010/04/18(日) 09:56:55
その速さはどの言語が担保してるのかな

985 :デフォルトの名無しさん:2010/04/18(日) 18:30:26
>>983
言語仕様上は高速化が難しいけど頑張って最適化してるってのが現状じゃなかったっけ?

986 :デフォルトの名無しさん:2010/04/19(月) 00:54:38
いや、jsは仕様が軟体動物っぽいから遅いと思うよ、タコとかイカとか。
Luaはキビキビ動くゴキブリ。

話がズレたけど、C基準で
Lua = 10C
javascript = 100C

くらいの違いはある気がする。
アレだ、誰か測ってくれ。

987 :デフォルトの名無しさん:2010/04/19(月) 08:37:10
javascriptはエンジン変わると、速さがえらい違うくね?

988 :デフォルトの名無しさん:2010/04/19(月) 09:32:19
ttp://shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=lua&lang2=v8
Lua と v8 だったら、どっちかっつうと v8 の勝利

ttp://shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=luajit&lang2=v8
LuaJIT と v8 だと LuaJIT の圧勝

989 :デフォルトの名無しさん:2010/04/19(月) 09:35:05
>>986
言いたいことは分からなくもないが例えが嫌すぎるw

990 :デフォルトの名無しさん:2010/04/19(月) 22:33:10
>>988
へー
じゃばすくりぷと思ったより速いな
LuaJITすげえ

991 :デフォルトの名無しさん:2010/04/19(月) 22:37:59
最近のJavaScriptはコードの使われ方に応じたJITコンパイルとかやるんでしょ

254 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)