プログラミング言語 Lua その2
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
NGNG他の人サポ−ト頼む。
前スレ
http://pc2.2ch.net/test/read.cgi/tech/1034182349/l50
本家
http://www.lua.org/
5.0日本語訳
http://www.uri.sakura.ne.jp/~cosmic/yuno/lab/lua5_manual_ja.html
0951デフォルトの名無しさん
2006/10/09(月) 18:03:140952デフォルトの名無しさん
2006/10/09(月) 18:11:310953デフォルトの名無しさん
2006/10/09(月) 18:12:31お前は文が読めないのか???
0954デフォルトの名無しさん
2006/10/09(月) 18:21:030955デフォルトの名無しさん
2006/10/09(月) 18:24:48「スタック使いにくい」と言って独自のラッパーを作る香具師が多い。
ただその後「スタック簡単じゃんラッパいらんな」とAPI直接使うようになる香具師と
スタック使いにくいと言い続ける香具師に別れる。
0956デフォルトの名無しさん
2006/10/09(月) 18:28:22・スタック使いにくいと言い続ける香具師
の例を頼む
というか、お前今の時代に「香具師」って・・・
その超おっさん感をなんとかしろ。
0957デフォルトの名無しさん
2006/10/09(月) 18:29:37全部自分への悪口に見えるのかい?
0958デフォルトの名無しさん
2006/10/09(月) 18:31:38意味不明すぎ
0959デフォルトの名無しさん
2006/10/09(月) 18:36:420960デフォルトの名無しさん
2006/10/09(月) 18:43:170961デフォルトの名無しさん
2006/10/09(月) 18:51:34設定ファイル前処理用Luaを呼び出すのが正解。
スタックが面倒なら、Luaでやれることは全部Luaにやらせようぜ。
0962デフォルトの名無しさん
2006/10/09(月) 19:13:200963デフォルトの名無しさん
2006/10/09(月) 19:15:40自己完結してるな
0964デフォルトの名無しさん
2006/10/09(月) 19:42:130965デフォルトの名無しさん
2006/10/09(月) 20:37:30Struct={}
file_read(Struct,"data.txt")
function file_read(table,file_name)
local get_buf=""
local k=1
local key=0
local v=0
local file_num
file_num=_FOPEN(file_name,"r")
while get_buf==nil do
_FGETS(file_num,get_buf)
for key,v in string.gfind(get_buf, "([%w]+)=([-]?[%w]+)") do
table[k][tonumber(key)]=tonumber(v)
end
k=k+1
end
_FCLOSE(file_num)
end
読み込むデータ
[1]:{[0]=2,[1]=2,[2]=8,[3]=17,[4]=10}
[2]:{[0]=3,[1]=3,[2]=2,[3]=7,[4]=100}
[3]:{[0]=4,[1]=4,[2]=41,[3]=7,[4]=50}
[4]:{[0]=5,[1]=5,[2]=40,[3]=7,[4]=10}
[5]:{[0]=6,[1]=6,[2]=42,[3]=7,[4]=30}
[6]:{[0]=1,[1]=1,[2]=41,[3]=7,[4]=30}
何か俺間違えてる?
0966デフォルトの名無しさん
2006/10/10(火) 15:16:38を繰り返しを使ったコードで書き直してみた。ちょっとごちゃごちゃしているけど。
function rnext2(t, keys)
keys = keys or {}
local k, v
local ks, c = {t}, (#keys > 1) and #keys or 1
for i = 2, c do
ks[i] = ks[i-1][keys[i-1]]
end
k, v = next(ks[c], keys[c])
while (k == nil) and (c > 1) do
ks[c], keys[c], c = nil, nil, c-1
k, v = next(ks[c], keys[c])
end
if k == nil then return nil end
keys[c] = k
while type(v) == 'table' do
k, v = next(v, nil)
keys[#keys+1] = k
end
return keys, v
end
935 だと keys は連結リストだが、こっちは1つのテーブルを配列っぽく使ってる。
0967デフォルトの名無しさん
2006/10/10(火) 18:00:54dofileでチャンクごと読み込むと楽だよな
dofileで読み込むとglobalになるから好ましくないんだっけ?
0968デフォルトの名無しさん
2006/10/10(火) 19:26:50function envdofile(filename)
local c = loadfile(filename)
local e = {}
local m = getmetatable(e) or {}
m.__index = getfenv(c) or _G
setmetatable(e, m)
setfenv(c, e)
return e, c()
end
使い方
-- a.lua
c = envdofile("b.lua")
print(b) -- nil
print(c.b) -- 10
-- b.lua
b = 10
print(b) -- 10
0969デフォルトの名無しさん
2006/10/10(火) 20:24:10LuaGLの存在は知っていますが、LuaからGLUTを呼ぶためのライブラリは既にありますか?
むしろ作るべきですか?
0970デフォルトの名無しさん
2006/10/10(火) 21:19:190971デフォルトの名無しさん
2006/10/10(火) 21:43:250972デフォルトの名無しさん
2006/10/12(木) 07:04:080973デフォルトの名無しさん
2006/10/12(木) 08:24:26io.readAll io.writeAll
io.readCSV io.writeCSV
io.readTab io.writeTab
table.marge table.unmarge
table.dump table.save table.load
stack.dump
があったら便利だと思った。
0974デフォルトの名無しさん
2006/10/12(木) 18:27:250975デフォルトの名無しさん
2006/10/12(木) 20:30:08["document"]["body"]["color"]=256
↓
["document:body:color"]=256
みたいにすればファイルへのセーブ・ファイルからのロードも楽になるが・・・
0976デフォルトの名無しさん
2006/10/12(木) 20:32:030977デフォルトの名無しさん
2006/10/12(木) 21:07:160978table.dumpを書いてみました
2006/10/12(木) 23:18:50table._dump_temp = nil#function lua_table_dump(src, i)# if src == nil@
then return nil end# if i == nil or type(i) == "string" then --"i" i@
s `tag' on top level call# if i == nil then i = "t" end# if type@
(src)=="table" then# table._dump_temp = i .. "={\n"# lua_tab@
le_dump(src, 1)# table._dump_temp = table._dump_temp .. "}\n"# @
local result = table._dump_temp# table._dump_temp = nil# @
return result# else# return nil --illegal arguments# end# @
else --"i" is indent on recursive call# local dst = {}# local in@
dent = string.rep(" ", i)# for k,v in pairs(src) do# if type(@
k) == "number" then k = "[" .. k .. "]" end# if v==table._dump_te@
mp then# --do nothing# elseif type(v)=="table" then# @
table._dump_temp = table._dump_temp .. indent .. k .. "={\n"# @
i = i + 1# lua_table_dump(v,i)# table._dump_temp = tabl@
e._dump_temp .. indent .. "},\n"# elseif type(v)=="string" then# @
table._dump_temp = table._dump_temp .. indent .. k .. "=\"" .. @
v .. "\",\n"# else# table._dump_temp = table._dump_temp ..@
indent .. k .. "=" .. tostring(v) .. ",\n"# end# end# end#end#@
table.dump = lua_table_dump#]],"@\n",""),"#","\n")))
0979978
2006/10/12(木) 23:35:18ちょっと1レスに収まりきらなかったので・・・。
使い方はこんな感じです。
a = {A="A",B={b="b","d"},42} --複雑なテーブル
dump = table.dump(a, "a")
print(dump)
--(ここで dump を save.txt に保存したと仮定)
a = nil
dofile("save.txt") --読み込み
print(table.dump(a, "a"))
変なとこあったら教えてください。
0980デフォルトの名無しさん
2006/10/13(金) 00:00:09a = {A='a'}
a.next = a
みたいな循環構造のテーブルを渡した場合はどうしてる?
0982デフォルトの名無しさん
2006/10/13(金) 14:01:28ワラタ
0983デフォルトの名無しさん
2006/10/13(金) 15:24:080984デフォルトの名無しさん
2006/10/13(金) 17:37:23exception=setmetatable({throw=error},{__newindex=
function(t,k,v)if k=="catch"then xpcall(t.try,v)
else rawset(t,k,v)end end})
exception.try =function()
print("foo")
exception.throw("(^^)")
print("bar") end function
exception.catch(err)
print("error : "..err)
end
0985デフォルトの名無しさん
2006/10/13(金) 19:55:070986デフォルトの名無しさん
2006/10/13(金) 20:26:48考えてみると循環参照やら function、thread、userdata の復元やら、テーブルのシリアライズには
色々と問題がありますね・・・。あと、循環参照でなくても
d = { A="A" }
t = { d, d }
とかいう構造だと、
t = { [1]={ A="A" }, [2]={ A="A" } }
とは等価ではなく、
do
local d001 = { A="A" }
t = { [1]=d001, [2]=d001 }
end
みたいにダンプしてあげないと復元できないし・・・。
0987デフォルトの名無しさん
2006/10/13(金) 22:42:290988デフォルトの名無しさん
2006/10/13(金) 23:08:19NIL
BOOLEAN
FUNCTION
USERDATA
LIGHTUSERDATA
THREAD
の場合はどうしてるんだ?
文字列に変換出来るのだろうか?
0989デフォルトの名無しさん
2006/10/13(金) 23:17:14function each(t)
local cache = {}
local function e(t)
cache[t] = true
local k, v = next(t)
while k do
if cache[v] then
elseif type(v) == "table" then
e(v)
else
coroutine.yield(v)
end
k, v = next(t, k)
end
end
return coroutine.wrap(e), t
end
いちおう動いてるっぽい。
0990デフォルトの名無しさん
2006/10/13(金) 23:42:06error("cannot save a " .. type(value))
だと思う。
0991デフォルトの名無しさん
2006/10/14(土) 00:43:510992デフォルトの名無しさん
2006/10/14(土) 10:08:44使い方は Using: の行を参照。 t={A="a", B="b", [1]="c", [2]="d"} などの文字列数字混在でも可。
--compare many types (over spec...)
function table_lt_event(op1, op2)
local type1, type2 = type(op1), type(op2)
if type1 ~= type2 then --cmp type
return type1 < type2
elseif type1 == "number" and type2 == "number"
or type1 == "string" and type2 == "string" then
return op1 < op2 --default
elseif type1 == "boolean" and type2 == "boolean" then
return op1 == true
else
return tostring(op1) < tostring(op2) --cmp address
end
end
(続く)
0993992
2006/10/14(土) 10:10:14--sorted keys
-- Using: for i, k in pairs(table.keys(t)) do ... end
function lua_table_keys(t)
local keys = {}
for k in pairs(t) do
table.insert(keys, k)
end
table.sort(keys, table_lt_event)
return keys
end
--sorted pairs
-- Using: for k, v in spairs(t) do ... end
function lua_table_spairs(t)
local k = {}
local function e(t)
for i, v in pairs(lua_table_keys(t)) do
coroutine.yield(v, t[v])
end
end
return coroutine.wrap(e), t
end
table.keys = lua_table_keys
spairs = lua_table_spairs -- or table.spairs = lua_table_spairs
0994984
2006/10/14(土) 10:54:05ただしtry-catch-finallyとつなげることはできない
exception=setmetatable({throw=error},{__newindex=
function(t,k,v)if k=="catch"then xpcall(t.try,v)
elseif k=="finally"then(function(e,m,...)v(e,m,
...)if not e then error(m,0)end end)(pcall(t.try))
else rawset(t,k,v)end end})
exception.try =function()
exception.throw("hogehoge") end
exception.finally =function()
print("finally")
end
0995デフォルトの名無しさん
2006/10/14(土) 11:26:26try
try
catch
end
finally
end
とできれば問題ないっす
0996デフォルトの名無しさん
2006/10/14(土) 12:11:290997デフォルトの名無しさん
2006/10/14(土) 12:22:18994のコードを見る限り、それは不可能だぞ。
0998984
2006/10/14(土) 12:27:01exception=setmetatable({throw=error},{__newindex=
function(t,k,v)if k=="catch"then xpcall(t.try,v)
elseif k=="finally"then local m,e e=xpcall(t.try,
function(e)m=e v(false,e)end)if e then v(true)
else error(m,0)end else rawset(t,k,v)end end})
0999デフォルトの名無しさん
2006/10/14(土) 12:44:251000デフォルトの名無しさん
2006/10/14(土) 13:06:3010011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。