【Lua】組み込み系言語総合 その2【Squirrel】 at TECH
[2ch|▼Menu]
[前50を表示]
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)

818:デフォルトの名無しさん
10/02/04 19:12:28
Luaスクリプトってバインダなしで使い物になるレベル?

819:デフォルトの名無しさん
10/02/04 19:41:20
何らかのバインダ及びグルーが無いと、スクリプトの意味が無い気が。

820:デフォルトの名無しさん
10/02/04 21:35:40
mingw ,gcc を前提としてるバインダが多い様な気がして
lua手を出しにくいのです。。。

821:デフォルトの名無しさん
10/02/04 21:52:42
lua51.libとlua5.1.libって何が違うんだろう

822:デフォルトの名無しさん
10/02/04 21:53:06
それは気のせいないし思い込みでは……

823:デフォルトの名無しさん
10/02/04 21:57:42
.so を makefile でつくる、という事例にちょくちょく
遭遇しまうまう・・・orz

824:デフォルトの名無しさん
10/02/04 22:02:22
バインダはLuaではなくバインダという言語である!!


825:デフォルトの名無しさん
10/02/04 22:04:46
$(CC) を $(CL) とか代えて、pkg-config はそのままでも
nmake -f makefile でビルドできるもんなんだろうか・・・

826:デフォルトの名無しさん
10/02/05 00:11:51
pkg-configはシェルスクリプトだからmsysなりcygwinなり要るだろ

827:デフォルトの名無しさん
10/02/05 00:39:23
nmakeには、一から書き直して食わしてる
必要なobjぐらいなら写せるだろ

828:デフォルトの名無しさん
10/02/05 00:52:13
それ全然lua関係ないじゃん

必要なc/cppファイルひろって Makefile 書き直すなり
Visual Studio でプロジェクトファイルつくるなりぐらいやりなされ。
そんな難しいもんじゃない。

829:デフォルトの名無しさん
10/02/05 11:59:44
>>828
こういう問題を回避するためにSquirrelのソースパッケージをCMake対応にして
フォーラムに投げてみたら、いらないって言われた……。

830:デフォルトの名無しさん
10/02/05 18:05:55
オレはCMakeで固まろうとした

831:デフォルトの名無しさん
10/02/06 12:14:44
luaのuserdataとlightuserdataの違いって

userdata
・lua側でアロケート
・lua側でデアロケート(GC)
・Cには参照のみが渡される
・Cからは寿命が分からない

lightuaserdata
・C側でアロケート
・C側でデアロケート
・luaには参照のみが渡される
・luaからは寿命が分からない

これ以外になんか有りますか?
それとluaとCでuserdata、lightuserdataの寿命を同期させる方法は有りますか?

832:デフォルトの名無しさん
10/02/06 12:41:41
meta tableの有無も違ってたかも

833:デフォルトの名無しさん
10/02/06 14:15:34
>>831
これは心の贅肉をそのまま箇条書きにしたみたいで面白いな

考え方としてはとりあえず
lightuserdataは無くても整数値で代用できる、と割り切ってしまうほうが簡単
そうすると、整数とuserdataを比較するのは無意味だとわかる

834:デフォルトの名無しさん
10/02/06 21:32:49
|Д゚)<バインダが面倒な人向けにいいもの置いておきますね
|Д゚)つ[AngelScript]
|ミ サッ  [AngelScript]

835:デフォルトの名無しさん
10/02/06 21:47:45
//
/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ AngelScript!!
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ

836:デフォルトの名無しさん
10/02/06 23:25:21
>>832,833
レスどうもです
メタテーブルの有無は重要ですね
いろいろいじってようやくユーザークラスをLuaに公開できるところまでこぎつけました
しかしlightuserdataは使い道がわからず・・・

837:デフォルトの名無しさん
10/02/07 10:50:27
lightuserdataはCからのポインタの入れ物として使うのが想定されているらしい。

838:デフォルトの名無しさん
10/02/07 14:36:10
lightuserdataは、スクリプトで操作したいクラスのインスタンスとか放り込むんじゃないの?
ゲームとかだとひとつのスクリプトで複数のオブジェクトを制御する必要があるし。

839:デフォルトの名無しさん
10/02/07 15:41:29
C++のオブジェクトとLuaのオブジェクトが混在するのか・・・
C++/CLIならもっとすごいことになるな

840:デフォルトの名無しさん
10/02/07 17:14:33
C++のオブジェクトをスクリプトで操作する感じかな。
例えばスクリプトで

