- 1 名前:デフォルトの名無しさん mailto:sage [2009/05/25(月) 09:11:41 ]
- LuaやSquirrelなどアプリケーションへの組み込み用途で
使われるプログラミング言語についてのスレッドです まとめwiki(なにか質問する前に必ずみること!) wikiwiki.jp/lua/ その他の参考URLは>2から ■前スレ 【Lua】組み込み系言語総合【Squirrel】 pc12.2ch.net/test/read.cgi/tech/1205208141/ ■過去スレ その3 pc11.2ch.net/test/read.cgi/tech/1160799232/ その2 pc8.2ch.net/test/read.cgi/tech/1063711237/ その1 pc5.2ch.net/tech/kako/1034/10341/1034182349.html
- 829 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 11:59:44 ]
- >>828
こういう問題を回避するためにSquirrelのソースパッケージをCMake対応にして フォーラムに投げてみたら、いらないって言われた……。
- 830 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 18:05:55 ]
- オレはCMakeで固まろうとした
- 831 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 12:41:41 ]
- meta tableの有無も違ってたかも
- 833 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 14:15:34 ]
- >>831
これは心の贅肉をそのまま箇条書きにしたみたいで面白いな 考え方としてはとりあえず lightuserdataは無くても整数値で代用できる、と割り切ってしまうほうが簡単 そうすると、整数とuserdataを比較するのは無意味だとわかる
- 834 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 21:32:49 ]
- |Д゚)<バインダが面倒な人向けにいいもの置いておきますね
|Д゚)つ[AngelScript] |ミ サッ [AngelScript]
- 835 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 21:47:45 ]
- //
/ / パカッ //⌒)∩__∩ /.| .| ノ ヽ / | | ● ● | / | 彡 ( _●_) ミ AngelScript!! / | ヽ |∪| /_ // │ ヽノ \/ " ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
- 836 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 23:25:21 ]
- >>832,833
レスどうもです メタテーブルの有無は重要ですね いろいろいじってようやくユーザークラスをLuaに公開できるところまでこぎつけました しかしlightuserdataは使い道がわからず・・・
- 837 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 10:50:27 ]
- lightuserdataはCからのポインタの入れ物として使うのが想定されているらしい。
- 838 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 14:36:10 ]
- lightuserdataは、スクリプトで操作したいクラスのインスタンスとか放り込むんじゃないの?
ゲームとかだとひとつのスクリプトで複数のオブジェクトを制御する必要があるし。
- 839 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 15:41:29 ]
- C++のオブジェクトとLuaのオブジェクトが混在するのか・・・
C++/CLIならもっとすごいことになるな
- 840 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 codepad.org/5CuryxGE こっちがLua codepad.org/BON62sBh
- 842 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 18:44:41 ]
- userdataとlightuserdataは全く別物。用途が違う。
パソコンでできることがケータイではできないと嘆いているようなもんだぞ?
- 843 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 19:23:56 ]
- >>841
そういうことができなくなってる分軽いわけなんだが……
- 844 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 19:31:07 ]
- じゃあlightuserdataは何に使うんだろう
コールバック的な使い方でしょうか
- 845 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 19:44:12 ]
- だから主にC側で作ったインスタンス(のポインタ)の受け皿だって
- 846 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 19:51:50 ]
- >>844
てか、マニュアルにもCのポインタそのものだって書いてあるだろう。 Cでよくあるハンドルスタイルやコールバックスタイルの構造を直接扱うためにある。 例えば fopenの帰り値の FILE* を void* にキャストして lightuserdata として持ってそのまま使う。 処理する時には、必ずCの関数をいちいち呼び出すのを前提として、 「LUA側は持ってるだけで何もさわらないデータ構造」として準備されてる。 これの使い方が直感的にわからない人がいるってのが驚きだった^^;
- 847 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 20:54:46 ]
- わからない人というか、深読みする人もたまにいるな。
ひどくなると「それはただの××だよ」と言われると反論してくる。 「お前はそうやって分かったつもりになってるだけだ」とか。
- 848 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 21:05:07 ]
- lightuserdataはテーブルのキーとして使う。
自前のオブジェクトのアドレスや、OSから渡されるハンドルをキーにしてテーブルを参照すれば、同じアドレスやハンドルに同じuserdataを対応させることができる。 ちなみに、この時のテーブルはweak tableにしておくといい。 ということを初めて知った時は目から鱗だった。
- 849 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 22:40:47 ]
- 何かLuaって面倒くさいな(´ω`)
- 850 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 23:14:16 ]
- ひたすら軽量さが売りの言語って感じだなあ。
- 851 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 23:22:51 ]
- ところで848のテクニック?のサンプルソースとかどっかでダウンロードできないかな?
- 852 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 23:50:34 ]
- >>841みたいにuserdataの方にクラスのインスタンスのポインタを格納して
Luaから呼ばれるC++側の関数で取り出して使ってるんだけど、>>831 みるとuserdataはLua側でGCかかるの?
- 853 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 00:40:38 ]
- codepad.org/8Z7d8J62
うーんこんな感じですかね? ポインタをキーにという発想はすごい便利そうな予感がしますね しかしグルーコード内のエラー処理とかってどうすればいいんだろう C++例外を投げるべきなのか、関数内でもみ消してlua_errorするべきなのか
- 854 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 07:40:28 ]
- >>852
「C++側」と「Lua側」をきっちりと分離したいんだな。 組み込み言語は、そういう幻想にうんざりしてる人のためにあるんだと思うけどな。
- 855 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 10:48:05 ]
- Luaって速度が同じぐらいで、文法が素直な組み込みスクリプトが作られたらあっという間に駆逐されそう
- 856 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 11:02:47 ]
- >>855
作られてないから駆逐されてない訳で
- 857 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 11:04:23 ]
- もともとマイナーな分野なのに亜流が既にいくつも出ていてそれができないってことは
実際のところLuaのバランスが優れているってことでしょ
- 858 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 12:13:32 ]
- 罠を避けるのが上手い。
静的型 クラス メタプログラミング 並列処理 遅延評価 参照透明性 ・・・
- 859 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 12:58:59 ]
- 文法重視で速度気にしてない人は squirrel 使ってるし普通に棲み分けになってんじゃね?
- 860 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 13:04:33 ]
- 自分がLua選んだ理由は日本語の資料が一番多かったからだな。
次点の理由はスタティックリンクできたから。
- 861 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 19:55:29 ]
- 文法が嫌いとかいうやつって、
自分の英語ができないのは分法を教えるからって口だろ
- 862 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 20:54:28 ]
- まぁ855の言うことが真ならSquirrelによってあっという間に駆逐されてるはずだな。
- 863 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 20:56:42 ]
- >>861
逆だよ。 文法ができないから英語できないんだよ。
- 864 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 21:00:44 ]
- >>863
>861が何を言ってるのか分かってるの?w
- 865 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 21:12:14 ]
- 俺スクリプトをLuaのVM用のバイトコードにコンパイルすればいいじゃん
- 866 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 21:19:01 ]
- yieldをライブラリとして提供するのは実装の幅を狭めてると思う
- 867 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:28:24 ]
- >>862
>>347みる限り速度はでLua>>>>Sq
- 868 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:34:53 ]
- はじめて日が浅いけど L とか -1 が乱舞する
C拡張に馴染む日はくるんだろうか俺・・・
- 869 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:37:30 ]
- >>868
俺は2日で拡張できるようになったぞ
- 870 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 09:34:09 ]
- >>347では速度がLuaより早いにも関わらず日本ではあまり使われていないGameMonkey。
ざっと見た感じは文法も特に変な感じじゃないから、使いやすそうな感じはするんだけどね。 日 本 語 資 料 皆 無 だ け ど な
- 871 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 11:26:11 ]
- >日本語資料
月並みなことを言うと 因果関係ではなく相関関係ならあるかもしれない
- 872 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 11:32:07 ]
- Pawnも文法はシンプルに見えるが流行らないのはやっぱり何かが足りないんだろうな
- 873 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 14:25:57 ]
- 足りないというよりはLuaの情報量や実績やユーザ数を
代えられるほどのものではないということだろう
- 874 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 16:13:12 ]
- Luaってゲーム以外で使われてますか?
- 875 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 16:40:55 ]
- >>874
SciTEとか
- 876 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 17:04:31 ]
- apacheとかwiresharkの拡張に地味に使われてたりする
もともとゲーム向けってわけじゃないしね
- 877 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 17:50:35 ]
- Schemeが以外と流行らなかったな
- 878 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 17:56:04 ]
- >>874
TextAdept caladbolg.net/luadoc/textadept2/manual/1_Introduction.html 半分以上 Lua で記述され、また Lua で拡張可能なテキストエディタ iconv で読み書きし内部は UTF-8 なので、日本語も使用可
- 879 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 21:54:30 ]
- >>874
tokyotyrantでLua知ったよ
- 880 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 14:33:21 ]
- dev.pocoo.org/projects/pygments/browser/pygments/lexer.py
www.frykholm.se/files/markdown.lua coderay.rubychan.de/ プロジェクト管理ツール を作ろう Redmin, Retrospectiva, Trac 基本組み込み用途だよね、とツールを作る用途で 移行する気が起きない理由はこの辺にありそうだとさっき気がつきました・・・
- 881 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 17:47:01 ]
- lua5.1のDLL版を使ってるんですが、グルーコードの呼び出し規約は__cdeclでいいんでしょうか?
それとも__stdcallにしたほうがいいですか?
- 882 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 20:55:07 ]
- >>881
たぶん__cdeclだけど仮に間違っていたとしても name manglingの違いで簡単に見分けられるような気がする
- 883 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 20:57:16 ]
- DLLを使う側の言語の規約に合わせるんだ
Cでしか使わないのなら目的にもよるがどっちでもいいと思うがな
- 884 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 22:45:42 ]
- >>882
>>883 thxです さっきluaのヘッダ見たところ呼び出し規約は書いてなかったので多分C言語デフォルトのcdeclでよさそうですね
- 885 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 14:50:36 ]
- Programming in Lua携帯するにはしんどいな
PDFで売ってくれりゃいいのに
- 886 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 15:59:41 ]
- ばらして持ち歩けよ
- 887 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 16:49:25 ]
- 組み込んで歩けよ
- 888 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 18:52:41 ]
- lua で連想配列形式のテーブルの要素数を調べる方法ある?
配列形式だったら #tbl で、出来るみたいだけど・・・。
- 889 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 20:14:39 ]
- userdata型に型情報を与えて
BOOL isHoge(lua_State *, index); の形で使いたいんですが luaのほうで予め提供されてる方法はありますか? それとも、自分で独自にマップするものなんでしょうか?
- 890 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 20:46:48 ]
- >>888
pairsやnextかな
- 891 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 21:04:58 ]
- nextだとnilが設定されたフィールドでハマるので
pairsを使った方がいいんじゃまいか
- 892 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 23:23:44 ]
- luabashがすばらしすぎる。
bashにluaインタプリタ機能追加してbashの拡張ができる& bashが生きている間luaインタプリタも生きているのでlua変数を 保持し続ける。これ重要。 ファイル操作が多いとやっぱりシェルスクリプトが楽だけど コマンド間の結果の連携を環境変数orファイル書き出しで 実装するのはかったるい時に大活躍な予感。
- 893 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 01:40:15 ]
- 組み込み用途以外でLua使おうなんて思わんな
汎用的に使うには標準ライブラリ貧弱だし thenとかdoとか書くの面倒だし
- 894 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 03:09:57 ]
- 誤爆ってる、失礼しました
- 896 名前:デフォルトの名無しさん [2010/02/14(日) 11:30:21 ]
- /ヽ /ヽ
':' ゙''" `':, ミ ・ω・ ;, :; . っ ,つ Lua! `:; ,;' `( /'"`∪
- 897 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 16:13:25 ]
- 自作型で__gcでC側のリソースを開放してるんだが
__gcをうっかり書き換えてしまわないように メタテーブルを隠蔽あるいは変更不可にすることはできるだろうか?
- 898 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 19:19:53 ]
- __gcということはユーザーデータか。ならばスクリプト側からはメタテーブル自体の変更はできない。
さらにメタテーブルに__metatableを追加しておけば隠蔽も可能になり、メタメソッドの変更、追加を防止できる。 ただしこれらはC側やdebugライブラリには効果がないし、制限する手段も(多分)無い。
- 899 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 21:52:18 ]
- C++でRAIIをうっかり忘れてしまうレベルだ
初期化以外でsetmetatable()を使うのか?
- 900 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 22:33:58 ]
- >>898
__metatableというのがあったのか というかユーザデータはもともと変えられないって知らなかったorz レスthxでした >>899 metatableをうっかり書き換えるのはクライアントで、クラスじゃない RAIIをうっかり忘れるのとmetatableをうっかり書き換えるのは別次元の問題 そのクライアントのついうっかりを封印して出来なくしてしまえれば安心して寝れる
- 901 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 16:32:07 ]
- LuaInterface 使ってる?
- 906 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 16:55:48 ]
- (`・ω・´)
- 907 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 17:51:50 ]
- ルアのmodule(name)のnameが被ったらどうなるの?
- 908 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 20:06:58 ]
- name ru houkei
- 909 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 08:44:16 ]
- クロージャとしては別々だけどコードはもちろん共有
- 911 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 08:54:10 ]
- UpValとProtoの参照
それとenvの参照
- 912 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 02:47:27 ]
- なんかロベルトさんがLua5.2のグローバルとか環境まわりの仕様変え始めたような。lua-l参照。
- 913 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 14:12:12 ]
- バージョンアップは無能レベルに到達するまで止まらない
でも5.2はまだリリースされてないから止めようと思えば止められるけど
- 914 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 04:05:04 ]
- イエルサリムスキー教授の翻訳本にuserdataのメタテーブルはLuaからCを出しぬいて手出しすることはできないから安全、みたいなことが書いてあるんだけど
ud = create_ud() getmetatable(ud).__gc = nil のようにごくごく普通にアクセスできるように思えるんですが・・・これは本の間違いじゃないですかね?
- 915 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 08:33:03 ]
- >>914
保守的GCって知ってるか 解放すべきかどうか疑わしいときは、解放しないほうが安全
- 916 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 11:12:19 ]
- >>915
今ググって知りました しかし、保守的GCの話は>>914の話とは関係ないように思えるのですが、実は何か関係があるんでしょうか?
- 917 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 11:20:30 ]
- Squirrelに興味があるやつは見ておけ。
よく考えられてるサンプルだと思う。 ruriko.denpa.org/201002c.html#23
- 918 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 18:44:23 ]
- >>914
userdataはsetmetatableはできないがgetmetatableはできる。 よってその例のようなアクセスはできる。 禁止したいなら__metatableを適切な値に設定するといい。
- 919 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 19:47:36 ]
- 安全とは禁止することと見つけたり・・・
- 920 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 11:27:59 ]
- coroutineの利点がいまいちわかんね
state:update()の戦略の方がコスト低いしわかりやすいと思うんだが
- 921 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 12:48:09 ]
- 利点がわかんないなら
君には不要って事なんだよ 無理して使う必要ない
- 922 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 15:01:14 ]
- 自分の理解している範囲の外に利点があることだって普通にあると思うけど。
- 923 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 15:08:48 ]
- 複数回に分けて動かさないといけない処理を継続的な処理として実装可能になる。
結果として同期処理の不要な軽量スレッド的な実装ができるようになる。
- 924 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 15:46:16 ]
- コルーチンは、ゲームで「アイテムを取った直後に一定時間白くなる」という処理を書くときとか便利だな。
- 925 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 16:04:54 ]
- >>921
むちゃくちゃな論理展開わろた^^ >>922 ですよね >>923 複数回に渡って処理を分割するのってstateパターンでも普通にできることだと思う コルーチンじゃないとどうしてもできない、あるいは明らかに優れてるっていう要素が自分には見えないんすよね
- 926 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 16:07:46 ]
- Stateパターンが「普通」?
Stateパターンのような回りくどいことをしないといけないのがおかしいとは思わない?
- 927 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 16:23:51 ]
- >>925
どうしてもできないから、で使ってる人はいないよ。 機能的にすぐれてる部分は全く無い。ぶっちゃけコルーチンも、 全状態保持を言語側が担ってくれてるだけのおおがかりな state だから。 State パターンで何個もあったり、さらには個数が変動したりするオブジェクトの複雑な 挙動のからみあいとか、考えたくもないけど、コルーチンだとわりとすっきり書ける。 最初に仕様にあわせて組んでいくだけなら State でもいいんだけど、 後から見直す時とか、細かい修正に対応する時とか、コルーチンのが圧倒的に読みやすいし記述も楽。 遷移図をそのまま if や while やら使って書き起こすだけだけになるからね コルーチン切り替えのコストは、固定で組まれた State 切り替えよりかなり大きくなってしまうけど、 表記の楽さがそれを上回る、と判断した人が使うもの。あらゆる状態遷移を頭の中だけでさくさくくめてしまえるので、 State のが簡単だよって言う人は知り合いにもいるけど、それ、凡人には無理ですからー
- 928 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 16:36:19 ]
- そもそもオブジェクト指向におけるデザインパターンというのは、
言語側でサポートしきれていないニーズを無理やり克服するためのバッドノウハウのようなものだ。
- 929 名前:デフォルトの名無しさん mailto:sage [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)
|

|