function class( t ) t = t or {} t.index = t t.new = new t.copy = copy return t end function new( obj, init ) init = init or {} return metatable( init, obj.index ) end function copy( obj, init ) local newobj = obj:new(init) for n,v in obj do newobj[n] = v end return newobj end function typeof( x ) local tx = type(x) return tx=='table' and metatable(x) or tx end ------------------------------------------------------------------------------ local indented, dumpvisited local indented function indented( level, ... ) write( strrep(' ',level), concat(arg), '\n' ) end local dumpval function dumpval( level, name, value ) local index if type(name,'number') then index = format('[%d] = ',name) elseif type(name,'string') and strfind(name,'^[_%a][_%w]*$') then index = name ..' = ' else index = format('[%q] = ',tostring(name)) end if type(value,'table') then if dumpvisited[value] then indented( level, index, format('ref%q;',dumpvisited[value]) ) else dumpvisited[value] = tostring(value) indented( level, index, '{ -- ', dumpvisited[value] ) for n,v in value do dumpval( level+1, n, v ) end indented( level, '};' ) end else if type(value,'string') then if strlen(value) > 40 then indented( level, index, '[[', value, ']];' ) else indented( level, index, format('%q',value), ';' ) end else indented( level, index, tostring(value), ';' ) end end end function dump( name, value ) dumpvisited = {} dumpval( 0, name, value ) end -- t = { 1,2,3 ; one= 1, two = 'fish', three= 'me', ['4cow'] = 'it' } -- dump( 't', t ) ------------------------------------------------------------------------------ stop = _ERRORMESSAGE local alert, traceinfo, gi, gl, dl = _ALERT function gi( i ) return function() i=i+1 return getinfo(i),i end end function gl( level, j ) return function() j=j+1 return getlocal( level, j ) end end function _ALERT(x) alert(x) traceinfo = {} for ar,i in gi(3) do tinsert( traceinfo, ar ) local names = {} local values = {} for n,v in gl(i,0) do tinsert( names, n ) tinsert( values, v ) end if getn(names) > 0 then ar.lnames = names ar.lvalues = values end end debug() end function dl( level ) local i, ar = 0, traceinfo[ level or 1 ] or {} local names = ar.lnames or {} local values = ar.lvalues or {} return function() i=i+1 return names[i], values[i] end end function locals( level ) for n,v in dl( level ) do dump( n, v ) end end function info() dump( 'traceinfo', traceinfo ) end -- function fun(x,y) local z=x+y stop"now" end -- function run(t) for i=1,2 do fun(i,9) end end