SetSpeed(1,20)

とかいうような関数があった場合、C++側でlightuserdataを取り出し、

//lightuserdataからObjectのポインタを取り出す
Object *lpObject=(Object*)GetLightUserData(L);

//Objectを操作する
lpObject->SetSpeed(x,y);

って感じの処理をするグルー関数を用意する。

841:デフォルトの名無しさん
10/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
URLリンク(codepad.org)

こっちがLua
URLリンク(codepad.org)

842:デフォルトの名無しさん
10/02/07 18:44:41
userdataとlightuserdataは全く別物。用途が違う。
パソコンでできることがケータイではできないと嘆いているようなもんだぞ?

843:デフォルトの名無しさん
10/02/07 19:23:56
>>841
そういうことができなくなってる分軽いわけなんだが……



844:デフォルトの名無しさん
10/02/07 19:31:07
じゃあlightuserdataは何に使うんだろう
コールバック的な使い方でしょうか

845:デフォルトの名無しさん
10/02/07 19:44:12
だから主にC側で作ったインスタンス(のポインタ)の受け皿だって

846:デフォルトの名無しさん
10/02/07 19:51:50
>>844
てか、マニュアルにもCのポインタそのものだって書いてあるだろう。
Cでよくあるハンドルスタイルやコールバックスタイルの構造を直接扱うためにある。
例えば fopenの帰り値の FILE* を void* にキャストして lightuserdata として持ってそのまま使う。

処理する時には、必ずCの関数をいちいち呼び出すのを前提として、
「LUA側は持ってるだけで何もさわらないデータ構造」として準備されてる。

これの使い方が直感的にわからない人がいるってのが驚きだった^^;

847:デフォルトの名無しさん
10/02/07 20:54:46
わからない人というか、深読みする人もたまにいるな。
ひどくなると「それはただの××だよ」と言われると反論してくる。
「お前はそうやって分かったつもりになってるだけだ」とか。

848:デフォルトの名無しさん
10/02/07 21:05:07
lightuserdataはテーブルのキーとして使う。
自前のオブジェクトのアドレスや、OSから渡されるハンドルをキーにしてテーブルを参照すれば、同じアドレスやハンドルに同じuserdataを対応させることができる。
ちなみに、この時のテーブルはweak tableにしておくといい。

ということを初めて知った時は目から鱗だった。

849:デフォルトの名無しさん
10/02/07 22:40:47
何かLuaって面倒くさいな(´ω`)

850:デフォルトの名無しさん
10/02/07 23:14:16
ひたすら軽量さが売りの言語って感じだなあ。

851:デフォルトの名無しさん
10/02/07 23:22:51
ところで848のテクニック?のサンプルソースとかどっかでダウンロードできないかな?

852:デフォルトの名無しさん
10/02/07 23:50:34
>>841みたいにuserdataの方にクラスのインスタンスのポインタを格納して
Luaから呼ばれるC++側の関数で取り出して使ってるんだけど、>>831
みるとuserdataはLua側でGCかかるの?

853:デフォルトの名無しさん
10/02/08 00:40:38
URLリンク(codepad.org)

うーんこんな感じですかね?
ポインタをキーにという発想はすごい便利そうな予感がしますね
しかしグルーコード内のエラー処理とかってどうすればいいんだろう
C++例外を投げるべきなのか、関数内でもみ消してlua_errorするべきなのか

854:デフォルトの名無しさん
10/02/08 07:40:28
>>852
「C++側」と「Lua側」をきっちりと分離したいんだな。
組み込み言語は、そういう幻想にうんざりしてる人のためにあるんだと思うけどな。

855:デフォルトの名無しさん
10/02/08 10:48:05
Luaって速度が同じぐらいで、文法が素直な組み込みスクリプトが作られたらあっという間に駆逐されそう

856:デフォルトの名無しさん
10/02/08 11:02:47
>>855
作られてないから駆逐されてない訳で

857:デフォルトの名無しさん
10/02/08 11:04:23
もともとマイナーな分野なのに亜流が既にいくつも出ていてそれができないってことは
実際のところLuaのバランスが優れているってことでしょ

858:デフォルトの名無しさん
10/02/08 12:13:32
罠を避けるのが上手い。
静的型 クラス メタプログラミング 並列処理 遅延評価 参照透明性 ・・・

859:デフォルトの名無しさん
10/02/08 12:58:59
文法重視で速度気にしてない人は squirrel 使ってるし普通に棲み分けになってんじゃね?


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4275日前に更新/247 KB
担当:undef