Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- This file:
--   http://anggtwu.net/LUA/tos2.lua.html
--   http://anggtwu.net/LUA/tos2.lua
--          (find-angg "LUA/tos2.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- My is one of my oldest implementations of a "tostring" for Lua that
-- could pretty-print tables. Note the "tos_images" and the "tos_keys"!
--   Based on:  (find-angg "LUA/tos.lua")
--   See also:  (find-angg "LUA/lua50init.lua" "Tos")
--              (find-angg "LUA/lua50init.lua" "mytostring")
--              (find-dn5 "tos.lua")
--
-- (defun e () (interactive) (find-angg "LUA/tos2.lua"))

tos = function (o) tos_images = {}; return tos_image(o) end
tos_images = {}
tos_image  = function (o)
    if tos_images[o] then return tos_images[o] end
    if o == nil then return "nil" end
    tos_images[o] = tos_calc(o)
    return tos_images[o]
  end
tos_calc = function (o)
    local t = type(o)
    if t == "number" then return tos_number(o) end
    if t == "string" then return tos_string(o) end
    if t == "table"  then return tos_table(o)  end
    if t == "nil" or t == "boolean" then return tostring(o) end
    return tos_other(o)
  end
tos_number = function (n) return tostring(n) end
tos_string = function (s) return string.format("%q", s) end
tos_other  = function (o) return "<"..tostring(o)..">" end

tos_table = function (tbl) return "{"..tos_table_body(tbl).."}" end
tos_table_body = function (tbl, sep)
    local keys = tos_keys(tbl)
    local images = {}
    for _,key in ipairs(keys) do
      table.insert(images, tos_key_value_pair(key, tbl[key]))
    end
    return table.concat(images, sep or ", ")
  end
tos_key_value_pair = function (k, v)
    return tos_image(k).."="..tos_image(v)
  end
tos_compare = function (o1, o2) return tos_image(o1) < tos_timage(o2) end
tos_keys = function (tbl)
    local keys = {number={}, string={}, table={}, other={}}
    for key,_ in pairs(tbl) do
      table.insert(keys[type(key)] or keys.other, key)
    end
    table.sort(keys.number)
    table.sort(keys.string)
    table.sort(keys.table, tos_compare)
    table.sort(keys.other, tos_compare)
    local allkeys = {}
    for _,k in ipairs(keys.number) do table.insert(allkeys, k) end
    for _,k in ipairs(keys.string) do table.insert(allkeys, k) end
    for _,k in ipairs(keys.table) do table.insert(allkeys, k) end
    for _,k in ipairs(keys.other) do table.insert(allkeys, k) end
    return allkeys
  end

tos_arg = function (arg, sep)
    local images = map(tos, arg, arg.n)
    return table.concat(images, sep or " ")
  end

--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
ee_dofile "~/LUA/tos2.lua"
= tos{}
= tos{a="aa", 22}

= tos({{"a", b="bb", 22}, {}, print})


--]]