|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file:
-- http://angg.twu.net/LUA/tos.lua.html
-- http://angg.twu.net/LUA/tos.lua
-- (find-angg "LUA/tos.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
-- Version: 2021aug16
--
-- Based on:
-- (find-angg "LUA/lua50init.lua" "mytostring")
-- Superseded by:
-- (find-angg "LUA/lua50init.lua" "Tos")
--
-- This was my first function for printing the contents of tables.
-- I wrote it when I started using Lua 4.0 in dec/2000.
-- It doesn't use metatables, as they didn't exist in Lua 4.0.
-- The functions and variables were renamed many times over the years.
-- The comments and test blocks were rewritten in 2021.
--
-- Links to some historical versions:
-- (find-es "lua" "lua_yada")
-- (find-es "lua5" "mytostring")
-- (find-angg "dednat/inc.lua" "p")
-- (find-angg "LUA/tos2.lua")
-- (find-dn5 "tos.lua")
--
-- Uses:
-- (find-angg "LUA/lua50init.lua" "map")
--
-- (defun e () (interactive) (find-angg "LUA/tos.lua"))
tos_compare_keyvals = function (keyval1, keyval2)
local key1, key2 = keyval1.key, keyval2.key
local type1, type2 = type(key1), type(key2)
if type1 == type2 then
if type1 == "number" then return key1 < key2 end
if type1 == "string" then return key1 < key2 end
-- return tos(key1) < tos(key2) -- slow
return tostring(key1) < tostring(key2) -- fast
else
return type1 < type2 -- numbers before strings before tables, etc
end
end
tos_sorted_keyvals = function (tbl)
local keyvaltbl = {}
for key,val in pairs(tbl) do
table.insert(keyvaltbl, {key=key, val=val})
end
table.sort(keyvaltbl, tos_compare_keyvals)
return keyvaltbl
end
tos_keyval = function (keyval)
return tos(keyval.key).."="..tos(keyval.val)
end
tos_table = function (tbl, sep, a, b)
local keyvaltbl = tos_sorted_keyvals(tbl)
local images = map(tos_keyval, keyvaltbl)
return (a or "{")
.. table.concat(images, sep or ", ")
.. (b or "}")
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 = 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
return tos_other(o)
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)
dofile "tos.lua"
= tos_compare_keyvals({key="a", val="aa"}, {key=2, val=22})
= tos_sorted_keyvals ({a="aa", [2]=22})
--> {{key=2, val=22}, {key="a", val="aa"}}
= tos_keyval({key="a", val="aa"})
--> '"a"="aa"'
= tos{}
= tos{a="aa", 22}
= tos({{"a", b="bb", 22}, {}, print})
--]]
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
ee_dofile "~/LUA/tos.lua"
--]]