プログラミング言語 Lua その3
at TECH
1:デフォルトの名無しさん
06/10/14 13:13:52
だれか サポ−ト 頼む。
前々スレ URLリンク(pc5.2ch.net)
前スレ スレリンク(tech板)
本家 URLリンク(www.lua.org)
lua-users URLリンク(lua-users.org)
LuaForge URLリンク(luaforge.net)
Lua 5.1 リファレンスマニュアル(日本語訳)
URLリンク(sugarpot.sakura.ne.jp)
2:デフォルトの名無しさん
06/10/14 13:18:27
/\
/ =.\
// ̄\ .\
/| |へノ⌒| //\
\ \_// .\
\ = / \
\/ \
∧∧∧∧\
( `/) >ヽ∧
/ / / `∀> ∧∧
◇( イ◇ ( ,つ`∀´>
/ヽ )) ヽ )ヽ )と , イ
(_/(_/(_/(_/ノ(_/⊂ノ> )J
/ ̄Y ̄`|/ ̄^Y ̄ヽ/ ̄ ̄Y `´ ̄\
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
このスレはキムチ軍の奇襲により占領されました
3:デフォルトの名無しさん
06/10/14 13:28:44
色々リンク辿ってたら URLリンク(luaforge.net) を発見。
でも、ここのtable.clone関数は浅いコピーしかやってくれない模様。
色々と不足してるっぽいし、パッチとか投げたら喜ばれるのやもしれず……。
4:デフォルトの名無しさん
06/10/14 13:31:55
>>2
ちょw
5:デフォルトの名無しさん
06/10/15 00:39:00
テーブルは確かに必要な関数が多いかもしれないけど
実際のゲームとかphotoshopとかに組み込まれている奴って
テーブル関係の関数をどういう風に実装してんのかな
6:デフォルトの名無しさん
06/10/15 12:16:50
ム板って即死判定とかあったっけ?
とりあえず保守を兼ねて思いついたことを書くと、テーブルを書き出す前に
まず_Gとかを再帰的に舐めて関数テーブルを自力で作れば、関数名も書き出せて
復元できるようになるのでは?と思った。まだ試してないけど。
7:デフォルトの名無しさん
06/10/15 20:38:34
Luaを使ったゲームとかアプリで実際にどういう風に利用されているか読むのも
面白いな
テクニックとか盗めるし
8:デフォルトの名無しさん
06/10/16 13:09:03
C と Pascal を合わせたような言語で、Gentee というプログラム言語を
見つけたけど、誰か使っている人いる?
URLリンク(www.gentee.com)
9:デフォルトの名無しさん
06/10/16 18:33:32
>>2
消えうせろ
>>8
タイトルをよく読め
10:デフォルトの名無しさん
06/10/16 20:55:10
>>9
ここはLuaだけじゃなくて、LightWeight全般もサブで取り扱うスレです。
前スレをよく読め
11:デフォルトの名無しさん
06/10/16 22:17:34
そういやスレタイ変えるって話が出てたけど結局そのままだったね。
あとせっかく立ててくれたまとめWikiを忘れたらだめだよ。
[関連]
Lua/組み込み系言語 Wiki*
URLリンク(wikiwiki.jp)
12:デフォルトの名無しさん
06/10/16 23:13:17
実際にどういう風に使われているのか事例を紹介したりして、
余力があったらソースを解説したらいいんじゃないの
13:デフォルトの名無しさん
06/10/17 18:57:43
>>11
そのWikiってこのスレのまとめWikiだったのか!
14:デフォルトの名無しさん
06/10/17 19:24:21
#でコメントってもうないのですよね?
15:デフォルトの名無しさん
06/10/17 20:01:31
shebang行は無視してくれるけどね
16:デフォルトの名無しさん
06/10/17 23:43:19
リフレクションみたいなことが出来るってほんとうれすか
17:デフォルトの名無しさん
06/10/19 07:28:17
定期保守
18:デフォルトの名無しさん
06/10/19 20:08:41
天上天下唯一最高神が保守
19:デフォルトの名無しさん
06/10/19 20:33:56
引数の個数によるオーバーロード
function makeoverload(...)
local funcs={...}
return function(...) local args={...} return funcs[#args+1](...) end
end
function funcA()
print("引数なし")
end
function funcB(a)
print("1引数", a)
end
function funcC(a, b)
print("2引数", a, b)
end
func = makeoverload(funcA, funcB, funcC)
func()
func(123)
func(123, 456)
20:デフォルトの名無しさん
06/10/19 21:26:06
めっちゃ遅くなりそうだな
21:デフォルトの名無しさん
06/10/19 22:55:08
lua 5.0 からはそんなことしなくても最初っから arg っていう変数に束縛されてるよ。
Programming in Lua の2版には、確か ... ではなく arg の方を使えって書いてあったような気がした。
22:デフォルトの名無しさん
06/10/21 23:36:50
ほしゅ
23:デフォルトの名無しさん
06/10/22 22:46:38
文字列に文字列を挿入するとか
置換する関数が標準であればいいのに
Luaのgsubは使い方が判りづらくてウンコだ
24:デフォルトの名無しさん
06/10/24 19:13:22
保守
25:デフォルトの名無しさん
06/10/24 22:39:44
保守
26:デフォルトの名無しさん
06/10/25 22:01:41
1オリジンやめれ
27:デフォルトの名無しさん
06/10/26 07:11:13
チーズはどこにいった
28:デフォルトの名無しさん
06/10/27 07:35:23
本スレどこだ
29:デフォルトの名無しさん
06/10/29 20:30:04
保守
30:デフォルトの名無しさん
06/10/30 18:50:04
定期保守
31:デフォルトの名無しさん
06/10/30 19:51:42
小ネタ投下。
luaL_newmetatableで作成されたメタテーブルを持つユーザーデータならtnameを返し、それ以外ならtype()の結果を返す。
たとえばio.openで開いたファイルなら"FILE*"という文字列になる。
debugライブラリを使ってるのがマズイ
function type_ex(o)
local t = type(o)
if t=="userdata" then
local m = getmetatable(o)
if m then
for k,v in pairs(debug.getregistry()) do
if m==v then
if type(k)~="string" then
return tostring(k)
end
return k
end
end
end
end
return t
end
32:デフォルトの名無しさん
06/11/01 06:24:32
ていうか誰か速くJUMP文実装してくんねーかなぁ〜〜
33:デフォルトの名無しさん
06/11/02 18:54:59
スパゲティコードでよければ
↑の人が実装する
34:デフォルトの名無しさん
06/11/07 01:36:18
temp = { 500, x = 200, 'aaa', y = 300 }
というテーブルがあって、
temp[2]で200を取得することって出来ない?
35:デフォルトの名無しさん
06/11/07 14:23:55
できないと思う。
temp[2]は'aaa'になる。
嫌なら
temp[2] = temp.x みたいにするとか。
36:デフォルトの名無しさん
06/11/07 19:59:45
前スレの978みたいなやつ。
循環参照にも対応してるはず。
テーブルを渡すとそのテーブルを復元するコードを返す。
loadstring(save_table(t))()で元のテーブルのコピー。
↓をlua.exeに食わせると(ry
print((string.gsub([==[function save_table(data)@;assert(type(data)=="table")@
;local s,l,c={},"",""@;local function dump(x)@;;local t,r=type(x),nil@;;if t==
"nil" or t=="boolean" or t=="number" then@;;;r=tostring(x)@;;elseif t=="string
" then@;;;if x:find("[%[%]]") then@;;;;x=x:gsub("%%", "%%%%"):gsub("%[", "%%("
):gsub("%]", "%%)")@;;;;r="(u[["..x.."]])"@;;;else@;;;;r=" [["..x.."]] "@;;;en
d@;;elseif t=="table" then@;;;if s[x] then@;;;;r="m[\""..s[x].."\"]"@;;;else@;
;;;assert((not getmetatable(x)) or (not getmetatable(x).__tostring))@;;;;local
k=tostring(x)@;;;;s[x]=k@;;;;l=l.." m[\""..k.."\"]={}"@;;;;r="s(\""..k.."\",{
"@;;;;for k,v in pairs(x) do@;;;;;r=r.."["..dump(k).."]="..dump(v)..","@;;;;en
d@;;;;r=r.."})"@;;;end@;;end@;;return r@;end@;s[data] = "r"@;for k,v in pairs(
data) do@;;c = c.." r["..dump(k).."]="..dump(v)@;end@;return [[do local r,m={}
,{r=r}local function s(n,t)local r=m[n]for k,v in pairs(t)do r[k]=v end return
r end local function u(s)return s:gsub("%%%)","]"):gsub("%%%(","["):gsub("%%%
%","%%")end]]..l..c.." return r end"@end]==], "\n",""):gsub("%s*@%s*", "\n")
:gsub(";", "\t")))
37:36
06/11/08 17:21:17
少し修正。
print((string.gsub([==[function save_table(data)@;assert(type(data)=="table")@
;local s,l,c,e,a={},"","",false,false@;local function dump(x)@;;local t,r=type
(x),nil@;;if t=="nil" or t=="boolean" or t=="number" then@;;;r=tostring(x)@;;e
lseif t=="string" then@;;;if x:find("[%[%]]") then@;;;;x=x:gsub("%%", "%%%%"):
gsub("%[", "%%("):gsub("%]", "%%)")@;;;;r="(u[["..x.."]])"@;;;;e=true@;;;else@
;;;;r=" [["..x.."]] "@;;;end@;;elseif t=="table" then@;;;if s[x] then@;;;;r="m
['"..s[x].."']"@;;;else@;;;;assert((not getmetatable(x)) or (not getmetatable(
x).__tostring))@;;;;local k=tostring(x)@;;;;s[x]=k@;;;;l=l.." m['"..k.."']={}"
@;;;;r="s('"..k.."',{"@;;;;for k,v in pairs(x) do@;;;;;r=r.."["..dump(k).."]="
..dump(v)..","@;;;;end@;;;;r=r.."})"@;;;;a=true@;;;end@;;end@;;return r@;end@;
s[data] = "r"@;for k,v in pairs(data) do@;;c = c.." r["..dump(k).."]="..dump(v
)@;end@;return "do local r,m={},{}m.r=r"@;;..((a and " local function s(n,t)lo
cal r=m[n]for k,v in pairs(t)do r[k]=v end return r end") or "")@;;..((e and "
local function u(s)return s:gsub('%%%)',']'):gsub('%%%(','['):gsub('%%%%','%%
')end") or "")@;;..l..c.." return r end"@end]==],"\n",""):gsub("%s*@%s*", "\n"
):gsub(";", "\t")))
38:36
06/11/08 17:26:29
コード貼るだけではアレなのでちょっと使い方を説明。
--tableは保存しておきたいテーブル
dump = save_table(table)
--または dump = string.dump(loadstring(save_table(table)))
--ファイルに書き出す
f = io.open("hoge.lua", "w")
f:write(dump)
f:close()
--元のテーブルが復元される
table = dofile("hoge.lua")
function、thread、userdataはもちろん対応してない
39:デフォルトの名無しさん
06/11/08 19:47:35
あるスレッドである程度スタックに値を積んでいる状態で
lua_resumeを呼んで帰ってきたときに、それまでスタックに積んでいたものが見事に
なくなります。lua_call系では消えずに残っているようですが…仕様なのかバグなのか。
マニュアルに書いてあるlua_resumeを使うときはlua_newthreadで新しくスレッドを
作ってから使えっていうのはこういうことなのですね…。
40:デフォルトの名無しさん
06/11/10 18:38:07
lua.exeに食わせるとかアホな事やってないで
うpろだ使えよ
41:デフォルトの名無しさん
06/11/23 12:09:36
metaluaの使い方がわからねぇ。
42:デフォルトの名無しさん
06/11/23 13:52:08
昨日5.1 SJIS対応版を拾ってテストコードを作ってみたんだが動かないんだ。
lua_State *L=lua_open();
luaL_loadstring(L,"function Add(x,y)\r\n return x+y \r\nend\r\n");
//printf("%s\n",lua_typename(L, lua_type(L, -1)));
lua_getglobal(L, "Add");
//printf("%s\n",lua_typename(L, lua_type(L, -1)));
//printf("%s\n",lua_typename(L, lua_type(L, 1)));
lua_pushnumber(L, 1.2);
//printf("%s\n",lua_typename(L, lua_type(L, -1)));
lua_pushnumber(L, 2.3);
//printf("%s\n",lua_typename(L, lua_type(L, -1)));
if(lua_pcall(L, 2, 1, 0) != 0){
printf("残念賞:%s\n",lua_tostring(L, -1));
}
printf("%f\n",lua_tonumber(L, -1));
lua_pop(L, 1);
lua_close(L);
これだけで動くと思うんだが、lua_pcallした後は
「残念賞:attempt to call a nil value」
合間のprintfを有効にすると
function,nil,function,number,number って出る。
初っ端から駄目駄目な俺に誰か助言をくれ〜
43:デフォルトの名無しさん
06/11/23 14:09:21
>>42
残念!
44:デフォルトの名無しさん
06/11/23 14:57:13
>>42
FAQ
loadstringは評価しない。callしる。
45:42
06/11/23 16:47:09
>>44
オオゥ。そうなのか。
・・・うん、無事動きました。ありがとう。
46:デフォルトの名無しさん
06/12/01 04:10:14
==演算子でテーブルをくらべてるとき指してるテーブルが同じときにだけ__eqが呼ばれないことについて
47:デフォルトの名無しさん
06/12/02 01:21:16
>>46
そう定義されてるから仕方が無い
48:デフォルトの名無しさん
06/12/02 03:19:41
処世術なんてききたくない
この挙動は真っ当ではないと思わないか
49:デフォルトの名無しさん
06/12/02 03:38:02
それほど酷い仕様とも思えんが・・・
むしろ"=="の意味からいったら真っ当な気さえする。
演算子をつかってboost.spirit並みの拡張をしたい
というなら話はべつだが。
50:デフォルトの名無しさん
06/12/02 03:59:33
metamethodは記述は同じでも比べられる変数の値によって実行されたりされなかったりしていいと思う?
意味的な意味で
>むしろ"=="の意味からいったら真っ当な気さえする。
__eqよんだ上で返値を無視すりゃいいじゃん
51:デフォルトの名無しさん
06/12/02 13:39:17
>実行されたりされなかったりしていいと思う?
いいんじゃん。単に言語設計上のポリシーの問題では?
>__eqよんだ上で返値を無視すりゃいいじゃん
無視するぐらいなら、呼ばなきゃいいじゃん
52:デフォルトの名無しさん
06/12/02 13:55:08
>>50
別にいいと思う。それより
意味的な意味で ← この日本語がどうかと思う。意味がわからん。
53:デフォルトの名無しさん
06/12/02 14:52:21
metamethodの機能として不完全だということは認知してもらえるんだろうか?
スクリプト実行時にその時比較される値によって実行されたりされなかったりするんだよ?
その上で「まぁべつにいいんじゃねヽ(´ー`)ノ」という意味でいいって言ってるんだよね?
だから処世術なんてききたくないっていってんだよばかばかまんこ
54:デフォルトの名無しさん
06/12/02 16:00:59
同じテーブルを指す=比較するまでもない
という設計思想なんでしょ。
不必要なことはしないというだけで、別に不完全とは思わないなあ。
55:デフォルトの名無しさん
06/12/02 17:13:58
言いたい事があるならMLでサクーシャに直接言ったら良いじゃない。
56:デフォルトの名無しさん
06/12/02 17:16:18
とりあえず「metamethodの機能として完全」の
定義をしてくれ
言語設計ポリシーの結果として選択された仕様を
完全か否かなんて議論はきわめて不毛だし。
57:デフォルトの名無しさん
06/12/02 17:17:14
>>54
仮にそういう設計思想なんだとして、だったら__eqなんて作らせないでしょ?
58:デフォルトの名無しさん
06/12/02 17:18:58
>>53
>スクリプト実行時にその時比較される値によって実行されたりされなかったりするんだよ?
で、何が困るの?
困ることが無いなら、比較速度がかなり速くなる分、
いまの実装の方が完全なんだけど。
わかる?お前定義の「完全な言語」なんてどうでいいんだよアホ。
59:デフォルトの名無しさん
06/12/02 17:20:22
>>57
はぁ?バカか?
お前__eqの意味すら理解してないんじゃないのか?
60:デフォルトの名無しさん
06/12/02 17:23:07
そろそろ釣れた宣言がくる悪寒
61:デフォルトの名無しさん
06/12/02 17:24:49
べつにつらないよw
君らばかだなホント
62:デフォルトの名無しさん
06/12/02 17:34:22
お、でたでた。バカの口癖「お前等全員バカ」。
63:デフォルトの名無しさん
06/12/02 22:46:40
どうやら尻尾巻いて逃げたようです。
彼がなぜ__eqが同一のオブジェクトでも
実行されて欲しかったのかは謎のまま。
64:デフォルトの名無しさん
06/12/02 23:59:37
>>63
そんな事書くとまた出てきちゃうだろ。
JavaのequalsとかC++のoperator==とかは同一オブジェクトでも
呼び出されるから彼の要求が特別に変というわけではない気がする。
まぁ結局は>55なんだが。
65:デフォルトの名無しさん
06/12/03 01:11:57
別になんか要求してるわけじゃないよ
挙動が気に入らなきゃvm書き換えりゃいいだけの話なんだし
66:デフォルトの名無しさん
06/12/05 12:29:24
比較時にログを出力する、という実装は不可能だわな。
それに意味があるかどうかというより、
不可能なことがある、ってのがちょっと気持ち悪いとは思う。
所詮スクリプトなんだし、そこまで求めないけど。
67:デフォルトの名無しさん
06/12/05 13:19:17
>>66
>不可能なことがある、ってのがちょっと気持ち悪いとは思う。
ナポレオン乙
68:デフォルトの名無しさん
06/12/09 08:01:03
luabindの中身見たが、なんだありゃ・・・
さっぱりわけが分からない
69:デフォルトの名無しさん
06/12/09 09:07:09
>>66
オーバーロードが一切出来ない言語できないなw
バカなお前じゃw
70:デフォルトの名無しさん
06/12/09 09:18:34
方言?
71:デフォルトの名無しさん
06/12/09 13:46:11
>>69
>所詮スクリプトなんだし、そこまで求めないけど。
ちゃんと読めよ。
72:デフォルトの名無しさん
06/12/09 18:38:16
>>71
アホかお前。お前がちゃんと読めよ。
>所詮スクリプトなんだし、そこまで求めないけど。
スクリプトじゃなければ、そこまで求めるんだろうが。
スクリプトじゃなくて、オーバーロードできない言語だと、不可能だらけ。
アホな66は使えません。
73:デフォルトの名無しさん
06/12/09 19:09:10
__eqが同一のオブジェクトでも実行されて欲しいケースなんてない、
という雰囲気にひとつ例を出したに過ぎない66に対して、
72の粘着っぷりは異常。
74:デフォルトの名無しさん
06/12/09 19:49:33
72の粘着っぷりが怖いよ。
なんかよほど言い負けた感を持ったらしいとしか思えん、何が原因かは不明だが。
75:デフォルトの名無しさん
06/12/10 18:35:05
「粘着っぷりが怖い」という粘着ぶりが怖いw
76:デフォルトの名無しさん
06/12/10 19:08:12
ほら粘着とか呼んじゃうからムキになってるじゃないか。
スルーしとけばよかったのに。
77:デフォルトの名無しさん
06/12/12 18:59:03
Lua以外の(軽量組込み系)言語の話はとんとご無沙汰な件について
もうLuaで鉄板?
78:デフォルトの名無しさん
06/12/13 01:25:31
squirrel推したいけど比較するのにluaの変なとこを引き合いにだすと粘着されそうなんでやめときますね
79:デフォルトの名無しさん
06/12/13 11:43:37
>>78
どんなものかを知るためにぜひやってほしいにょ
80:デフォルトの名無しさん
06/12/13 19:41:44
>>78
俺もsquirrelを推したいけど別にLuaの変なとこを指摘することもないな
むしろLuaのほうが環境整ってるせいでsquirrelのほうが使いづらい感が…
81:デフォルトの名無しさん
06/12/14 02:02:30
>>80
”環境”って日本語ドキュメント?binder?eclipseのplugin?
各apiを実行するとどういう風にstackがアクセスされるのかのきちんとした仕様の明示はほしい
これは外人もいってたけど
82:デフォルトの名無しさん
06/12/14 08:23:13
>>81
前も書いたけどluabindのあるなしの問題
stackなんか考えるのだるいじゃん
83:デフォルトの名無しさん
06/12/14 09:06:07
squirrelならscriptで使うクラス等の型はscriptで書いてそれを最初にdofileさせるだけだよ
データの送受はインスタンスや配列の中身を直接アクセスするだけで大抵すんじゃうし
native closureの初期下時の組み込みとnative closure内での引数取得と
script側のclosureをcallするとき引数を積むくらいだよstack使うのなんて
実際必要ないからbinderが発達しないんだと思う
84:デフォルトの名無しさん
06/12/16 10:08:48
squirrelをざっと眺めてみたけど、Cと文法が近かったりビット演算が
標準だったり"++"と"+="があったり、いいかも。
ただ、配列とテーブルが違ったり、ジェネレーターとコルーチンが
違ったり、Luaに比べてやや複雑か。気になったのは、
・Luaだとtbl.abcとtbl["abc"]は同じ意味だけどsquirrelでも
同じ方法はある?
・classとtableの関係は?
・参照カウンタ+GCの意味は循環参照検出にGCを使うという意味?
パフォーマンスにはどんな影響が?
あたりか。
85:デフォルトの名無しさん
06/12/16 14:23:14
>・Luaだとtbl.abcとtbl["abc"]は同じ意味だけどsquirrelでも
できるよー
>・classとtableの関係は?
ハッシュテーブルの基盤を使ってclassが作られてるようなかんじ?
>・参照カウンタ+GCの意味は循環参照検出にGCを使うという意味?
そうみたい。
でもまともに書いてれば循環参照なんてありえんし
コンパイルオプションで参照カウンタオンリーにしてしまえ
86:デフォルトの名無しさん
06/12/17 14:35:45
squirrelのgeneratorはjump使ったトリック、threadはvmのstate切り替え
luaのcoroutineはどうなってるの?
87:デフォルトの名無しさん
06/12/18 00:25:35
>>86
state切り替え
coroutine.create()から呼ばれるluaE_newthread()見れば、新しいlua_State作ってるのがわかる
88:デフォルトの名無しさん
07/01/01 20:05:52
squirrelはC++だから流行らないとみた。
89:デフォルトの名無しさん
07/01/02 02:35:20
今のところ他人のコードを見たくない言語ナンバーワンだ・・・
90:デフォルトの名無しさん
07/01/02 08:20:31
Cは記号に頼りすぎ。
91:デフォルトの名無しさん
07/01/05 04:39:10
>89
俺はbrainf*ckだな
92:デフォルトの名無しさん
07/01/05 15:18:31
>>91
まず見ることがないじゃないかw
93:デフォルトの名無しさん
07/01/09 00:18:29
なあ、すごく基本的なこと聞いていい?
最近Luaを知って調べ始めたんだが、自作プログラムの外部スクリプトとして
Luaを組み込む方法が全然見つからないんだが、どこへ行けば詳しく書いてるだろうか?
94:デフォルトの名無しさん
07/01/09 00:36:49
>>93
ソースに付属しているインタープリタみれば一発じゃん。
95:デフォルトの名無しさん
07/01/09 00:56:16
>>94
すまん、ソースダウンロードしてみたがさっぱりわからなかった。
Boostとかだと、〜をinlcudeしろ、〜.libのあるところにパスを通せ、といった記述があるのだが、
そういうのが全然見当たらないんだが・・・
96:デフォルトの名無しさん
07/01/09 01:03:26
「lua embed」でググレ
97:デフォルトの名無しさん
07/01/09 01:17:19
>>96
d!
やっと解説してるところが見つかった。
98:デフォルトの名無しさん
07/01/09 19:59:01
>>97
で、どこにあったの?
99:デフォルトの名無しさん
07/01/10 00:14:33
>>98
URLリンク(www.codeproject.com)
ただ、ビルドはできたが読み込む際のluaopen_ioで落ちる。
ちょっと作業する時間なかったので、原因はまだ調べてない。
100:デフォルトの名無しさん
07/01/10 20:07:13
The Pawn language
URLリンク(www.compuphase.com)
だれも使ってなさそうな、組み込み言語
101:デフォルトの名無しさん
07/01/11 22:24:14
ゲーム用のスクリプトを探していて、最近Luaを触り始めた者です。
質問なんですが、C++側でlua_Stateをいくつか作ったとき、そのlua_State間で
C++の関数を通じてテーブルの参照渡しをすることはできますか?
どうも値渡しならスタックを再帰でゴリゴリやってできそうな感じですが…。
102:デフォルトの名無しさん
07/01/12 18:30:38
>>101
lua_xmove かレジストリで良いのかな?
103:デフォルトの名無しさん
07/01/12 22:49:52
>>102
lua_xmoveもレジストリも同じglobal stateのスレッド同士じゃないとだめ。
104:101
07/01/13 17:04:49
ご回答どうもです。
もう少し方法を考えてみようと思います。
ありがとうございました。
105:デフォルトの名無しさん
07/01/24 14:39:15
ROのほむのAIがLuaで記述できるので触っただけです。
別にLuaが好きなわけじゃないんだからね!
106:デフォルトの名無しさん
07/01/26 13:07:45
帰値がdoubleなのはヘッダいじるとして
cdeclなのが気に食わないのはどうしたらいいものか...
107:デフォルトの名無しさん
07/02/08 05:10:19
部分文字列ってどうやって取得するの?今は
string.char(string.byte(str, x, y))
としてるんだけど、これであってるのかなあ。
Lua 2日目の初心者です。
108:デフォルトの名無しさん
07/02/09 06:24:11
なぜstring.subを使わない
109:デフォルトの名無しさん
07/02/09 16:26:00
最近ゲーム内スクリプトに使われることが多いのかな?
110:デフォルトの名無しさん
07/02/09 17:56:11
>109
昔からいっぱい使われてるじゃないか。
111:デフォルトの名無しさん
07/02/09 17:56:42
つっても2年くらいだけどさ
112:デフォルトの名無しさん
07/02/10 04:55:56
>>108
string.subはstring.gsubとおなじで文字列置換だと思ってた。
正直すまんかった。
113:デフォルトの名無しさん
07/02/10 13:23:01
homeworldはこれ使ってるね
114:デフォルトの名無しさん
07/02/10 21:12:44
>>113
FarCryもつかってたな
115:デフォルトの名無しさん
07/02/11 06:31:15
Homeworldで検索したら凄いなこれ・・・
日本人よ、アニメ絵ゲームで萌えてる場合じゃないぞ!
116:デフォルトの名無しさん
07/02/11 14:37:36
EVE onlineもすごいぞ
今検索したら日本語版も出そうだな。
URLリンク(www.4gamer.net)
stackless pythonをサーバー側・クライアント側ともに使ってるらしい。
117:デフォルトの名無しさん
07/02/16 22:15:17
NullLogic Embedded Scripting Language
URLリンク(sourceforge.net)
118:デフォルトの名無しさん
07/02/17 00:54:05
getfenvってlocal変数は取得できないのって不便だな。
function f1(e)
setfenv(1,e) ;print(a)
end
function f2(f)
local a=123 ;f(getfenv(1))
end
f2(f1)
で123が表示されてほしいんだけど。
debug.getlocalとか使えばなんとかなるんだろうけど。
getlocalとgetupvalueだけ何でdebug扱いなんだろう。
速度?
119:デフォルトの名無しさん
07/02/17 12:23:25
あげとこう
120:118
07/02/21 21:35:09
ぅぅ、誰もいないのか? or どうでもいい話題?
これが出来ないとf1への引数指定をするしかないよね。
f2のローカル変数が増えて且つf1でそれを使う場合
f1の引数宣言をどんどん追加する羽目になるんだよなー。
Cのマクロ展開的に気楽に処理をまとめようとする時
>>118見たいに出来ると便利なんだけど。
-------
話変わるけど、luabind使って
a=luabind_class_a() --luabindで定義したクラス生成
b=luabind_class_b() --luabindで定義したクラス生成
a.p=b ; b.p=a
a=nil ; b=nil
collectgarbage("collect")
ってやっても回収されないような気がする。
(pはluabindでdef_readwrite指定してない)
循環さえしてなければ回収されるっぽい。
そもそもdef_readwrite指定してpに代入すること
自体がまずいのかな?
luabind使ってる人、意見ヨロ。
121:118
07/02/21 21:38:11
修正
そもそもdef_readwrite指定してpに代入すること
=> そもそもdef_readwrite指定してないpに代入すること
122:118
07/02/21 21:43:47
更に追記
118は最初f1をf2のローカル関数にしてたけど他でも参照しようとして
外部に出した時の話です。
123:デフォルトの名無しさん
07/02/21 22:08:28
luaさわったことないが、luaでは環境=テーブルなんだし
print(e.a)じゃだめなの?もしくはgetfenv(f2)ではどうなる?
getfenv(1)というのがわからんな。ソース読んだ方が早い
124:118
07/02/21 22:13:40
>>123
print(e.a)でも駄目。
getfenv(f2)もgetfenv(1)もf2内では
同じ意味(のはず)です。
125:118
07/02/21 22:20:39
function f1(e)
setfenv(1,e) ;print(a)
end
function f2(f)
setfenv(1,setmetatable({},{__index=_G}))
a=123 ;f(getfenv(1))
end
f2(f1)
これなら動くんだけどねぇ。
126:デフォルトの名無しさん
07/02/21 23:20:32
>>118
すまん。見てたが良くわからないから
偉い人が降臨するのを待った方がいいと思った。
でもローカル変数はenvironmentが持ってるわけじゃないし
(Function Prototypeが持ってるぽい)
他の関数はスコープの外だから無理だと思うよ。
table:functionの形式にしてselfに持たせるのはどう?
127:118
07/02/22 00:27:58
>>126
いえいえ半分愚痴なんで。
たとえば>>118を以下の様に書き換えると
a=456
function f1(e)
setfenv(1,e) ;print(a) -- 123が表示
end
function f2(f)
--ここからシンタックスシュガー
local org_env=getfenv(1)
local local_env={}
setfenv(1,setmetatable(local_env,{__index=org_env}))
--ここまでシンタックスシュガー
-- aはローカル
a=124
f(local_env)
-- print($a) グローバルなaを表示 =>
print(org_env["a"]) -- 456が表示
end
f2(f1)
print(a) -- 456が表示
関数先頭でローカル環境設定して
むしろlocalが指定されていないときをlocal変数
と解釈し、Rubyみたく$a見たいに記述された時を
グローバル変数と解釈するほうが安全なようなきがする。
関数内でlocal宣言し忘れてうっかりグローバル汚す
心配もないし。
128:118
07/02/22 02:37:14
なんか一人で書き込んでるな (orz
luabindのほうが大問題に思えてきた
class 'abc'
function abc:__init(name) self.name=name ; print("initialize:"..self.name) end
function abc:__finalize() print("finalize:"..self.name) end
a=abc("1")
b=abc("2")
a.p=b;b.p=a --循環
a=nil;b=nil
collectgarbage("collect")
これも__finalizeが呼ばれない模様
上記コードのaもbもuserdataで多分GCがuserdata内部で
持ってる参照を追ってないためリークしてるのではと
予想してみたけど、どうでしょ。
129:デフォルトの名無しさん
07/02/22 12:27:46
luabindはboostまわりで環境(バージョン)依存するし、tolua++使ってるわ。
>>118で何を実現したかったのか見えなかったんだけど、
setfenvとかはあくまでグローバルテーブルが取れるだけだし、
localとupvalueが取れないのは仕様上しょうがない・・・。
debugライブラリ使ってもいいけど、安全上の問題が・・・とかマニュアルに書いてある。
んで、今luaのソースちょっと見てみたら、
ローカル変数は数値インデックスで管理されてて、テーブルになってない。
バイトコード上ではほぼ名前は省かれてて、「このインデックスのローカルにこのインデックスのローカルを代入」みたいな
処理になってると思われる。
グローバル変数をlocalに代入してから処理したほうが高速、といわれるのはこういう理由なのね。
グローバル汚す可能性についてはグローバルのメタテーブルの__newindexをいじくって
制限をつければいいと思う。
130:118
07/02/22 19:38:37
>>129
tolua++ってコードジェネレーター系ですよね。
tolua++て>>128みたいなことって出来ます?例えば
a=ABC:new()
b=ABC:new()
a.p=b;b.p=a --aとbで循環参照させる。
a=nil;b=nil
collectgarbage("collect")
出来るとしたら、これでC++側のABCの実体のデストラクタ
って呼ばれます?
>グローバル汚す可能性についてはグローバルのメタテーブルの__newindexをいじくって
誰かがそんなことやってましたね。
131:デフォルトの名無しさん
07/02/23 03:51:29
>>130
newしたものを普通のテーブルと同じように扱ってるところに問題がない?
userdataの可能性が高いし、そのままメンバー追加してどうなるかはluabindの実装によるかも。
tolua++では、new()で生成すると手動でdeleteが必要。
new_local()または クラス名() で生成すればガベコレに任せる。
local a=TestClass()
local b=TestClass()
local ax = { p = a }
local bx = { p = b }
a=nil;b=nil
ax=nil;bx=nil
collectgarbage(0)
これならちゃんと回収されてる。(Lua5.0の場合)
132:118
07/02/24 00:04:45
>>130
てゆうか、それ循環してないし。
例え循環させても、テーブルは循環してても当然回収されるので
>>130みたくラッピングすればluabindでも当然回収される。
>>userdataの可能性が高いし、そのままメンバー追加してどうなるかはluabindの実装によるかも。
luabind的にはuserdataだけど一応メタテーブル設定して大丈夫になっています。
>>128にも書いたけど、おそらくuserdataからそれに関連づけされた
luaオブジェクトへの参照をGCが追跡できて無いのでリークしてると思う。
5.0ではuserdataに環境は設定できないけど5.1では出来るようになって
いる。5.1でそうした理由は多分”userdata->その環境table”のパス
をGCでおえるようにして循環参照を検出して回収可能にする為だと思います。
(ぐぐったらそれっぽい議論がされてる。)
おそらくluabindが5.1に対応しきれてないのではと予想して対策を検討中。
133:118
07/02/24 00:05:50
まちがえた
>>130では無く>>131です(自分レスしてどうするw)
134:デフォルトの名無しさん
07/02/24 04:44:20
>>132
あ・・・ほんとだぜんぜん循環してないorz
あとLua5.0でもフルユーザーデータにはメタテーブルもてたけどね。
lightuserdataの扱いが変わっただけかと。
問題はメタテーブルの__newindexとかで実際何をやってるかということだけど・・・
135:デフォルトの名無しさん
07/03/10 15:00:02
hoshu
136:デフォルトの名無しさん
07/03/18 02:28:50
Squirrel + SqPlus使ってる人とかっているんかな?
Squirrel側から呼ばせるC++側の関数で
戻り値としてあるクラスのインスタンスをPushするにはどうすればいいんだろう?
137:デフォルトの名無しさん
07/03/29 21:09:52
保守
138:デフォルトの名無しさん
07/04/06 23:54:07
Lua 5.1.2 released.
URLリンク(www.lua.org)
139:デフォルトの名無しさん
07/04/09 14:51:00
Squirrelのプログラムサイズがでかい…
squirrel.libだけで741KBってどうなんですか?
スクリプトエンジンとか組み込むの初めてなので標準的な尺度がいまいちわかりません。
コンパイルかけたファイルしか使わないと考えればいろいろと削れる部分はあるんでしょうけど、
そういう使い方するのが普通なんですかね?
Luaってどのくらいのサイズなんでしょうか?
140:デフォルトの名無しさん
07/04/09 20:17:31
>>139
自分でexe作成して確認してみな。
そっちのが手っ取り早いぞ。
141:デフォルトの名無しさん
07/04/10 09:23:05
>>139
それでかすぎな気がする
デバッグ情報はってない?
あとstdlibとかなしでそのサイズ?
142:139
07/04/10 18:40:41
squirrel.libのサイズが741KBです。
プログラムサイズが小さくなるような最適化設定にしてビルドしたら664KBでした。
両方ともreleaseです。
>>139
一応、プロパティの『デバッグ情報の形式』というところは無効になっています。
143:139
07/04/10 18:42:17
訂正
>>139じゃなくて>>141でした。
144:デフォルトの名無しさん
07/04/10 19:05:16
報告乙
145:デフォルトの名無しさん
07/04/10 19:28:56
にしてもでかすぎる気がする。
Linux/gcc-4.1.2だとストリップ前が403926バイト、後が295940バイト
Linux/gcc-3.3.6だとストリップ前が390954バイト、後が281116バイト
…Luaと比べると非常に大きいな。
146:デフォルトの名無しさん
07/04/10 21:07:09
いや、Luaがすんごい小さいってのもあると思う。
147:デフォルトの名無しさん
07/04/10 21:53:40
CとC++の差が大きいよ。サイズはでかくなるしコンパイル遅いしライブラリ
配布ではバイナリ互換性が怪しくなってない?
GCCのバージョンを揃えないとリンクに失敗するとか(←これ本当?)
PerlもRubyもPythonもPHPもLuaもオールCで書かれているのはその辺の事情
と思う。
FirefoxやOpenOfficeはC++で別に問題ないが、オプソのスクリプトエンジンの
ジャンルはC++は駄目でCが適切らしい.
148:139
07/04/10 22:12:21
いや、
URLリンク(www.wanderer.jp)
ここのサイトの人がコンパイルかけたら270KBくらいだった言ってたり…
VS2005でビルドしてたんですが、gccでメイクしたら450KBでした。
うーん、まだ何かあるのかな?
149:デフォルトの名無しさん
07/04/10 22:25:40
>>147
オープンでも C++ の実装も結構あるよ。
JDK, AVM2, Poly/ML, StrongTalk とか。
俺も C で書いた方が良いと思うけどね。
150:デフォルトの名無しさん
07/04/10 22:44:39
>>149
JDKがC++と判明して、オプソ界では扱いづらいな...と思われてたりして。
151:デフォルトの名無しさん
07/04/10 22:48:23
>>150
昔からソースは公開されていたし、nm すればソース見ないでも C++ だって
分かる人には分かっていたから大丈夫だよ。
152:デフォルトの名無しさん
07/04/10 22:52:18
>>151
あー、そうなんだ。
153:デフォルトの名無しさん
07/04/11 06:46:14
Squirrelって糞だね
154:デフォルトの名無しさん
07/04/11 07:38:08
>>148
VS2005で、SquirrelをDLL化して
Releaseビルド220Kだよ
155:139
07/04/11 13:13:13
>>154
それって『構成の種類』をdllに設定してビルドするってことですか?
たしかにsquirrel.dllが170KBくらいで軽くなっているんですが、
sqstdlib.dllがエラーで作成できない…。このリンクエラーどうしました?
156:139
07/04/11 15:34:58
>>154
libのサイズってコンパイルさせるために必要なデータが入ってるから
dllより重くなるみたいですね。知りませんでした。
実行ファイルのサイズに影響する分のサイズは二つのlibでだいたい270KBくらいなんだと思います。
ありがとうございました。
157:デフォルトの名無しさん
07/04/11 16:46:14
>>147
Rubyは作者が、オブジェクト指向の言語をオブジェクト指向の言語で書きにくいと言ってる。
>>153
どの辺が?
サイズ大きいのは別に害じゃないと思うけど
158:デフォルトの名無しさん
07/04/22 00:44:07
Xtal 復活記念あげ
159:デフォルトの名無しさん
07/04/28 20:45:47
何かネタないの?
160:デフォルトの名無しさん
07/05/08 17:11:31
保守
161:デフォルトの名無しさん
07/05/09 20:26:56
Squirrel - Lua/組み込み系言語 Wiki*
URLリンク(wikiwiki.jp)
Squirrelの参考リンク参考になりました。
サンクス。
162:デフォルトの名無しさん
07/05/13 11:16:32
初歩的なことかもしれないけど
Squirrelで
sq_open使うと
ハンドルされていない例外 : System.TypeLoadException: アセンブリ 'squirreltest, V
ersion=0.0.0.0, Culture=neutral, PublicKeyToken=null' から型 'SQVM' を読み込めま
せん。
at main()
みたいなメッセージでる。調べたけどわからん
助けて
163:デフォルトの名無しさん
07/05/13 11:33:09
すまん自己解決した
なんでこうなるのかよくわからんけど
164:デフォルトの名無しさん
07/05/13 11:41:18
>>163
自己解決したら、解決法をかけとあれほど・・・
165:デフォルトの名無しさん
07/05/13 11:52:47
URLリンク(support.microsoft.com)にのってる
1. MyProject.cpp ファイルに次のコードを含みます。typedef struct _t_Struct *myStruct;
2. 手順 1 で探したコードをの後、次のコードを追加します。 struct _t_Struct
{
};
を書いて
t_Structの部分をSQVMにしたら動いた
プログラム初心者なんで意味がよくわからないし本当に治ってるのかわからないけど
166:デフォルトの名無しさん
07/05/16 15:52:01
squirrel使う人増えれば嬉しいな
今ゲームに組み込んでるのでそこで得た知識をいずれ記事にしてまとめるかも
コードのどこを削るかとか、Windows以外で使うときにメモリ確保部分をどう書き換えるかとか
167:デフォルトの名無しさん
07/05/16 17:29:10
>>166
マジで期待したいです。
168:デフォルトの名無しさん
07/05/16 23:03:00
新言語 Xtalを作る日記
URLリンク(d.hatena.ne.jp)
169:デフォルトの名無しさん
07/05/18 00:35:54
リンク張り逃げだけじゃなく、なにかしらの解説してくれや。
170:デフォルトの名無しさん
07/05/18 20:11:56
>>169
ざっと目を通しただけなので細かいところはわからないけど、
C++への組み込みに使用するとき、スタックを意識せずによいみたい。
残念なのは、ソースがVC依存ぽいところ。
171:デフォルトの名無しさん
07/05/23 03:05:54
>>170
むしろ、レス見てると、gcc依存っぽいが。
172:デフォルトの名無しさん
07/05/23 17:33:52
>>168
xtal-language - Google Code
URLリンク(code.google.com)
こっちを出さないと
173:デフォルトの名無しさん
07/05/23 20:38:36
Cみたいに文字列の先頭から順にアクセスするとかできないんですか?
174:デフォルトの名無しさん
07/05/23 22:20:10
>>173
おまー、mixiのluaコミュでも同じ質問してるだろ
175:デフォルトの名無しさん
07/05/23 22:38:27
別に効率が悪いだけでstring.subでできるでしょ。
176:デフォルトの名無しさん
07/05/23 23:36:38
>>168,172
なんか凄いところで紹介されてるね
■404 Blog Not Found
君は新言語xtalを知っているか?
URLリンク(blog.livedoor.jp)
177:デフォルトの名無しさん
07/05/23 23:59:34
>175
ver5.1使ってるんですけど日本語化パッチが5.02までしかないみたいなんで
sjisに対応できないんですよ。まあ出るのを待ちますか。
178:デフォルトの名無しさん
07/05/24 00:01:39
>>177
自分で改造するんだ!
179:デフォルトの名無しさん
07/05/24 07:36:57
UTF8でいいじゃない
180:デフォルトの名無しさん
07/05/24 14:31:10
>>177
これはどう?
Lua@空想具現化プログラミング
URLリンク(hammm.dw.land.to)
181:デフォルトの名無しさん
07/05/26 21:53:29
誰かlua_qt使ってる人いますか?
182:デフォルトの名無しさん
07/05/26 22:25:11
はい
183:デフォルトの名無しさん
07/05/30 16:12:03
質問です。LuaからOpenGLって使えます?
C++ネイティブからOpenGL使っているところを、一部分のOpenGL関数だけ
Luaから呼びたいんですけど。
184:デフォルトの名無しさん
07/05/30 17:36:39
そういうやつが、どっかにあった気がす
WikiLuaだっけ
185:デフォルトの名無しさん
07/05/30 18:38:34
というか逆に使えないと思う理由は何?
186:デフォルトの名無しさん
07/05/30 19:06:52
俺が昔使ってたやつはまだ大まかな関数しかなかったから、
自分で書いて命令増やしたりしてたな。
HDDと共に吹っ飛んでもう手元にないが。
187:デフォルトの名無しさん
07/06/02 16:37:36
>>147
GCCのABIがかわったのは、C・C++関係ないだろ。
188:デフォルトの名無しさん
07/06/02 16:39:26
>>166
は、どうした?
189:デフォルトの名無しさん
07/06/06 20:10:29
あげる
190:デフォルトの名無しさん
07/06/07 07:23:06
WikiXtalとかないの
191:デフォルトの名無しさん
07/06/07 20:10:15
SquirrelをDLL化して使っている人いませんか?
squirrel.dllを作ろうとするのですが、失敗します・・・
うまくできた人いない?
192:デフォルトの名無しさん
07/06/07 20:21:05
VisualStudio 2005 の、squirrelプロパティで、構成の定義で、
「ダイナミック ライブラリ (.dll)」を選べばいいんですよね?
あれ?あ、できました。
何でできなかったんだろ・・・。
ところで、
sqstdlib は、DLL化できないのですが、これってもしかして、付属のライブラリが使えないことを意味するのでしょうか?
193:191
07/06/07 20:51:45
sqstdlib.dll ビルドできました。
一旦、squirrel プロジェクトで、lib\ に Squirrel.libを吐いておいて、
sqstdlib プロジェクトで、プロパティ→構成プロパティ→リンカ→→入力 で、
..\lib\squirrel.lib をパスに加えたら、コンパイル通りました。
これでいいのかな?
これで上手くいっているのか、わからないのですが、
他言語(Delphi)から、使ってみようと思います。
ああ、ヘッダーかかなきゃ・・・
194:191
07/06/07 20:57:48
squirrel.dll 200K
sq.exe 348K
sqstdlib.dll 348K
なんかサイズが、マズイ気がします。
もしかして、squirrel.dllの中身全部、sqstdlib.dllにも入っちゃってるんでしょうか?
(..\lib\squirrel.libつっこんだんだから当り前か・・・)
別プロジェクト作って、一つのDLLにまとめた方が手っとり早いのですかね?
195:デフォルトの名無しさん
07/06/07 22:39:14
半年ROMってろ
196:デフォルトの名無しさん
07/06/07 23:43:22
スタティックリンクでいいじゃん
197:デフォルトの名無しさん
07/06/07 23:51:10
>>195
ムカッ!!
>>196
C++じゃないから、できないもん・・・
198:デフォルトの名無しさん
07/06/07 23:53:13
>>196
え、あ、もしかして、zlibみたいに、.oでリンクできるかってことか?
できるんかいな・・・
Delphiと、結合となると、BCCもってきていコンパイルか('A`)
どっちにせよだな・・・
199:デフォルトの名無しさん
07/06/08 07:14:40
自分で調べて学習する気がないなら、いくら教えても無駄だ
200:デフォルトの名無しさん
07/06/08 07:50:47
191はがんばってるとおもうけど
201:デフォルトの名無しさん
07/06/08 08:52:20
>>199
ひとつも教えてやってもいないじゃないかw
202:191
07/06/08 17:30:58
squirrel と sqstdlib 合わせて、まとめた squirrel.dll 作れました。
普段、VS.net使わないから、いやに手こずったぜ・・・
作り方は、後でかくぜ
203:191
07/06/08 17:48:50
以下、まとめた squirrel.dll の作り方。
VS.net 2005 proでコンパイルを確認。
squirrel_2.1.1_stable が解凍されているとして、
・squirrel_dll ディレクトリを作る
・squirrel\squirrel.dsp を squirrel_dll ディレクトリにコピーする
・ファイル→追加→既存のプロジェクト で、 squirrel_dll を追加
・プロジェクト名が、squirrel になっているので、squirrel_dll に変更
・squirrel_dll の関連づけられたファイルを一旦全部削除
・プロジェクト → 新しいフィルタ で、フィルタを作って、
ソリューションエクスプローラーで、フィルタ名を squirrel に変更
・ソリューションエクスプローラーで、フィルタ squirrel を選択して、
右クリック→追加→既存の項目 で、..\squirrel ディレクトリ の .h と .cpp を全部追加
・同様に、プロジェクト → 新しいフィルタ で、フィルタを作って、
ソリューションエクスプローラーで、フィルタ名を sqstdlib に変更
・ソリューションエクスプローラーで、フィルタ sqstdlib を選択して、
右クリック→追加→既存の項目 で、..\sqstdlib ディレクトリ の .h と .cpp を全部追加
・プロジェクト→プロパティで、
・構成プロパティ→全般→構成の種類 を、「ダイナミック ライブラリ (.dll)」に設定
・構成プロパティ→全般→出力ディレクトリを、「..\bin」に設定
・構成プロパティ→リンカ→全般→出力ファイルを、「$(OutDir)\squirrel.dll」に設定
・あとは、ビルド→squirrel_dll のビルドで、
bin\ に、348KBの squirrel.dll ができていたら成功ー
面倒なら、フィルタは作らんでもいいけど・・・
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5045日前に更新/210 KB
担当:undef