【Lua】組み込み系言語総合 その2【Squirrel】
at TECH
[前50を表示]
600:デフォルトの名無しさん
09/12/05 06:44:46
>>599
完全な回答をありがとう。凄くすっきりしました。
この辺の仕様はとても良くできてるなと思いますね。
601:デフォルトの名無しさん
09/12/05 07:34:58
closureみたいなもん?
602:デフォルトの名無しさん
09/12/05 08:39:50
>>601
そう。レキシカルクロージャです。
603:デフォルトの名無しさん
09/12/05 11:28:25
すっきりとした仕様だね。
Schemeライクというか。
604:デフォルトの名無しさん
09/12/05 12:22:26
squirrel だと同等のものは「Free variables」と呼ばれててこちらは対象の明示指定が必要だね
605:デフォルトの名無しさん
09/12/05 14:12:22
未踏ユースにLua高速化が採択されているんですね。
スクリプト言語Luaの高速化と省メモリ化 (2009年度上期未踏ユース)
URLリンク(www.ipa.go.jp)
hogelog/lua (ソースコード)
URLリンク(github.com)
[lua]記事一覧 - hogeなlog (開発者ブログ)
URLリンク(d.hatena.ne.jp)
606:デフォルトの名無しさん
09/12/05 15:06:08
>>605
エエー、あんな古臭い言語を今更高速化するのが予算つくのか。
LuaJITだってあるのに。
607:デフォルトの名無しさん
09/12/05 15:20:44
ヒント: 電気通信大学
608:デフォルトの名無しさん
09/12/05 17:15:48
>>606
ところがLuaJITのGCにはあんま手が入ってはいないんだ。
609:デフォルトの名無しさん
09/12/05 17:41:58
こんなんで採択されるのかよw
ローカルなスクリプト言語
高速化してたら切りが無いぞ
610:デフォルトの名無しさん
09/12/05 17:43:19
本家と連絡取らずにやってるんなら残念な結果になる可能性が高い気がする。
611:デフォルトの名無しさん
09/12/05 17:45:53
よーしじゃあパパAngelScriptを高速化しちゃうぞー
612:デフォルトの名無しさん
09/12/05 17:56:48
C言語そのままスクリプトにしたようなのってありますか?
613:デフォルトの名無しさん
09/12/05 18:10:43
>>612
文法のことならSquirrelとかPythonがある程度近いと思うがそのまんまってのはたぶんない
614:デフォルトの名無しさん
09/12/05 18:14:43
>>612 URLリンク(csl.sourceforge.net)
615:デフォルトの名無しさん
09/12/05 18:17:18
>>612
C++だけど、CINT
616:デフォルトの名無しさん
09/12/05 23:16:35
クロージャとコルーチンさえあればもうCでいい気がしてきた俺には十分魅力的だなぁCINTわ
617:デフォルトの名無しさん
09/12/06 08:17:06
CINTにクロージャとかコルーチンとかあったか?
618:デフォルトの名無しさん
09/12/06 08:25:09
>>616
それだったらGoのほうがいいんじゃ。
619:デフォルトの名無しさん
09/12/06 11:33:15
Cっぽい文法ならAngelScriptでいいじゃない
620:デフォルトの名無しさん
09/12/07 11:25:54
pawnとgoとgamemonkeyのスルーっぷりw
621:デフォルトの名無しさん
09/12/07 11:32:15
C言語みたいなプログラム書きにくい言語でスクリプト記述したいとか、どんなマゾよ?
622:デフォルトの名無しさん
09/12/07 11:34:23
世の中、なにか一つ習得するとそれにしがみつくのが習性という猫もいるんだ。
623:デフォルトの名無しさん
09/12/07 17:37:44
>>621
これってたまに見かけるが、Cってそんなに書きにくいか?
624:デフォルトの名無しさん
09/12/07 17:49:32
>>623
慣れだよ
625:デフォルトの名無しさん
09/12/07 17:56:34
Cの書きにくさは、資源管理(malloc/free)がプログラマ任せであることや、
文字列操作がめんどいことにあって、構文や文法自体はそんなに書きにくくは
ないよね。Cが書きにくいなら、JavaがあそこまでCを引き継いだような仕様には
なってないと思う。
# でもまぁCが書きにくいと主張する人は、JavaはCから書きにくさを継承したと
# 主張するか。
626:デフォルトの名無しさん
09/12/07 18:04:16
Cの書きにくさ
・クロージャがない
・ガベージコレクションがない
・メモリアクセス保護がない
・文字列型がない
・というかコレクション型が一切ない
・というかforeachがない
・せめてイテレータくらい付けて
・関数オブジェクトの定義が面倒(定義と関数ポインタの扱いが別)
・というかファーストオブジェクトになってない
とまあ、仮にオブジェクト指向でなかったとしてもこれくらいあるわけだ。
627:デフォルトの名無しさん
09/12/07 18:06:45
アセンブラに比べたら格段に書きやすい
628:デフォルトの名無しさん
09/12/07 18:10:14
あー複雑な型の宣言や定義の構文は魔境入ってるかw
629:デフォルトの名無しさん
09/12/07 20:04:32
Cは40年近く前に出来た化石言語だからな。
当時のスペックのコンピュータで動かすためにキモイ仕様にしてるから書きづらくて当然。
630:デフォルトの名無しさん
09/12/07 21:35:50
ネイティブ系ではテンプレートの便利さに触れると、C++以外の言語を受け付けなくなるよ。
631:デフォルトの名無しさん
09/12/07 21:57:19
>>630
ふーん……。
D言語とかOCamlとかHaskellは触ってみたことあるの?
632:デフォルトの名無しさん
09/12/07 22:09:32
臭いものに蓋をするのがITの正道
蓋をしないネイティブ系・組み込み系は邪道だな
633:デフォルトの名無しさん
09/12/07 23:16:45
なでしこやろうぜ!
634:デフォルトの名無しさん
09/12/07 23:20:52
>>632
怖いものみたさor言われるままに蓋を開けて
自分の足を撃つのがITの正道
635:デフォルトの名無しさん
09/12/08 12:43:40
>>630
テンプレートでほら、関数型言語っぽいプログラミングも可能になる!!!
とか言われてもぶっちゃけあれキモいんだけど実際のところどうなの?
636:デフォルトの名無しさん
09/12/08 12:51:44
boost spiritとかboost lambdaは、使う使わないは別として、
キモいと思わない人はいないんじゃないかと。
637:デフォルトの名無しさん
09/12/08 13:51:30
C++をメインで使ってるけど、ぶっちゃけDirectXやライブラリの対応が
いいネイティブの別言語ができたらそっちに乗り換える。
638:デフォルトの名無しさん
09/12/08 13:57:23
>>637
そういうのは、ラッパーライブラリひとつで解決できる話なのさー。(他言語対応)
ただし動作検証用のコードは一部C++で用意しとかないといけないと思うが。
639:デフォルトの名無しさん
09/12/08 14:01:28
その使い勝手のいいラッパーが無いという話をしているんだろう。
640:デフォルトの名無しさん
09/12/08 15:47:16
boost::lambdaを使いこなしてない奴はC++を理解していない(キリッ
641:デフォルトの名無しさん
09/12/08 20:17:26
>>636
あれはその、なんていうかキモかわいい。
642:デフォルトの名無しさん
09/12/08 21:15:09
Brainf**kやろうぜ!
643:デフォルトの名無しさん
09/12/08 21:42:40
コンパイルにかかる時間が可愛くなさすぎる。
644:デフォルトの名無しさん
09/12/08 21:54:01
その視点で見るとGoは実に可愛らしい
645:デフォルトの名無しさん
09/12/09 05:14:24
Goって組み込めるの?
646:デフォルトの名無しさん
09/12/09 08:05:54
\ l´⌒\⌒\ \\ \
\ ヽ ) ) \\ \\
( \ \∩___∩ \\
\ \ ⌒⌒| ノ ヽ \\
\ \ / ● ● ト、\ \\\
\ Y | ( _●_) ミ\ \\\
\ / 彡、_ |∪| ノ \ \\\
(____)―ヽノ' ヽ  ̄ ̄ ヽ\\
\, j l l .l }
Lua! l (_ノノノノ
647:デフォルトの名無しさん
09/12/09 11:00:26
>>637-638
お前、なにかよさげなライブラリある度にラッパー作ってたDelphi使いの俺をなめるなよ。
さすがにもう嫌になってDelphi使ってないわ(´・ω・`) 昔は良い言語だったんだが
648:デフォルトの名無しさん
09/12/11 09:36:15
ああ、次はDelphi用Lua、Delphi用Squirrel、Delphi用AngelScriptだ…
649:デフォルトの名無しさん
09/12/12 02:30:59
ぶった斬りすいません
luaでテキストから文字を読み込んで使いたいのですが、
そのあとに文字入力のために同じ関数(io.read)を使うと文字入力できなくなってしまいます。
文字読み込みのio.readと、キーボード入力のio.readの区別をつけるにはどうすればいいのでしょうか?
よろしくお願いします。
650:デフォルトの名無しさん
09/12/12 02:34:20
>>649
651:デフォルトの名無しさん
09/12/12 05:21:19
テキストってテキストファイルのこと?
それとも標準入力?
652:>>649
09/12/12 21:22:55
>>651
レスありがとうございます。
テキストファイルから文字を取り出してluaの配列に入れています。
653:デフォルトの名無しさん
09/12/14 14:27:50
>>504-505
これってコンパイル済み(.amx)ではなくて
普通のPawnファイル(.p)も実行出来ます?
654:デフォルトの名無しさん
09/12/14 15:13:42
と思ったらPawnはコンパイル済みのしか実行出来ないみたいですね
スレ汚しすみません
655:デフォルトの名無しさん
09/12/14 19:25:17
656:デフォルトの名無しさん
09/12/14 19:26:52
Luaファイルって、配布するときに隠すことできる?
Cの組み込みで使おうと思っているのだけれど、Cはコンパイルすれば自動的にソースは見えなくなってくれるからおk。
けど、Luaファイルで記述した部分がもろばれになってしまうので、どうにかならないかなぁということです。
657:デフォルトの名無しさん
09/12/14 19:43:00
隠すというのがコンパイル後のバイナリでOKというなら、Luaもバイナリ出力することができるよ。
658:656
09/12/14 20:47:13
まじか。
URLリンク(blog.dlixia.com)
こんな感じなのか。
なんとなくだけど、Luaは簡単にリバースエンジニアリングできそうな予感がするな。。。
まぁ及第点はあるよね、きっと。
ありがとう!
659:デフォルトの名無しさん
09/12/14 23:07:40
javascriptを組み込んだらいいんじゃね?
ユーザー多いし、資料多いし。
って思ったら、処理系実装が軒並みLGPLとかMPLとか・・・・
660:デフォルトの名無しさん
09/12/15 00:00:39
スクリプト言語から離れるが、自作のファイルアーカイブクラスでメモリにスクリプトやコンパイル後のバイナリを読み込み、
そのメモリの内容をコンパイル、もしくはバイナリ読み込みするようにすればいいと思う。
661:デフォルトの名無しさん
09/12/15 00:34:42
>>659
CRIScriptとかはどうなんだ?
BSD風ライセンスらしいが
662:デフォルトの名無しさん
09/12/15 00:35:06
さげわすれた・・・・
663:デフォルトの名無しさん
09/12/15 02:36:52
CRIScriptね。
どうなんだろ、使用感を聞いたことがない。
あれ、主開発者がApple行っちゃったけど大丈夫かな、CRIなのにww
いや、すごく期待はしてるんだよ
664:デフォルトの名無しさん
09/12/15 03:14:13
SpiderMonkeyかな
665:デフォルトの名無しさん
09/12/15 05:28:35
>>652
はじめ言っていることが良くわからなかったんだけど、いまわかった。
URLリンク(www.lua.org)
When called with a file name, (略), and sets its handle as the default input file.
つまりいちど io.read でファイルを読み込むとデフォルト入力ファイルが変更されるので、
それ以降は io.read では同じファイルをさらに読み込もうとするみたい。
標準入力(キーボード)から読み込みたいときは、
io.stdin:read() を使えば良いんじゃないかな?
666:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/12/15 10:57:56
追記
Pawn ファイルで include <###> をしていない物は正常に実行出来た
668:デフォルトの名無しさん
09/12/15 12:14:25
ドキュメントが全てpdfだったり、インストールが実行形式だったり
変なところで敷居上げてる気はするな
敷居を下げる配慮をした結果なのだろうとは思うが
669:デフォルトの名無しさん
09/12/15 12:47:31
PawnはFloat使おうとして挫折した。なんで組み込み型じゃないんだよ。。。。
670:デフォルトの名無しさん
09/12/15 14:54:37
スレタイにある「Squirrel」の読みはアメリカ英語で「スクワール」で、
イギリス英語だと「スクウィール」のようです。
671:デフォルトの名無しさん
09/12/15 15:21:23
Luaのライブラリを最小限のサイズにしたいのだけど
削っても動作に影響ないファイルとかあります?
672:デフォルトの名無しさん
09/12/15 16:48:46
>>671
パーサー部分は削った?
参考→Lua書庫内etc/noparser.c
673:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/12/15 20:37:30
バインドの方法がおかしいんだろう。クラスインスタンスを返す場合は、その返したいクラスに対して sq_createinstance
して squirrel のインスタンスとしての構造を作ったものに sq_setinstanceup したものを返す必要があるんだがそうしてるかい?
675:デフォルトの名無しさん
09/12/15 21:07:46
>>674
してませんでした。> createinstance
使い方が分からん・・・
676:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/12/15 23:30:53
Cの組み込みでLuaって速度的にどれぐらい出る?
ゲーム作ってるんだけど、1fps≒16msの間にpcall呼びまくったりしても大丈夫かな。
ざっと3000回ぐらい。
678:デフォルトの名無しさん
09/12/15 23:43:58
ソース読んでたけど、よくわからん?
sq_getclassでクラスをスタックに
sq_createinstanceでそのクラスのインスタンスを作成し、スタックへ
sq_setinstanceupでユーザーポインタをインスタンスにセット
と思ったんだが、最初のsq_getclassでどうやれば返り値のクラスを取得できるんだ・・・
679:デフォルトの名無しさん
09/12/15 23:56:21
bzr
680:デフォルトの名無しさん
09/12/15 23:57:02
間違えたぜ
681:デフォルトの名無しさん
09/12/16 01:05:04
>>678
主要なバインダには該当コードあるんだからそれを探して読もうよ。
sq_getclass はインスタンスのクラスを取得するもの。sq_createinstance をする場合に
参照するクラスはあらかじめわかってるんだから、C側で参照を保持しておくか、
あるいは global から名前指定しで取り出して使う
682:デフォルトの名無しさん
09/12/16 10:10:40
>>672
それはどうやれば良いですか?
noparser.c でググったのだけど
ファイルサイズが削れるだけの説明ばかりで
683:デフォルトの名無しさん
09/12/16 14:42:20
>>670
PCのスペックも環境も書いてないのにそんな話しても無駄だが、
最近のPCで本当にただpcall呼ぶだけなら3000回くらい平気じゃないかね。
684:デフォルトの名無しさん
09/12/16 14:43:41
>>682
コンパイル済みのスクリプトしか読ませないの前提でパーサ削除しろって話じゃないかね。
685:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/12/16 17:10:52
意味無いことを
687:デフォルトの名無しさん
09/12/16 17:18:42
下手をすると、Cでは変数が後で利用されていないと、
最適化でごっそり無かったことにされるから気をつけろ。
688:デフォルトの名無しさん
09/12/16 17:33:31
コンパイル時に計算済ませていきなり即値代入して終了とかな。
689:デフォルトの名無しさん
09/12/16 17:44:46
>>687
あるあるww
最初測ったら0秒だったよ
今回はLuaの1/15くらいだからこんなもんでしょ
あと、rubyをコケにしてるような書き方になってしまった
あれは便利さ重視だからスピードは二の次
rubyユーザーごめん
引き合いに出したのは、自分がよく使ってて、一応組み込めるから。
690:デフォルトの名無しさん
09/12/16 17:48:38
オブジェクト生成するからな。
とにかく意味が無い例であるのはたしか。
691:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/12/16 20:57:00
>>691
作りにもよるけどたいていは sq_setreleasehok 処理も必要
693:デフォルトの名無しさん
09/12/16 21:08:29
>>692
ん?sq_setreleasehookってコンストラクタの中じゃないの?
694:デフォルトの名無しさん
09/12/16 21:46:22
>>693
sq_createinstance はまさに構築済みの C++オブジェクトをラップして返すために
あるもので、squirrel のコンストラクタをよばない。
普通のコンストラクタは中で C++のインスタンスを new してるから、
呼んでしまうと余分なC++インスタンスがつくられる上に、さらに
別のインスタンスを sq_setinstanceup した時点でリークしちゃうからね。
で、よばれないから、たいていコンストラクタでやってるはずの
sq_setreleasehook は別途必要になる
695:デフォルトの名無しさん
09/12/16 22:27:12
>>694
おおっ、なるほどな。
良く見たら自分のメモリ開放できてなかったわ^^;)
696:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/12/17 00:34:19
>>685-689
Rubyて感覚的には30分走らせる代わりに10分でコード書く。C言語は1時間でコードかくかわりに1分で走らせるとか、比喩があったなw
698:デフォルトの名無しさん
09/12/17 09:54:34
C言語と30年戦う代わりに1年で味方につけるべきだったな。
699:デフォルトの名無しさん
09/12/17 10:16:12
AngelScript|Д゚)ジー
700:デフォルトの名無しさん
09/12/17 11:05:57
>>696
記述自体はそれであってるけど、sq_setreleasehook するのは sq_setinstanceup が成功したのを確認した後でしょう。
終了時あぼんは、そりゃどっかプログラムが悪いんだろうとしか言えない。
その b->getGraphics() でとった Graphics が勝手に独自に解放されて大丈夫な構造で作られて
ないのなら setreleasehook してはダメ、って、&つけてるってことはメンバ変数か。それはダメかも
C++で管理を単純化するために、親が責任もって解放してるので、子オブジェクトは
ポインタ参照したあともそのまま放置したのでOK、という書き方は実際よくあって、
そういったものをsquirrel に移すときは、子オブジェクトにポインタ渡してオブジェクトとして
作るけど sq_setreleasehook はしないという書き方にする必要がもちろんある。
親が先に死んだ状態で子をさわるとポインタ腐ってるのでクラッシュするけど
それはそういうもの。squirrel は機構は提供してくれるけど、自動で判断してくれるわけでは
ないから、あくまで C++ 的に破綻しないように注意して書く必要がある。
そういうのいやならオブジェクトを全体的にリファレンスカウント
方式とかで管理するようにするしかない。
そして循環参照トラップにはまるw
701:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/12/17 14:23:49
>>700
あー、やっぱり、新しくインスタンス作ってるんじゃないんならsetreleasehookはいらないんですね。
なんか中で気持ち悪いことやっててGraphicsインスタンス作ったつもりはないのに解放関数与えないとダメなのかと思いました。
(ソース読んだ限りではそういう記述が無かったので、疑問には思ってましたが・・・)
あとは、終了時あぼんの原因を探れば動きそうです。ありがとうございました。
ていうかBCC5.5ってテンプレートが弱いからSqPlusとか使えないんですね・・・。メチ不便
703:デフォルトの名無しさん
09/12/18 15:54:55
xtalの新verが出てる。
デバッガー早くできるといいな。
704:デフォルトの名無しさん
09/12/18 16:06:30
Squirrelの演算子一覧に => ってあって
え!? と思ったら単なるtypoだった・・・
705:デフォルトの名無しさん
09/12/18 16:07:52
ぅあ
706:デフォルトの名無しさん
09/12/18 19:09:29
squirrelで
{};hoge
をコンパイラが受け付けないのには何か理由があるの?
疑似BNF見る限り許容されそうなものだけど
ワンライナーだとついテーブルコンストラクタに ; 付けてしまう
707:デフォルトの名無しさん
09/12/19 13:49:00
nscryptみたいな軽量な物で小数点も扱えるのあればなぁ
luaとかは無駄な部分が多すぎて
708:デフォルトの名無しさん
09/12/19 14:00:18
他の部分がNスクで十分なら、多分Nスク作者に要望を投げてみるのが、
その要望の解決にはいちばんいいと思う。
709:デフォルトの名無しさん
09/12/19 14:17:21
>>708
出来るならそうしたいけど
nScript作者はここ最近活動休止中みたいで
そのスクリプトも含め更新と言う物が一切されてないから期待出来ない
だから自分で実装しようとしてるけど
元々Cのみで書かれてないから移植作業がまず大変
710:デフォルトの名無しさん
09/12/19 14:40:00
はてな日記見てみたけど、なんか次世代エンジンに注力してるみたいね。
そのへん追いついてなかった。
711:デフォルトの名無しさん
09/12/19 14:46:52
あ、あと、どう使うつもりか知りませんがライセンス大丈夫ですよね?
Nスクのライセンスは全く見ずに言いますが。
712:デフォルトの名無しさん
09/12/19 14:47:50
>>711
個人利用のみだから問題ないはず、と思う
713:デフォルトの名無しさん
09/12/19 14:48:14
nScriptってWWWCの作者のだよな?
NScripterと話がごっちゃになってね?
714:デフォルトの名無しさん
09/12/19 14:51:05
突っ込もうと思ったら怒涛の勢いでレスが・・・
確かに混同してるな
715:デフォルトの名無しさん
09/12/19 14:53:30
>>713
このことです
URLリンク(www.nakka.com)
716:デフォルトの名無しさん
09/12/19 14:55:29
あれ、ソースみてるけどフルCでね?
windows.hに依存してるのはあるかもしれんが
717:デフォルトの名無しさん
09/12/19 15:02:33
パイソンとかルビーをゲームに使ってる人はいますか?
718:デフォルトの名無しさん
09/12/19 15:07:10
>>716
フルCに見えるけど一部Winの機能使ってて
手直し必須だと思う
719:デフォルトの名無しさん
09/12/19 15:37:08
スクリプト実行する根っこの部分でWinの機能つかってるから
一部と言うより根本的な修正が必要だなこれ
720:デフォルトの名無しさん
09/12/19 17:09:35
ところでお前ら、この手のスクリプトエンジンに手直し入れる場合、どのぐらいまで手を入れますか?
基本命令や文法とかまで変えたりする?
721:デフォルトの名無しさん
09/12/19 17:10:05
>>717
ノシ IronPython使用中。
1週間ほどあればスクリプト部分はcPythonにも移植出来るかな。
特に問題ないよ。
スクリプト内でマルチスレッド化が普通にできるのが強みだな。
722:デフォルトの名無しさん
09/12/19 17:58:46
>>720
本家バージョンアップの度にパッチ当てるの面倒だから基本的にそのまま
作業を楽にする目的で文法いじるとしたらプリプロセッサとかトランスレータを間にいれるかな
文法変えずに必要な機能が実現できないなら言語の選択に問題があるかと
ライブラリレベルならアーカイブが透過的に扱えるようIOを自作のに差し替えてる
723:デフォルトの名無しさん
09/12/20 02:05:39
誰か>>715のnScriptをCのみで動かせるように
手直ししてくれる人いません?
メモリ管理や足りない型の再定義とかはなんとかなるけど
マルチスレッド処理には詳しくないから
同期処理とある部分の代用関数が分からない
724:デフォルトの名無しさん
09/12/20 02:28:47
そもそもCにスレッドなんて無いような
725:デフォルトの名無しさん
09/12/20 04:55:19
TCP使えるネットワークライブラリでC汎用なのも無いきが
726:デフォルトの名無しさん
09/12/20 14:10:06
luaはどうも記述が冗長になる・・。
if ~ then ~ endとか。
「関数先頭でリソース割り当て。割り当て成功してたら
終わりで開放。」見たいなコード書くとフラグ使って
最後でif文みたいな感じになるけど、
C#のIDisposable見たいな機能があると便利かと。
割り当て・開放のコードが集約できるから見やすそう。
727:デフォルトの名無しさん
09/12/20 16:26:27
Cでそういうの書けばいいねん
728:デフォルトの名無しさん
09/12/20 17:54:01
・テーブルに関数をpushする
・テーブルが空になるまで関数をpopして呼び出す
の2つを簡単に出来るようなライブラリを作ればいいと思う
729:デフォルトの名無しさん
09/12/20 17:55:48
>>728
で、それが種々のbinderになるわけですが何か。
730:726
09/12/20 18:18:19
きっと欲しいのはこんな感じ
do
local resource=...
finaly
finnalize(resource)
end
:
:
end -- ここでfinalyの内容が自動で呼ばれる。
自動で呼ばれるとなると言語サポートは必須かと。
metaluaあたりで作れるかな?
731:デフォルトの名無しさん
09/12/20 18:25:56
何のためにGCがあると思ってるんだろうか
732:726
09/12/20 18:28:56
javaのGCじゃリソース管理できないから
C#はIDisposable入れたんじゃないの?
733:デフォルトの名無しさん
09/12/20 18:33:54
>>732
違うよ。
本来的にアンマネージドなリソースの管理はGCじゃなくてプログラマの責任だから、
プログラマが明示的にDispose()かける仕組みになってるんだよ。
734:726
09/12/20 18:44:32
え?
C#はかじった程度しかしらんのでうそ言ってるかもしれんが、
usingとIDisposabeなクラス組み合わせると
リソース開放漏れが(ファイルのクローズとか)が防げますよー
って使い方するんじゃないの?(C++のRAIIみたいな)
735:デフォルトの名無しさん
09/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
09/12/20 18:57:38
>>735
よく思いつきますな。理解するのに
上下のブロックを10回ぐらい往復しましたよ・・・。
ただ、複雑になったらそのコードを一年後理解しなす
自身がないかも。
ついでにmetaluaでよろしく ノシ (冗
737:デフォルトの名無しさん
09/12/20 19:04:56
>>734
IDisposableを継承したクラスはusing構文で使うことが推奨されているわけだが、
当然この構文が使えない使い方があるわけで。
(using構文を使うと実用上スタックに載せているのと同じなわけで、ヒープに置きたい場合だってあるだろう、という話)
で、ユーザーが手で作ってホールドしているIDisposableなインスタンスは当然自分で明示的に破棄しないといけない。
738:デフォルトの名無しさん
09/12/21 03:50:01
//
/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ AngelScript 2.18.0!!
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
739:デフォルトの名無しさん
09/12/21 15:13:06
AngelScriptが2.18.0になってるな
740:デフォルトの名無しさん
09/12/21 15:16:21
ASの本だれか書いてくれ
741:デフォルトの名無しさん
09/12/21 15:39:12
ActionScriptなら
742:デフォルトの名無しさん
09/12/21 16:54:21
仮想マシンをいくつもopenするのって良くないですか?
743:デフォルトの名無しさん
09/12/21 17:13:43
同時に動かす必要が無いなら良くないんじゃない
744:デフォルトの名無しさん
09/12/21 19:21:29
良くないですね
745:デフォルトの名無しさん
09/12/21 21:23:01
>>740
まずは2.18.0のShiftJIS対応版だ…
746:デフォルトの名無しさん
09/12/22 00:10:03
sjis対応なんて激変してない限りいつも同じ手順だろうに
747:デフォルトの名無しさん
09/12/22 00:38:06
AngelScriptはこまめに更新されるから、結構手間なのよ。
748:デフォルトの名無しさん
09/12/22 07:10:33
ShiftJIS<->UTF-8の変換を間に挟むだけなんだから、
一度書いたら別に毎度手間がかかる訳じゃないだろ。
749:デフォルトの名無しさん
09/12/22 07:53:25
//
/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ Lua!!
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
750:デフォルトの名無しさん
09/12/22 09:25:42
>>748
AS_DOUBLEBYTE_CHARSETで有効になる部分に、そのままだとビルドエラーになる部分があって、
そこを毎回毎回直さなきゃならないんだ。
公式に知らせたほうがいいとは思うが英語が苦手でね…
751:デフォルトの名無しさん
09/12/22 10:12:37
とりあえずdiff 取って投げれないの?
752:デフォルトの名無しさん
09/12/22 10:37:03
>>735
こういうの、JavaScriptとかRubyとかやってると思いつくよなw
753:デフォルトの名無しさん
09/12/22 10:38:18
毎回なおすってまさか手でなおしてるんじゃ・・・
バージョン管理してパッチ吐いたりして、どうしてもパッチあたらないときは手で直すとかしたらどうかと
754:デフォルトの名無しさん
09/12/22 11:34:26
>>751
自分がいじったファイルをリポジトリにコミットって事?
>>753
まさかの毎回手直し。
あと、
>バージョン管理してパッチ吐いたりして、どうしてもパッチあたらないときは手で直すとかしたらどうかと
ってのは、TortoiseSVNの「パッチを作成」「パッチを適用」を使えって事?
質問ばかりですまん。
755:デフォルトの名無しさん
09/12/22 12:01:22
>>754
公式は svn かな。それなら
1. 公式から任意のバージョンをエクスポートしてきて、それで自分の手元で自前の svnレポジトリを作る
2. 自分の更新はそこに任意にコミットする
3. 公式の svn から適当なタイミング(リリースがあった時とか)で更新を「マージ」する
これでおおむね安全に手元作業できるはず
svn は以前は外部レポジトリからのマージができなかったので、
手元のレポジトリに「ベンダーブランチ」として公式の内容をまるごとコピーして、さらにそこからマージする
必要があったんだけど、今のは普通に外のレポジトリからマージできるのでこの手の作業は楽になった
あるいは最先端技術でいくなら、bazaar のような、svn プロトコルに対応した分散構成管理ツールをつかうという手もある。
svn のマージはわりとややこしいし、ログの類もマージ作業に依存してしまうので、こっちのが構造的にははるかにスマート。
この場合、自分の変更分はローカルコミットとして維持する形になる
756:デフォルトの名無しさん
09/12/22 12:26:40
>>755
詳しい説明d。
ただ、AngelScriptはWIPのみsvnを公開してるみたいなので、
>手元のレポジトリに「ベンダーブランチ」として公式の内容をまるごとコピーして、さらにそこからマージする
というやり方になりそう。
ちょっと試してくる。
757:デフォルトの名無しさん
09/12/22 12:38:19
>>756
WIPってなにかと思ったら work in progress か。
まあ、そりゃ svn ってのはそういうものだから^^;
えーと、任意のリリースバージョンならタグうたれてるみたいだから
URLリンク(angelscript.svn.sourceforge.net)
からとれるかと。
バージョン間でのマージ処理したければ、ここのツリーの差分をひろってくればいい
758:デフォルトの名無しさん
09/12/22 16:40:58
そもそも
英語が苦手とか駄々こねてんじゃねえよクソが
死ねばいいのに
759:デフォルトの名無しさん
09/12/22 17:24:49
ごめん誤爆してた
760:デフォルトの名無しさん
09/12/22 17:30:59
>>759
ということにしたいんですね
761:デフォルトの名無しさん
09/12/22 17:34:46
メインラインにマージしてもらえば今後そのケースで悩む必要は無いというのに
英語が出来ないからというそれだけの理由で一生無駄な作業をしつづけるんだろうな
英語が出来ずともパッチ送るだけで十分なのに
762:デフォルトの名無しさん
09/12/22 17:39:17
そういうのはそう思う人がやればよろし。おしつけはおーぷんそーすの精神に反するのでいくない
763:762
09/12/22 17:39:53
ごめん誤爆した
764:762
09/12/22 19:33:50
>>763
人を騙るな。まじ気にしなくていいよ>パッチ送るとか
765:762
09/12/22 19:38:59
お前こそ誰だよ
766:762
09/12/22 20:51:42
何で俺こんなにいるん?
767:762
09/12/22 23:13:59
>>762の人気に嫉妬
768:デフォルトの名無しさん
09/12/22 23:16:08
4800円もするpython入門書が古い版でしかもC組み込みについて全然触れてなかったでござる
769:デフォルトの名無しさん
09/12/22 23:33:42
何も文章書かずにパッチだけいきなり送るとか、どんだけ失礼なんだよ。
770:デフォルトの名無しさん
09/12/23 02:41:15
お歳暮だって何も文章書かずにいきなり送りつけてくるだろ。
771:デフォルトの名無しさん
09/12/23 02:58:59
最近お歳暮という日本の習慣を覚えたばかりの外国人の方ですか?
772:デフォルトの名無しさん
09/12/23 07:42:11
つまりパッチにoseiboって書いて送れと
773:デフォルトの名無しさん
09/12/23 07:56:22
おう、てめーらサンタさんディスってんのか
774:デフォルトの名無しさん
09/12/23 13:52:13
サンタさんはいい子にしかこないけど、
いい子以外にもパッチを送りつけるような真似はいかがなものかと。
775:デフォルトの名無しさん
09/12/23 15:55:19
ASが悪い子だと
776:デフォルトの名無しさん
09/12/25 21:46:07
>>769
gitなんかdiff形式のメール生成して送る機能なかったけ?w
777:デフォルトの名無しさん
09/12/25 21:48:17
まーでも、こういうときってgithubとかbitbucketみたいなサービス使って欲しくはある。
forkして変更して、変更を相手に送る(pullリクエストする)というのがシステムに組み込まれているから、
パッチ送るのも気軽なんだよね。
778:デフォルトの名無しさん
10/01/04 14:49:54
コムラッドのタカネ終わってるな
スレリンク(venture板)l50
スレリンク(sm板)
スレリンク(sm板)
779:デフォルトの名無しさん
10/01/04 15:51:39
オイ俺のコピペ脳、まで読んだ。
780:デフォルトの名無しさん
10/01/06 09:15:42
Lua について相談なんですが、
メタテーブルの __newindex を使えば、
テーブルに新しい key を追加するときにフックをかけることができるけど、
同じような感じで、テーブルの既存の key の値を変更するときに、
フックをかけることってできないかな?
781:デフォルトの名無しさん
10/01/06 10:36:17
メタテーブルの__indexは調べた?
782:デフォルトの名無しさん
10/01/06 11:26:52
__index は調べたんですが、
キーがすでにテーブルにある場合は __index はなにもしないですよね。
Metatable の index の擬似コードから抜粋:
local v = rawget(table, key)
if v ~= nil then return v end ← キーが存在するならその値を返す。
URLリンク(www.lua.org)
783:デフォルトの名無しさん
10/01/06 11:52:07
単純に、テーブル本体は何も仕事をしないでメタテーブルにすべて丸投げしたい
と考えれば簡単なことなんだけどな。
空のテーブルにメタテーブルを持たせて key が何も無い状態を維持すれば良い。
いったんメタテーブルに丸投げするが、データを保持する仕事はテーブル本体でやる
と考えるとややこしくなるよな。
784:デフォルトの名無しさん
10/01/06 12:20:51
確かに! 間に空テーブルをかませばいいんですよね。
ありがとうございました。
785:デフォルトの名無しさん
10/01/11 00:41:10
Lua 5.2.0 work1 出てるね
ファイナルもうすぐかも
786:デフォルトの名無しさん
10/01/11 18:50:02
> ファイナルもうすぐかも
それはない
787:デフォルトの名無しさん
10/01/12 01:12:00
環境周りが結構変わったのかな?
- lexical environmentsの導入(in EXP do BLOCK end)
- setfenv/getfenvがなくなった(debugのはある?)
- 全thread(コルーチン)で環境はひとつのみ?
自作ライブラリは結構見直さないとなー
788:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/01/12 10:13:28
lexical environment は、ECMAScript (JavaScript) の with みたいなもんかな。
set/getfenv は関数に対して破壊的な操作をしてしまうので、新しいやり方のほうがきれいに書けるかも。
790:デフォルトの名無しさん
10/01/12 11:19:29
空テーブルをsetfenvするモジュールシステムに慣れてる人なら、
もともと空っぽの環境を破壊されてもほとんど困らないけどね
791:デフォルトの名無しさん
10/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
10/01/13 00:53:12
ごめん激しくうそ言った。
791の例でprintはglobal_fが作られた時点で固定化されているので
一番最後の方法では挿げ替えはできないね(orz
793:デフォルトの名無しさん
10/01/13 01:02:20
Tropico3という箱庭(miniスケープの方の)ゲームでlua使われてた。
なんかzlib圧縮(?)されてるから.luaファイルみてもわからんけど
794:デフォルトの名無しさん
10/01/13 09:45:12
>>792
それであってるんじゃないかな?
print が global_f の外側で local で宣言されていれば global_f が作られた時点で固定化される(レキシカル変数として)けど、
そうでなければグローバル変数として参照されるので、
環境を変えればその影響を受ける。
795:791
10/01/13 19:13:03
実際にビルドして試したので「間違い」で正しいかと。
本質的にはスレッドに対するsetfenvと同じで
>94の勘違いと同質な問題。
子供の関数の呼び出しまで影響を受けるとなると
危険極まりないのも事実だし。(トレードオフではあるが)
それよりもpcalやCスタック先からyield可能になったのは大きい。
796:デフォルトの名無しさん
10/01/14 07:28:39
あ、ごめんなさい。勘違いしてた。
関数が定義された場所の環境をそのまま引き継ぐってことですよね。
だから、スクリプトファイルを読み込むとき(dofile とかで)に in ... do を使うと、
以後、そのファイル内で定義された関数はサンドボックス環境で実行されるわけか。
797:デフォルトの名無しさん
10/01/14 18:43:54
Luaって
table =
{
element1 = 3
element3 = "str"
func element2() ...... end
}
みたいなことできませんか?
798:デフォルトの名無しさん
10/01/14 18:52:44
事故解決しました。。。。ごめんなさい
799:デフォルトの名無しさん
10/01/15 06:58:28
Lua 5.2 work2キタ━
ファイナルもうすぐかも
800:デフォルトの名無しさん
10/01/15 08:28:47
URLください
801:デフォルトの名無しさん
10/01/24 11:27:15
lua5.1.dllがノートンでウィルス扱いされるな
802:デフォルトの名無しさん
10/01/24 11:46:33
なにそれこわい
803:デフォルトの名無しさん
10/01/24 18:24:53
そういやShiftJIS対応Lua5.1.3もノートンでウィルスありと判定されてたな。
誤検出なのかな?
804:デフォルトの名無しさん
10/02/03 00:46:56
皆luaスクリプトの暗号化はどうやってるん?
リファレンスマニュアル探したけど、それらしい物が無かったんだが…
805:デフォルトの名無しさん
10/02/03 00:53:24
Luaってシリアライズできなかったっけ
806:デフォルトの名無しさん
10/02/03 01:12:18
lua_load/lua_dumpで自前で暗号化するくらしかできんよね
807:デフォルトの名無しさん
10/02/03 08:55:04
暗号化したファイルを読み込んで復元し、文字列にする>luaL_loadbufferやluaL_loadstringにその文字列を渡してコンパイル
って手順ではダメ?
808:デフォルトの名無しさん
10/02/03 10:27:02
Python人気ねーな。luaより断然コード書きやすいのに。遅いけど
809:デフォルトの名無しさん
10/02/03 12:43:27
>>808
>>4
810:デフォルトの名無しさん
10/02/03 12:46:04
Luaがもうちょっとキモくない文法ならいいんだけどなぁ
811:デフォルトの名無しさん
10/02/03 12:49:10
文法だけ変換するプリプロセッサかトランスレータのようなものを作ればいいんじゃないだろうか
812:デフォルトの名無しさん
10/02/03 13:02:55
たった数十kbくらいのサイズで
Cライクな文法が使える超軽量な組み込みないかな
LuaとかPawnも、小さい部類だろうけど不要な物が多すぎる
813:デフォルトの名無しさん
10/02/03 18:35:51
asじゃあかんの
814:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/03 21:57:11
整数も浮動小数点で計算するからだそうだ‥‥
64bit integerに対して64bit doubleじゃ精度足りないっての
パッチがあったからつっこんでみるが、ちゃんと動くか心配だ
816:804
10/02/03 21:57:40
>>805->>807
アドバイスありがとう。
luaL_loadbufferやluaL_loadstringを使うという発想は思いつきませんでした。
817:デフォルトの名無しさん
10/02/04 15:53:15
>>811
Euphoria, t3x, moto, JavaなどCトランスレータを実装している言語は探すと色々あるものの、
トランスレート後に吐いたCソースとハンドコードしたCソースとのリンク方法が
文章化されてなかったりするするんだよな。
>>812
小さくはないが...elastiCは?
URLリンク(www.elasticworld.org)
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4274日前に更新/247 KB
担当:undef