プログラミング言語 Lua その3
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/10/14(土) 13:13:52前々スレ http://pc5.2ch.net/tech/kako/1034/10341/1034182349.html
前スレ http://pc8.2ch.net/test/read.cgi/tech/1063711237/
本家 http://www.lua.org/
lua-users http://lua-users.org/
LuaForge http://luaforge.net/
Lua 5.1 リファレンスマニュアル(日本語訳)
http://sugarpot.sakura.ne.jp/yuno/html/lua51_manual_ja.html
0002デフォルトの名無しさん
2006/10/14(土) 13:18:27/ =.\
// ̄\ .\
/| |へノ⌒| //\
\ \_// .\
\ = / \
\/ \
∧∧∧∧\
( `/) >ヽ∧
/ / / `∀> ∧∧
◇( イ◇ ( ,つ`∀´>
/ヽ )) ヽ )ヽ )と , イ
(_/(_/(_/(_/ノ(_/⊂ノ> )J
/ ̄Y ̄`|/ ̄^Y ̄ヽ/ ̄ ̄Y `´ ̄\
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
このスレはキムチ軍の奇襲により占領されました
0003デフォルトの名無しさん
2006/10/14(土) 13:28:44でも、ここのtable.clone関数は浅いコピーしかやってくれない模様。
色々と不足してるっぽいし、パッチとか投げたら喜ばれるのやもしれず……。
0004デフォルトの名無しさん
2006/10/14(土) 13:31:55ちょw
0005デフォルトの名無しさん
2006/10/15(日) 00:39:00実際のゲームとかphotoshopとかに組み込まれている奴って
テーブル関係の関数をどういう風に実装してんのかな
0006デフォルトの名無しさん
2006/10/15(日) 12:16:50とりあえず保守を兼ねて思いついたことを書くと、テーブルを書き出す前に
まず_Gとかを再帰的に舐めて関数テーブルを自力で作れば、関数名も書き出せて
復元できるようになるのでは?と思った。まだ試してないけど。
0007デフォルトの名無しさん
2006/10/15(日) 20:38:34面白いな
テクニックとか盗めるし
0008デフォルトの名無しさん
2006/10/16(月) 13:09:03見つけたけど、誰か使っている人いる?
ttp://www.gentee.com/index.htm
0009デフォルトの名無しさん
2006/10/16(月) 18:33:32消えうせろ
>>8
タイトルをよく読め
0010デフォルトの名無しさん
2006/10/16(月) 20:55:10ここはLuaだけじゃなくて、LightWeight全般もサブで取り扱うスレです。
前スレをよく読め
0011デフォルトの名無しさん
2006/10/16(月) 22:17:34あとせっかく立ててくれたまとめWikiを忘れたらだめだよ。
[関連]
Lua/組み込み系言語 Wiki*
http://wikiwiki.jp/lua/
0012デフォルトの名無しさん
2006/10/16(月) 23:13:17余力があったらソースを解説したらいいんじゃないの
0013デフォルトの名無しさん
2006/10/17(火) 18:57:43そのWikiってこのスレのまとめWikiだったのか!
0014デフォルトの名無しさん
2006/10/17(火) 19:24:210015デフォルトの名無しさん
2006/10/17(火) 20:01:310016デフォルトの名無しさん
2006/10/17(火) 23:43:190017デフォルトの名無しさん
2006/10/19(木) 07:28:170018デフォルトの名無しさん
2006/10/19(木) 20:08:410019デフォルトの名無しさん
2006/10/19(木) 20:33:56function 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)
0020デフォルトの名無しさん
2006/10/19(木) 21:26:060021デフォルトの名無しさん
2006/10/19(木) 22:55:08Programming in Lua の2版には、確か ... ではなく arg の方を使えって書いてあったような気がした。
0022デフォルトの名無しさん
2006/10/21(土) 23:36:500023デフォルトの名無しさん
2006/10/22(日) 22:46:38置換する関数が標準であればいいのに
Luaのgsubは使い方が判りづらくてウンコだ
0024デフォルトの名無しさん
2006/10/24(火) 19:13:220025デフォルトの名無しさん
2006/10/24(火) 22:39:440026デフォルトの名無しさん
2006/10/25(水) 22:01:410027デフォルトの名無しさん
2006/10/26(木) 07:11:130028デフォルトの名無しさん
2006/10/27(金) 07:35:230029デフォルトの名無しさん
2006/10/29(日) 20:30:040030デフォルトの名無しさん
2006/10/30(月) 18:50:040031デフォルトの名無しさん
2006/10/30(月) 19:51:42luaL_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
0032デフォルトの名無しさん
2006/11/01(水) 06:24:320033デフォルトの名無しさん
2006/11/02(木) 18:54:59↑の人が実装する
0034デフォルトの名無しさん
2006/11/07(火) 01:36:18というテーブルがあって、
temp[2]で200を取得することって出来ない?
0035デフォルトの名無しさん
2006/11/07(火) 14:23:55temp[2]は'aaa'になる。
嫌なら
temp[2] = temp.x みたいにするとか。
0036デフォルトの名無しさん
2006/11/07(火) 19:59:45循環参照にも対応してるはず。
テーブルを渡すとそのテーブルを復元するコードを返す。
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")))
003736
2006/11/08(水) 17:21:17print((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")))
003836
2006/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はもちろん対応してない
0039デフォルトの名無しさん
2006/11/08(水) 19:47:35lua_resumeを呼んで帰ってきたときに、それまでスタックに積んでいたものが見事に
なくなります。lua_call系では消えずに残っているようですが…仕様なのかバグなのか。
マニュアルに書いてあるlua_resumeを使うときはlua_newthreadで新しくスレッドを
作ってから使えっていうのはこういうことなのですね…。
0040デフォルトの名無しさん
2006/11/10(金) 18:38:07うpろだ使えよ
0041デフォルトの名無しさん
2006/11/23(木) 12:09:360042デフォルトの名無しさん
2006/11/23(木) 13:52:08lua_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 って出る。
初っ端から駄目駄目な俺に誰か助言をくれ〜
0043デフォルトの名無しさん
2006/11/23(木) 14:09:21残念!
0044デフォルトの名無しさん
2006/11/23(木) 14:57:13FAQ
loadstringは評価しない。callしる。
0046デフォルトの名無しさん
2006/12/01(金) 04:10:140047デフォルトの名無しさん
2006/12/02(土) 01:21:16そう定義されてるから仕方が無い
0048デフォルトの名無しさん
2006/12/02(土) 03:19:41この挙動は真っ当ではないと思わないか
0049デフォルトの名無しさん
2006/12/02(土) 03:38:02むしろ"=="の意味からいったら真っ当な気さえする。
演算子をつかってboost.spirit並みの拡張をしたい
というなら話はべつだが。
0050デフォルトの名無しさん
2006/12/02(土) 03:59:33意味的な意味で
>むしろ"=="の意味からいったら真っ当な気さえする。
__eqよんだ上で返値を無視すりゃいいじゃん
0051デフォルトの名無しさん
2006/12/02(土) 13:39:17いいんじゃん。単に言語設計上のポリシーの問題では?
>__eqよんだ上で返値を無視すりゃいいじゃん
無視するぐらいなら、呼ばなきゃいいじゃん
0052デフォルトの名無しさん
2006/12/02(土) 13:55:08別にいいと思う。それより
意味的な意味で ← この日本語がどうかと思う。意味がわからん。
0053デフォルトの名無しさん
2006/12/02(土) 14:52:21スクリプト実行時にその時比較される値によって実行されたりされなかったりするんだよ?
その上で「まぁべつにいいんじゃねヽ(´ー`)ノ」という意味でいいって言ってるんだよね?
だから処世術なんてききたくないっていってんだよばかばかまんこ
0054デフォルトの名無しさん
2006/12/02(土) 16:00:59という設計思想なんでしょ。
不必要なことはしないというだけで、別に不完全とは思わないなあ。
0055デフォルトの名無しさん
2006/12/02(土) 17:13:580056デフォルトの名無しさん
2006/12/02(土) 17:16:18定義をしてくれ
言語設計ポリシーの結果として選択された仕様を
完全か否かなんて議論はきわめて不毛だし。
0057デフォルトの名無しさん
2006/12/02(土) 17:17:14仮にそういう設計思想なんだとして、だったら__eqなんて作らせないでしょ?
0058デフォルトの名無しさん
2006/12/02(土) 17:18:58>スクリプト実行時にその時比較される値によって実行されたりされなかったりするんだよ?
で、何が困るの?
困ることが無いなら、比較速度がかなり速くなる分、
いまの実装の方が完全なんだけど。
わかる?お前定義の「完全な言語」なんてどうでいいんだよアホ。
0059デフォルトの名無しさん
2006/12/02(土) 17:20:22はぁ?バカか?
お前__eqの意味すら理解してないんじゃないのか?
0060デフォルトの名無しさん
2006/12/02(土) 17:23:070061デフォルトの名無しさん
2006/12/02(土) 17:24:49君らばかだなホント
0062デフォルトの名無しさん
2006/12/02(土) 17:34:220063デフォルトの名無しさん
2006/12/02(土) 22:46:40彼がなぜ__eqが同一のオブジェクトでも
実行されて欲しかったのかは謎のまま。
0064デフォルトの名無しさん
2006/12/02(土) 23:59:37そんな事書くとまた出てきちゃうだろ。
JavaのequalsとかC++のoperator==とかは同一オブジェクトでも
呼び出されるから彼の要求が特別に変というわけではない気がする。
まぁ結局は>55なんだが。
0065デフォルトの名無しさん
2006/12/03(日) 01:11:57挙動が気に入らなきゃvm書き換えりゃいいだけの話なんだし
0066デフォルトの名無しさん
2006/12/05(火) 12:29:24それに意味があるかどうかというより、
不可能なことがある、ってのがちょっと気持ち悪いとは思う。
所詮スクリプトなんだし、そこまで求めないけど。
0067デフォルトの名無しさん
2006/12/05(火) 13:19:17>不可能なことがある、ってのがちょっと気持ち悪いとは思う。
ナポレオン乙
0068デフォルトの名無しさん
2006/12/09(土) 08:01:03さっぱりわけが分からない
0069デフォルトの名無しさん
2006/12/09(土) 09:07:09オーバーロードが一切出来ない言語できないなw
バカなお前じゃw
0070デフォルトの名無しさん
2006/12/09(土) 09:18:340071デフォルトの名無しさん
2006/12/09(土) 13:46:11>所詮スクリプトなんだし、そこまで求めないけど。
ちゃんと読めよ。
0072デフォルトの名無しさん
2006/12/09(土) 18:38:16アホかお前。お前がちゃんと読めよ。
>所詮スクリプトなんだし、そこまで求めないけど。
スクリプトじゃなければ、そこまで求めるんだろうが。
スクリプトじゃなくて、オーバーロードできない言語だと、不可能だらけ。
アホな66は使えません。
0073デフォルトの名無しさん
2006/12/09(土) 19:09:10という雰囲気にひとつ例を出したに過ぎない66に対して、
72の粘着っぷりは異常。
0074デフォルトの名無しさん
2006/12/09(土) 19:49:33なんかよほど言い負けた感を持ったらしいとしか思えん、何が原因かは不明だが。
0075デフォルトの名無しさん
2006/12/10(日) 18:35:050076デフォルトの名無しさん
2006/12/10(日) 19:08:12スルーしとけばよかったのに。
0077デフォルトの名無しさん
2006/12/12(火) 18:59:03もうLuaで鉄板?
0078デフォルトの名無しさん
2006/12/13(水) 01:25:310079デフォルトの名無しさん
2006/12/13(水) 11:43:37どんなものかを知るためにぜひやってほしいにょ
0080デフォルトの名無しさん
2006/12/13(水) 19:41:44俺もsquirrelを推したいけど別にLuaの変なとこを指摘することもないな
むしろLuaのほうが環境整ってるせいでsquirrelのほうが使いづらい感が…
0081デフォルトの名無しさん
2006/12/14(木) 02:02:30”環境”って日本語ドキュメント?binder?eclipseのplugin?
各apiを実行するとどういう風にstackがアクセスされるのかのきちんとした仕様の明示はほしい
これは外人もいってたけど
0082デフォルトの名無しさん
2006/12/14(木) 08:23:13前も書いたけどluabindのあるなしの問題
stackなんか考えるのだるいじゃん
0083デフォルトの名無しさん
2006/12/14(木) 09:06:07データの送受はインスタンスや配列の中身を直接アクセスするだけで大抵すんじゃうし
native closureの初期下時の組み込みとnative closure内での引数取得と
script側のclosureをcallするとき引数を積むくらいだよstack使うのなんて
実際必要ないからbinderが発達しないんだと思う
0084デフォルトの名無しさん
2006/12/16(土) 10:08:48標準だったり"++"と"+="があったり、いいかも。
ただ、配列とテーブルが違ったり、ジェネレーターとコルーチンが
違ったり、Luaに比べてやや複雑か。気になったのは、
・Luaだとtbl.abcとtbl["abc"]は同じ意味だけどsquirrelでも
同じ方法はある?
・classとtableの関係は?
・参照カウンタ+GCの意味は循環参照検出にGCを使うという意味?
パフォーマンスにはどんな影響が?
あたりか。
0085デフォルトの名無しさん
2006/12/16(土) 14:23:14できるよー
>・classとtableの関係は?
ハッシュテーブルの基盤を使ってclassが作られてるようなかんじ?
>・参照カウンタ+GCの意味は循環参照検出にGCを使うという意味?
そうみたい。
でもまともに書いてれば循環参照なんてありえんし
コンパイルオプションで参照カウンタオンリーにしてしまえ
0086デフォルトの名無しさん
2006/12/17(日) 14:35:45luaのcoroutineはどうなってるの?
0087デフォルトの名無しさん
2006/12/18(月) 00:25:35state切り替え
coroutine.create()から呼ばれるluaE_newthread()見れば、新しいlua_State作ってるのがわかる
0088デフォルトの名無しさん
2007/01/01(月) 20:05:520089デフォルトの名無しさん
2007/01/02(火) 02:35:200090デフォルトの名無しさん
2007/01/02(火) 08:20:310091デフォルトの名無しさん
2007/01/05(金) 04:39:10俺はbrainf*ckだな
0092デフォルトの名無しさん
2007/01/05(金) 15:18:31まず見ることがないじゃないかw
0093デフォルトの名無しさん
2007/01/09(火) 00:18:29最近Luaを知って調べ始めたんだが、自作プログラムの外部スクリプトとして
Luaを組み込む方法が全然見つからないんだが、どこへ行けば詳しく書いてるだろうか?
0094デフォルトの名無しさん
2007/01/09(火) 00:36:49ソースに付属しているインタープリタみれば一発じゃん。
0095デフォルトの名無しさん
2007/01/09(火) 00:56:16すまん、ソースダウンロードしてみたがさっぱりわからなかった。
Boostとかだと、〜をinlcudeしろ、〜.libのあるところにパスを通せ、といった記述があるのだが、
そういうのが全然見当たらないんだが・・・
0096デフォルトの名無しさん
2007/01/09(火) 01:03:260097デフォルトの名無しさん
2007/01/09(火) 01:17:19d!
やっと解説してるところが見つかった。
0098デフォルトの名無しさん
2007/01/09(火) 19:59:01で、どこにあったの?
0099デフォルトの名無しさん
2007/01/10(水) 00:14:33http://www.codeproject.com/cpp/luaincpp.asp
ただ、ビルドはできたが読み込む際のluaopen_ioで落ちる。
ちょっと作業する時間なかったので、原因はまだ調べてない。
0100デフォルトの名無しさん
2007/01/10(水) 20:07:13http://www.compuphase.com/pawn/pawn.htm
だれも使ってなさそうな、組み込み言語
0101デフォルトの名無しさん
2007/01/11(木) 22:24:14質問なんですが、C++側でlua_Stateをいくつか作ったとき、そのlua_State間で
C++の関数を通じてテーブルの参照渡しをすることはできますか?
どうも値渡しならスタックを再帰でゴリゴリやってできそうな感じですが…。
■ このスレッドは過去ログ倉庫に格納されています