【Lua】組み込み系言語総合【Squirrel】
- 1 :デフォルトの名無しさん:2008/03/11(火) 13:02:21
- LuaやSquirrelなどアプリケーションへの組み込み用途で
使われるプログラミング言語についてのスレッドです
まとめwiki(なにか質問する前に必ずみること!)
http://wikiwiki.jp/lua/
その他の参考URLは>2から
■過去スレ
その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
- 210 :デフォルトの名無しさん:2008/07/20(日) 16:41:45
- わらかすなwwwwww
- 211 :デフォルトの名無しさん:2008/07/20(日) 19:15:16
- Lispでいいじゃん
- 212 :デフォルトの名無しさん:2008/07/20(日) 19:41:13
- そういや、Ruby の Matz もOOPのスクリプト作るのにOOPはむりぽ
みたいなこと言ってたな
- 213 :デフォルトの名無しさん:2008/07/20(日) 23:37:57
- >>212
なんで?やっぱり速度?
- 214 :デフォルトの名無しさん:2008/07/21(月) 01:53:26
- 今時、さすがに速度じゃないと思うがw(開発速度?w)
Matz日記の過去ログにあったかもしれん。ちょっと行ってくる
- 215 :デフォルトの名無しさん:2008/07/21(月) 02:06:29
- 確か、まつもと氏が混乱するとかいう理由だったような・・・・と思ったら
オブジェクト指向言語でオブジェクト指向言語を実装するというのに、脳がついていけないんだけど。
それって、僕だけ? (笑) C++ で言語作ってる人がいるけど、よくやるなぁ、とか思う。
ベース言語のクラスとか継承とかと、実装言語のクラスや継承がごっちゃになて、訳わかんなくなっちゃう。
設計して、どういう風に作ろうかなと思った時点で、もう、わかんなくなって「もういい、やめた」って。
ttp://jp.rubyist.net/magazine/?0001-Hotlinks
- 216 :デフォルトの名無しさん:2008/07/21(月) 05:44:25
- C++/CLIのことかー
- 217 :デフォルトの名無しさん:2008/07/21(月) 16:17:08
- なんだ…人間の能力の限界の話なのかよ
- 218 :デフォルトの名無しさん:2008/07/21(月) 16:53:35
- PHPもC++でエンジン書いてたが、やばいと気がつき後にむりやりCで
書き直したと聞いたことがある。具体的に何がやばかったのかは知らない。
- 219 :デフォルトの名無しさん:2008/07/21(月) 17:24:10
- 俺には全く理解できん
CでいいならそのままC++でもいいじゃんと思うんだが…
- 220 :デフォルトの名無しさん:2008/07/21(月) 17:36:48
- そもそもCよりC++の方が型がこなれているんだから
OO捨ててもCより享受できるものが多いはず。
まあ、でもポータビリティ犠牲にするほどのものでもないかなあ。
- 221 :デフォルトの名無しさん:2008/07/21(月) 18:47:24
- >>219
C++ は、効率重視で、バイナリ互換とるのが極端に難しい実装ばっかりなので、
独立アプリならいいんだけど、ライブラリとして広く長期的に共有されるような
ものの記述には残念ながらあまりむいてない。
Windows はこれを COM という形で一応解決したんだけど、UNIX 系OSではその手のものが
統一的につくられることは結局なかったからね。php のような、他と組み合わせた
運用が求められるものだとこの点はわりと致命的なので、Cでかかざるをえ
なくなったんじゃないかな。
一応 Objective-C という選択はあるけど、こっちは実装が限られてるからねぇ
- 222 :デフォルトの名無しさん:2008/07/21(月) 19:14:47
- 勉強になりました
- 223 :デフォルトの名無しさん:2008/07/21(月) 21:55:19
- ABIの問題ってことかな。
C++のライブラリをextern "C"してDLLやsoにしたものを、
Cとかで呼ぶとなんかまずそうなのは想像できるな。
グローバルなコンストラクタとかあったらそれはいつ呼ばれるんだろうって。
- 224 :デフォルトの名無しさん:2008/07/21(月) 23:31:59
- 継承かガベージコレクトじゃね?
- 225 :デフォルトの名無しさん:2008/07/22(火) 00:54:53
- >>223
もう一度良く考えてみろ。どうにもならないことはない。単にリンカがどうするかというだけのことだ。
しかし、万人が納得する解法は無いという事も、ここからわかる。
- 226 :デフォルトの名無しさん:2008/07/24(木) 20:18:47
- Squirrel3.0alpha1リリースあげ
- 227 :デフォルトの名無しさん:2008/07/25(金) 08:35:19
- イラネ
- 228 :デフォルトの名無しさん:2008/08/02(土) 19:26:37
- hoshu
- 229 :デフォルトの名無しさん:2008/08/03(日) 06:02:10
- squirrelでsq_compile()を行うとプロシージャが一つ返ってきますが、
このプロシージャは何を表しているのでしょうか?
たえば、コンパイル元のファイルが、
function foo()
{
print("foo");
}
function bar()
{
print("bar");
}
の場合、sq_compile()が返すプロシージャはこの2つの内の一つなんでしょうか?
- 230 :デフォルトの名無しさん:2008/08/03(日) 09:02:27
- squirrel 的には用語は「クロージャ」ってのはさておき、
戻ってくるのは、元のソースを頭から終わりまで実行するクロージャになります。
その例でいくなら、「foo() と bar() をグローバル空間に登録するクロージャ」ということになります。
sq_compile → sq_call してはじめてスクリプトで記述したことが意味を持ちます。
sq_compile したものを sq_writeclosure すると、コンパイルされてバイナリ状態に
なったスクリプトを保存できます。これを sq_readclosure → sq_call するようにすると、
実行時にコンパイルしなくてすみます。
ちなみに sqstdio にふくまれる sqstd_loadfile, sqstd_dofile は、テキスト/バイナリいずれのスクリプトも
同様に扱ってくれるので便利です(ファイルのヘッダをみて、sq_readclosure / sq_compile を切り換えてくれる
- 231 :229:2008/08/03(日) 13:22:55
- >>230
解説ありがとうございました。おかげで理解できたような気がします。
説明をふまえて、マニュアルにあらためて目を通すと、
function ciao(a, b, c)
{
}
は
this.ciao <- function(a, b, c)
{
}
と等価であるという説明から、「sq_call()が返すのはグローバル空間に登録するクロージャ」ということがより直感的に理解できました。
#コンパイル済みのバイナリについても悩みどころだったので説明感謝です。
- 232 :デフォルトの名無しさん:2008/08/05(火) 01:40:07
- LuaとかSquirrel使ってる人って、存在しない関数・変数の検出や、
引数の数チェックってどうしてます?
実行時にはエラーになりますが、さすがに関数の引数の数間違いで
実行が止まるのは面倒ですし、
エラーが起きるコードが普段はなかなか実行されないところに
あるものだったりするとかなり面倒ですよね。。。
- 233 :デフォルトの名無しさん:2008/08/05(火) 02:22:21
- それは環境によるのでは?
ユーザーにいじらせるようなものでなければ落とした方が間違いに気付きやすくていいと思うけど
- 234 :デフォルトの名無しさん:2008/08/05(火) 05:15:11
- 誰か静的型付けの組み込み言語作ってよ
- 235 :デフォルトの名無しさん:2008/08/05(火) 12:04:09
- >>232
型チェックさえしていれば引数の数チェックは必要ない。
Luaは引数の数が違っても変数が未定義でも実行は止まらない。
存在しない変数の値はnilとして続行。
実行が止まるのは、nil以外の型が必要なところにnilが来るのが原因。
- 236 :デフォルトの名無しさん:2008/08/05(火) 23:42:07
- >>233
そうですね、僕は自分しかいじらないので、エラーの時は落とすようにしてます。
ただそうしてると、Cなどであればコンパイル時にわかる型のミスなどが、
Luaだと実行してしばらくしてからでないとわからないので面倒で…
>>235
nilが入ってたまたま動作し、エラーが発見できなかった場合に
デバッグするのが大変ではありませんか?
公開する時には実行が止まらない挙動でないとまずいですが、
作っているときは「想定外の挙動」を検出するために、
型チェックと引数の数チェックは必須だと思っています。
>>234
そ・れ・だ!
- 237 :デフォルトの名無しさん:2008/08/06(水) 02:19:38
- >型チェックと引数の数チェックは必須だと思っています
個人的には厳格な静的チェックが欲しいならCで書けばいいし、
気楽にかけて初心者に教えやすく関数がファーストクラスだったりするのが
スクリプトのメリットだと思ってる
でもまー、スクリプトの用途によって違うかもね
- 238 :デフォルトの名無しさん:2008/08/06(水) 02:27:31
- なにげにsquirrelだとC++から関数通すたびに数回は引数の数チェックに
ひっかかるけど実はデバッグのための膨大な時間の浪費を回避できてたのかな
- 239 :デフォルトの名無しさん:2008/08/06(水) 07:07:49
- 関数型の組み込み言語あれば面白いかも
- 240 :デフォルトの名無しさん:2008/08/06(水) 08:30:08
- lisp系ならそこそこないか
- 241 :デフォルトの名無しさん:2008/08/07(木) 09:57:22
- ゲーム作ってるんですがNPC等のと会話中の選択肢などをスクリプトで書きたいと思ってます。
今のところc++で使いやすそうなのでSqPlusが候補なんですが、
どんな感じにやるものなのかってのいうが全然想像できないです。
例えば下のような感じでc++と行ったり来たりってのはできるんでしょうか?
//////////////////////////////////////////////////////
game::SetMsg("買い物する?");
if(game::ShowWndYesNo())//ゲーム側で選択画面を出し、何らかの方法で入力を待ち結果を取得…
{
if(game::GetMoney() == 0)
{
game::SetMsg("お客さん金持ってないね!")
}
else
{
game::SetMsg("何にする?")
game::ShopOpen();//買い物画面出して買い物が終わるのを待つ…
}
}
game::SetMsg("またきてね!");
///////////////////////////////////////////////////////
- 242 :241:2008/08/07(木) 10:06:29
- なんでもないです。無かったことにしてください^^
- 243 :241:2008/08/07(木) 11:20:04
- うーんやっぱ全然分かりません。
>>241みたいな例でいうと、
c++側でgameクラスのインスタンスを生成して、
そのポインタをsqplusに渡して、
sqplus側でSetMsg()だのGetMoney()だのの関数を使う
っていう、そういうことはできないんでしょうか?
なんか根本的に用途間違ってますか?
- 244 :241:2008/08/07(木) 11:28:49
- >sqplus側でSetMsg()だのGetMoney()だのの関数を使う
sqplus側で受け取ったポインタを通して
そのインスタンスのSetMsg()だのGetMoney()等のメンバ関数を使ったり
メンバ変数の操作をしたり、ということをしたい、、、
ということです。
- 245 :デフォルトの名無しさん:2008/08/07(木) 12:06:33
- もう少しマニュアルとサンプルとか見直して出直してきたほうがいいぞー
概念的にはもちろんそういうことができるが、C++ のインスタンスの情報は
squirrel 側は当然知らないので、ポインタを渡しただけでは何もできない。
呼び出し用のラッパーを squirrel の流儀で構築する必要がある。
具体的には、C++ のインスタンスは、ユーザデータ型をつかって保持し、
メソッド呼び出しは、そのインスタンスを使ってメンバ呼び出しをする
Cのラッパー関数を、ネイティブクロージャとして、そのユーザデータ型の
オブジェクトの委譲テーブルに登録することで実現する。
sqplus はこれの記述を簡易化するためのテンプレートライブラリ。
メンバメソッドの引数から自動的にラッパーを組み上げて登録してくれる。
基本的には、登録したクラスを、squirrel 側からインスタンス化して使うのが想定されてて、
C++ 側で生成したインスタンスをはめこむのは原理的にはできるはずだけど、sqplusが
それをサポートしてたかどうかは知らない。
- 246 :デフォルトの名無しさん:2008/08/07(木) 12:30:15
- つまり、C++をはじめとする静的型付言語の問題は型システムの相互運用性でありそれが組み込み言語でユーザデータを扱う際に表面化する、というわけだな。
- 247 :デフォルトの名無しさん:2008/08/07(木) 13:29:25
- >>245
SqPlus の testSqPlus2unit/test_PassByReference.cpp
にその例があるよ
- 248 :デフォルトの名無しさん:2008/08/07(木) 22:22:37
- Squirrelで使えるクラスを作りたいだけならこんな感じだったような
class CGame {
int GetMoney() { return 100; }
void ShowWndYesNo() { printf("yes no\n"); }
void SetMsg(const SQChar* msg) { printf(msg); }
};
DECLARE_INSTANCE_TYPE_NAME(CGame, Game)
void reg_my_class() {
SQClassDef<CGame> game_class_def(_T("Game)"));
game_class_def.func(&CGame::GetMoney, _T("GetMoney"));
game_class_def.func(&CGame::ShowWndYesNo, _T("ShowWndYesNo"));
game_class_def.func(&CGame::SetMsg, _T("SetMsg"));
}
- 249 :デフォルトの名無しさん:2008/08/08(金) 01:38:24
- >>232
動的言語はその辺は実行しろでFAだったと思いますよ。
動的言語を使用するなら、せめて全経路を走査する単体テストくらいは書けということなのでしょう。
>>245
>基本的には、登録したクラスを、squirrel 側からインスタンス化して使うのが想定されてて、
>C++ 側で生成したインスタンスをはめこむのは原理的にはできるはずだけど、sqplusが
>それをサポートしてたかどうかは知らない。
Squirrelを直に叩いていいならば、
・sq_createinstanceでコンストラクト前のオブジェクトを得る。
・sq_setinstanceupでオブジェクトのポインタをセット
・sq_setreleasehookで後始末関数を設定
で実現できると思いますが、SqPlusには相当する機能は無いんでしょうか。
この機能、無いとFactoryMethodがあるとき困るので、無い事は無いと思うんですが…
- 250 :デフォルトの名無しさん:2008/08/08(金) 02:42:19
- >>215
- 251 :デフォルトの名無しさん:2008/08/08(金) 03:56:36
- どうしても自分のコードで new したポインタを使いたいのかな
これじゃダメなのん?
CreateConstructNativeClassInstance(SquirrelVM::GetVMPtr(), "Game");
SquirrelObject obj = Get(TypeWrapper<SquirrelObject>(), SquirrelVM::GetVMPtr(), -1);
SquirrelVM::Pop(1);
CGame* game = (CGame*)obj.GetInstanceUP(ClassType<CGame>::type());
printf("money = %d\n", game->GetMoney());
obj.Reset();
- 252 :デフォルトの名無しさん:2008/08/12(火) 18:06:52
- お前らちょっと聞いてくれよ Squirrelなんだけどさ、
class Foo
{
val = [];
}
ってプロパティを空配列で初期化したんだけどさ、これ、インスタンス毎に
空配列を作成するんじゃなくて、インスタンス間で同じ空配列を参照するんだね。
わかんなくて3時間くらいはまったよ。なんだよもうOTL
- 253 :デフォルトの名無しさん:2008/08/12(火) 18:41:53
- うむ。みんなが通る道だ。クラス中で定義した値は、インスタンス生成時に
毎回実行されるわけじゃなくて、単にコピーされるんでそういう挙動になるようだ。
ってことで、配列と辞書はコンストラクタで初期化するのが基本。
ちなみに全部同じ空配列を参照するから、クラス変数的に使えたりする。
- 254 :デフォルトの名無しさん:2008/08/17(日) 10:46:09
- Luaのgeneric for文って、引数の個数を柔軟に扱うというLuaの特徴を生かしているのだね。
- 255 :デフォルトの名無しさん:2008/08/17(日) 15:43:02
- くわしく
- 256 :デフォルトの名無しさん:2008/08/17(日) 17:40:24
- >A for statement like
>
> for var_1, ・・・, var_n in explist do block end
>
>is equivalent to the code:
>
> do
> local f, s, var = explist
> while true do
> local var_1, ・・・, var_n = f(s, var)
> var = var_1
> if var == nil then break end
> block
> end
> end
io.lines 等を使うときは s や var は考えないわけだが、
f() の代わりに f(s, var) としても間違いじゃないから上のコードで統一できる。
- 257 :デフォルトの名無しさん:2008/08/17(日) 20:18:21
- >>256
なんかやたら抽象的なコードが出てきたと思ったら、
リファレンスマニュアルから引用してるのか。
http://sugarpot.sakura.ne.jp/yuno/html/lua51_manual_ja.html#2.4.5
- 258 :デフォルトの名無しさん:2008/08/17(日) 22:02:49
- Programming in Luaにも同じコードがある。日本語訳は無いみたい。
http://www.lua.org/pil/7.2.html
- 259 :デフォルトの名無しさん:2008/08/21(木) 23:59:39
- 何かよく分からないけどCからLuaに何かさせたい人とか向けな超入門用のテンプレ作ってるの見つけた
・Cからluaにグローバル変数を登録する の項だけ絶賛放置プレイされてるけどまあこのスレ見てるなら過去ログに書いてあるし
ttp://www2s.biglobe.ne.jp/~nunokawa/wiki.cgi?page=Lua
69 KB
[ 2ちゃんねる 3億PV/日をささえる レンタルサーバー \877/2TB/100Mbps]
取りに行ったけどなかった。次は一時間後に取りに行くです。新着レスの表示
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver 05.0.7.3 2008/07/26
FOX ★ DSO(Dynamic Shared Object)