【Lua】組み込み系言語総合 その4【Squirrel】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2011/03/30(水) 01:00:58.93使われるプログラミング言語についてのスレッドです
まとめwiki(なにか質問する前に必ずみること!)
http://wikiwiki.jp/lua/
その他の参考URLは>2から
■前スレ
【Lua】組み込み系言語総合 その3【Squirrel】
http://hibari.2ch.net/test/read.cgi/tech/1272643397/
■過去スレ
その2 http://pc12.2ch.net/test/read.cgi/tech/1243210301/
その1 http://pc12.2ch.net/test/read.cgi/tech/1205208141/
プログラミング言語 Lua
その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
0159デフォルトの名無しさん
2011/05/27(金) 06:46:58.590160デフォルトの名無しさん
2011/05/27(金) 07:13:23.47x = {}
x[100000]=0
x[100000]=nil
ってしたら今後xがなくなるまでずっとメモリ上のサイズは100000要素分のまま?
0161デフォルトの名無しさん
2011/05/27(金) 11:45:34.81その書き方がインデクスを使わないことを明示していて良さそうですね。
0162デフォルトの名無しさん
2011/05/27(金) 12:18:08.020163デフォルトの名無しさん
2011/05/27(金) 13:35:12.760164デフォルトの名無しさん
2011/05/27(金) 16:17:32.080165デフォルトの名無しさん
2011/05/27(金) 16:29:13.740166デフォルトの名無しさん
2011/05/27(金) 23:12:39.16なんかどのドキュメントも筆者の書くのだりぃって気持ちが伝わってくる
0167デフォルトの名無しさん
2011/05/28(土) 03:23:56.48web
0168デフォルトの名無しさん
2011/05/28(土) 05:38:27.11具体的にどういった部分がまともではないのかを提起しないと話にならん
0169デフォルトの名無しさん
2011/05/28(土) 18:49:08.28extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"}
でLuaのヘッダのインクルードまでは動作しましたが
lua_State* L;でLuaステートの作成を行ってから
lua_open()やlua_newstate()等どのLua関数を呼び出しても
「1>○○○.obj : error LNK2001: 外部シンボル "_luaL_newstate" は未解決です。」
のエラーが表示されます。
何を行えば解決するでしょうか
0170デフォルトの名無しさん
2011/05/28(土) 18:50:47.590171デフォルトの名無しさん
2011/05/28(土) 19:05:15.01ものすごくテンションあがってきました
0172デフォルトの名無しさん
2011/05/28(土) 19:14:45.580173デフォルトの名無しさん
2011/05/28(土) 20:27:52.420174デフォルトの名無しさん
2011/05/28(土) 20:52:20.05スタックが足りなくなる可能性があるならlua_checkstackで確認
メモリが足りなくなる可能性があるならlua_newstateでアロケータ指定
0175デフォルトの名無しさん
2011/05/28(土) 21:12:21.58割り当てられないか検討
もしデフォルトのmallocなら割と詰んでる。キャッシュ処理とか実装してるなら掃除するとか
0176デフォルトの名無しさん
2011/05/29(日) 00:09:29.700177デフォルトの名無しさん
2011/05/29(日) 00:16:27.580178デフォルトの名無しさん
2011/05/30(月) 17:34:20.92ルアのガベコレとCPPの参照カウントで二重管理になってもったいない気がするんだが……
今はCPPの参照カウントをルアのガベコレでデクリメントさせてるけど
0179デフォルトの名無しさん
2011/05/30(月) 17:36:49.75逆もできる。
0180デフォルトの名無しさん
2011/05/30(月) 17:37:46.17>CPPの参照カウントをルアのガベコレでデクリメントさせてる
ならほぼ最適解じゃない?
0181デフォルトの名無しさん
2011/05/31(火) 21:36:48.46Cで管理してluaにポインタだけ渡してたら型チェックめんどくさくね?
luaL_checkudataが使えないと自分で型チェック書かないといけない
0182デフォルトの名無しさん
2011/06/01(水) 09:28:40.47オプションってある?
0183デフォルトの名無しさん
2011/06/01(水) 09:39:41.55lua_State *L = lua_open();
#ifdef NDEBUG
if(luaL_loadstring(L, "assert = function(...) return ... end") || lua_pcall(L, 0, 0, 0))
{
puts("err"); return 1;
}
#endif
//いつもの処理
lua_close(L);
return 0;
}
Cに合わせてデバッグ切り替えるならこんな感じかな
0184デフォルトの名無しさん
2011/06/01(水) 09:50:00.87assert("ほげほげ")
コンパイル済みソースに "ほげほげ" の部分が現れないようにしたかったんだけど、
プリプロセッサでもつくらないと無理ぽいね
#define assert(x) true
みたいなのが一発でできればいいのに...
0185デフォルトの名無しさん
2011/06/01(水) 21:44:06.76AngelScript|Д`)つboost::wave
AngelScript|`) boost::wave
0186デフォルトの名無しさん
2011/06/02(木) 02:42:57.43assert(...)
assert(...)()
a,b,..=assert(...)
用法マチマチだから厳しいと思うよ
0187デフォルトの名無しさん
2011/06/04(土) 17:01:23.980188デフォルトの名無しさん
2011/06/04(土) 18:50:35.21lighuserdata はよーするに lua はいっさい関与しませんよ、ってデータなので、
その管理の全責任は作った人にある
0189デフォルトの名無しさん
2011/06/04(土) 20:55:35.61int type;
void *ptr;
};
てのをつくって、必ずこれを渡すようにすれば。
MyData data;
data.type = MyObject;
data.ptr = (void *)myObject;
lua_pushlightuserdata(ls, &data);
MyData *arg = (MyData*)lua_tolightuserdata(ls, -1);
switch (arg->type) {
case ...
};
0190デフォルトの名無しさん
2011/06/04(土) 21:14:38.660191デフォルトの名無しさん
2011/06/05(日) 10:37:54.80Luaのほうにオブジェクト指向を意識してインスタンスのsetter/getterメソッド作ってるのがなんか馬鹿らしい。
0192デフォルトの名無しさん
2011/06/05(日) 16:00:05.88インクルードヘッダみろって言われて見てもよくわからないし
0193デフォルトの名無しさん
2011/06/05(日) 18:08:06.75setgetのないクラス設計にすればいいよ
0194デフォルトの名無しさん
2011/06/05(日) 21:04:53.230195デフォルトの名無しさん
2011/06/05(日) 21:09:07.40.property("x", &A::GetX, &A::SetX)
ってやって、C++からはget/setで、Luaからはpublic変数みたいにして
アクセスしちゃう感じで統一してる
0196デフォルトの名無しさん
2011/06/05(日) 22:35:27.70(多重)継承しないでコンポジションをするのが馬鹿らしいっていうのと同じに見える
だからたぶん(多重)継承の問題と同じ結論になる
0197デフォルトの名無しさん
2011/06/05(日) 22:41:55.59┼ (\. \! * // ,/) *
+ * (ヽ、 \ + * / /) +
⊂ニ ) * + ( ニ⊃
* + ⊂、 ( ∩___∩ ノ ⊃ + *
(/(/ ヽ | ノ ヽ / 、)ヽ) ┼
+ (/ ∨ ● ●レ /⌒) 、)ヽ)
* (/' | ( _●_) ミ' /、)、)´ +
+ (/'ヽ 彡、 |∪| ノ / AngelScript!!
+ / __ヽノ / * +
┼ (___) / +
0198デフォルトの名無しさん
2011/06/06(月) 20:51:57.390199デフォルトの名無しさん
2011/06/06(月) 22:05:52.90Rubyみたメソッド名に?使えると戻り値が真偽ってわかりやすいんだが。
とここで言ってもなんの意味もない!
0200デフォルトの名無しさん
2011/06/06(月) 22:44:53.340201デフォルトの名無しさん
2011/06/07(火) 14:21:59.35attempt to index local 'self' (a number value)エラーが出るんだけど。。。
何が原因かわからん、、、
0202デフォルトの名無しさん
2011/06/07(火) 19:14:43.09t:func(...) と t.func(...) の違いが分かってないんじゃない?
0203デフォルトの名無しさん
2011/06/07(火) 19:16:20.15ありがとうございます。
なんかしらないけど動きました。。。失礼しました。
0204デフォルトの名無しさん
2011/06/07(火) 19:18:19.390205デフォルトの名無しさん
2011/06/07(火) 20:01:02.49ありがとうございます。もっと基礎を勉強します。
しかし読みにくいソースだなぁ。。。こんなもんなのかな
0206デフォルトの名無しさん
2011/06/07(火) 23:45:57.720207デフォルトの名無しさん
2011/06/08(水) 03:58:06.26C++が暗黙的にやってくれてるのをLuaはやってくれないだけで
どっちもthis(luaはself)を関数に渡してクラスという仕組みをやってる
0208デフォルトの名無しさん
2011/06/08(水) 08:09:09.86/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ Lua!!
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
0209デフォルトの名無しさん
2011/06/08(水) 13:19:37.47http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
うほっ
0210デフォルトの名無しさん
2011/06/08(水) 20:45:30.63┼ (\. \! * // ,/) *
+ * (ヽ、 \ + * / /) +
⊂ニ ) * + ( ニ⊃
* + ⊂、 ( ∩___∩ ノ ⊃ + *
(/(/ ヽ | ノ ヽ / 、)ヽ) ┼
+ (/ ∨ ● ●レ /⌒) 、)ヽ)
* (/' | ( _●_) ミ' /、)、)´ +
+ (/'ヽ 彡、 |∪| ノ / AngelScript!!
+ / __ヽノ / * +
┼ (___) / +
0211デフォルトの名無しさん
2011/06/09(木) 08:24:57.93〈〈〈 ヽ
〈⊃ }
∩___∩ | |
| ノ ヽ ! !
/ ● ● | /
| ( _●_) ミ/ Lua!!
彡、 |∪| /
/ __ ヽノ /
(___)
0212デフォルトの名無しさん
2011/06/09(木) 21:40:59.90Hoge::GetInstance()->load()こんなのを呼びたいです。
グローバル関数でラップして公開すればよいですか?
0213デフォルトの名無しさん
2011/06/09(木) 21:50:20.710214デフォルトの名無しさん
2011/06/10(金) 00:41:57.63http://tatsu-zine.com/books/squirrel/pages/interview1
超オヌヌメ!!
0215デフォルトの名無しさん
2011/06/10(金) 00:57:13.720216デフォルトの名無しさん
2011/06/10(金) 01:52:48.680217デフォルトの名無しさん
2011/06/10(金) 19:54:15.85loadfileしたあとにpcallしてからgetglobalしてpcallすると大丈夫。
なんでpcallを2回呼ぶ必要があるの?
0218デフォルトの名無しさん
2011/06/10(金) 21:05:28.130219デフォルトの名無しさん
2011/06/10(金) 21:49:46.65loadfileしただけじゃLuaに書いた関数が
その名前でgetglobalできるわけじゃねーよ
function hoge() ... end
はhogeという大域変数に関数オブジェクトを突っ込むと解釈されるので
まずはこのコードをloadするだけじゃなくてpcallで実行する必要がある
0220デフォルトの名無しさん
2011/06/10(金) 22:26:02.75でもhoge()は例えば引数が2個なんだけど、1回目のpcallの時は引数0個で
で呼んでいいみたい(それか、引数0個で呼ばないとだめなのかも)。
それはいいのかな?
0221デフォルトの名無しさん
2011/06/10(金) 22:44:18.90http://sugarpot.sakura.ne.jp/yuno/html/lua51_manual_ja.html#lua_call
リファレンスを読むといいよ
0222デフォルトの名無しさん
2011/06/10(金) 23:10:58.54pcallを2回呼ぶ解説とかは見つけられなかった。
どの辺りを読んだらいいか教えて欲しいです。
0223デフォルトの名無しさん
2011/06/10(金) 23:13:31.19http://sugarpot.sakura.ne.jp/yuno/html/lua51_manual_ja.html#2.4.1
これも読むといいよ
0224デフォルトの名無しさん
2011/06/10(金) 23:15:45.490225デフォルトの名無しさん
2011/06/10(金) 23:44:33.71どこかで説明されてるのかなと思って。
>>223によると、1回目のpcallでチャンクをコンパイルしてるってことなのかな?
しかしloadfile後に必ず1回目のpcallが必要なんだったら、loadfileの中で
やってくれればいいのに。
0226デフォルトの名無しさん
2011/06/11(土) 00:08:04.840227デフォルトの名無しさん
2011/06/11(土) 00:08:25.04無名関数ってものが分かってないでしょ?
0228デフォルトの名無しさん
2011/06/11(土) 00:29:31.85対象読者
Squrrelに興味のある方(初心者、または初心者に教える方)。組み込み言語に興味のある方。
>>216
現在β版であり、正式公開版では対応しているといいなあ〜
0229デフォルトの名無しさん
2011/06/11(土) 18:54:20.95呼び出したりすることは出来ないのですか?
0230デフォルトの名無しさん
2011/06/11(土) 19:15:11.15むしろなんでそういうことができるのかもと思ったのかに興味があるw
0231デフォルトの名無しさん
2011/06/11(土) 19:18:18.40いや、関数型を受け取りたいなと思いまして
0232デフォルトの名無しさん
2011/06/11(土) 21:10:20.97>>231
出来るよ。
int call_lua_function(lua_State *L) {
if( lua_gettop(L)>=1 && lua_type(L,-1) == LUA_TFUNCTION ) {
lua_pcall(L, 0, LUA_MULTRET, 0);
}
return 0;
}
int call_c_function(lua_State *L) {
void (*pCFunction)();
if( lua_gettop(L)>=1 && lua_type(L,-1) == LUA_TLIGHTUSERDATA ) {
pCFunction = (void(*)()) lua_topointer(L,-1);
pCFunction();
}
return 0;
}
void HelloWorld() { printf("Hello C Function!\n"); }
int get_c_function(lua_State *L) {
lua_pushlightuserdata(L, (void*)&HelloWorld);
return 1;
}
-- test.lua
call_lua_function( function() print("Hello Lua Function") end )
call_c_function(get_c_function())
0233デフォルトの名無しさん
2011/06/11(土) 22:56:20.56普通に引数で呼び出すにはラップ関数書かないといけないのかな。
UWSCみたいなスクリプトの関数を呼び出す方法とかもちょっとまだ分からないし。
0234デフォルトの名無しさん
2011/06/12(日) 00:03:33.30あー、でもC++側からスクリプトの関数呼び出す時はそんなに手間変わらんか。
0235デフォルトの名無しさん
2011/06/12(日) 00:15:46.88という言葉があるが
可能であることの評価が低すぎる
効率が良いことしか評価されなくなってるのかな
0236デフォルトの名無しさん
2011/06/12(日) 00:33:28.55luabindというものがあってだな・・・
lua_State *L = luaL_newstate();
luaL_openlibs(L);
open(L);
{
luaL_dostring(L,"function func1() print('hello') end" "\n");
call_function<void>(L, "func1");
luaL_dostring(L,"function func2(a,b) return a + b end" "\n");
int a = 10, b = 20;
cout << "a + b = " << call_function<int>(L, "func2", a, b) << endl;
luaL_dostring(L,"function func3() return {1,2,3,['X']='XXX'} end" "\n");
object tbl = call_function<object>(L, "func3");
for( luabind::iterator i(tbl),end; i!=end; ++i ) {
cout << i.key() << " is " << *i << endl;
}
luaL_dostring(L, "function dump_table(t) for k,v in pairs(t) do print(k .. ' is ' .. v) end end" "\n");
call_function<void>(L, "dump_table", tbl);
}
lua_close(L);
0237デフォルトの名無しさん
2011/06/12(日) 00:47:55.33ありがとうございます
luaの関数を取っておいて後でpushfunctionみたいなことってできますでしょうか
0238デフォルトの名無しさん
2011/06/12(日) 02:47:35.68topointerで取得したアドレスをlua_pushlightuserdataでスタックに積んで
LUA_TFUNCTIONに書き換えれば呼べたけど、たぶんまずいんだろうな
0239デフォルトの名無しさん
2011/06/12(日) 02:55:39.46lua の場合はそういうときは関数をレジストリになげこんでおいて、
C側ではそれのキーを保持しておくのが定石
ただし、整数値のキーは lua が内部的に使っていて衝突の可能性が
あるので、普通は C側のポインタ値を lightuserdata としてキーにする。
静的変数のポインタか、lua の値を C側でとっておくための動的オブジェクトの
ポインタとかをキーにするのが一般的やね。
0240デフォルトの名無しさん
2011/06/12(日) 03:21:18.85LUA_REGISTRYINDEXですね!ありがとうございました
0241デフォルトの名無しさん
2011/06/12(日) 17:49:02.77結構作ってから標準のtable関数が消えてることに気づいた…
なんでLuaの関数こんな簡単に死んでしまうん?…orz
0242デフォルトの名無しさん
2011/06/12(日) 19:51:15.000243デフォルトの名無しさん
2011/06/12(日) 21:43:09.59関数が変数に突っ込める以上仕方ないのかもしれん
0244デフォルトの名無しさん
2011/06/12(日) 21:59:36.69だけど、自由を制限しないためにチェックしてないんだろう。
0245デフォルトの名無しさん
2011/06/12(日) 22:30:52.66リスト操作をもっと簡単にしたいんだけど、metatableを全てのテーブルに強制的に束縛させる方法とかないかな?
0246デフォルトの名無しさん
2011/06/12(日) 22:32:28.780247デフォルトの名無しさん
2011/06/13(月) 00:03:37.060248デフォルトの名無しさん
2011/06/13(月) 00:42:56.860249デフォルトの名無しさん
2011/06/13(月) 02:16:42.39オヌヌメ解説本
http://tatsu-zine.com/books/squirrel/pages/interview1
squirrel関連の資料がほぼ皆無な現状で1,000円(税込)は安いと思いました
著者は5年くらい、都内のゲームデベロッパーにいてずっとゲームを作っておられた凄腕
わずか4、5歳の頃よりファミコンのマリオやドラクエを嗜んでおられたそうな
0250デフォルトの名無しさん
2011/06/13(月) 02:28:21.510251デフォルトの名無しさん
2011/06/13(月) 03:16:57.390252デフォルトの名無しさん
2011/06/13(月) 05:09:27.823.0非対応だし、確かに安いけど、ぶっちゃけいま買う理由はないんでないの
0253デフォルトの名無しさん
2011/06/13(月) 07:08:32.27LuaもSquirrelも数千行の短いプログラムでできてんだろ?
なら俺達でも作れるんじゃね?
0254デフォルトの名無しさん
2011/06/13(月) 07:24:09.210255デフォルトの名無しさん
2011/06/13(月) 07:25:55.860256見習い中
2011/06/13(月) 12:15:07.57数値はDouble型。型指定は基本的にできない。ポインタ型を32ビット変数として使う方法がある。
Doubleのせいで計算速度が遅くなるだけでなく、キャストで化けることあり。
SciTEの読みはサイト(らしい)。ゼロの使い魔か?
エラーの際のlua_atpanicにはお世話になりそう。
日本語未対応。対応バージョンもなくもない。
C言語と相互運用が可能だが、なんかしょっぱなからめんどくさい。
Lua側はシンプルなので、間違ってはいないのかも。
squirrel との比較
クラスがなく、冗長な記述になる。
C++との親和性が低い
continue がない。やっぱり必要?
ビット演算 が弱い。あれ?ライブラリは・・
>>214
> Squirrelの前にはLuaとかもあって、海外とかだとわりと積極的に使われていたのではないでしょうか。
> 汎用的なものと組み込み言語というのはメジャーになってきた、というような雰囲気ですね。
>
> Squirrelの場合、クラスベースの考え方が通用する分、僕はやさしいなと感じます。
> Luaとかはわりとかけ離れているというか、かけ離れているとまでは言わないですが、単純に見た目としての問題って言うんですかね、
> ある程度プログラミングのたしなみのある人が見えればやってることは理解できるんですけども、
> ほんとにSquirrelの方が分かりやすいなっていう感じがします。
> PythonやRubyも文法とか文化が違う感じが若干しますね。
なるほど
0257デフォルトの名無しさん
2011/06/13(月) 14:14:43.26( ・∀・) < Lua!!
⊂/ 9) \____
q( /
> >
0258デフォルトの名無しさん
2011/06/13(月) 16:59:30.65■ このスレッドは過去ログ倉庫に格納されています