|
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>
--
-- (defun e () (interactive) (find-angg "LUA/Tos2.lua"))
--
-- Like this: (find-angg "LUA/Tos.lua")
-- but with some changes.
-- Status: experimental, used in very few places.
-- «.Tos» (to "Tos")
-- «.Tos-tests» (to "Tos-tests")
-- «.PPC» (to "PPC")
-- «.PPC-tests» (to "PPC-tests")
table.empty = function (T) return next(T) == nil end
-- _____
-- |_ _|__ ___
-- | |/ _ \/ __|
-- | | (_) \__ \
-- |_|\___/|___/
--
-- «Tos» (to ".Tos")
Tos = Class {
type = "Tos",
__index = {
--
-- Basic methods:
-- n: number to string
-- f: function to string
-- s: string to string - adds quotes
-- other: other object, like nil/bool/function, to string
-- o: object (of any type) to string
-- ov: like o, but vertical in a simplistic way
-- t: table to string - calls t0
-- t0: table to string, low level - calls kvs and getsortedkeys
-- kvs: listofkeyvaluepairs to string
-- kv: keyvaluepair to string
-- k: key to string
-- v: value to string
--
n = function (tos, n) return tostring(n) end,
s = function (tos, s) return format("%q", s) end,
f1 = function (tos, o) return PrintFunction.tostring(o) end,
f0 = function (tos, o) return "<"..tostring(o)..">" end,
f = function (tos, o) return "<"..tostring(o)..">" end,
other = function (tos, o) return "<"..tostring(o)..">" end,
--
o = function (tos, o, a,sep,b,emp)
local ty = type(o)
if ty=="number" then return tos:n(o) end
if ty=="string" then return tos:s(o) end
if ty=="function" then return tos:f(o) end
if ty=="table" then return tos:t(o, a,sep,b,emp) end
return tos:other(o)
end,
t = function (tos, T, a,sep,b,emp)
return tos:t0(T, a,sep,b,emp)
end,
t0 = function (tos, T, a,sep,b,emp)
if table.empty(T) and emp then return emp end
local body = tos:kvs(tos:getsortedkvs(T), sep)
return (a or "{")..body..(b or "}")
end,
--
kvs = function (tos, ps, sep)
local kvtostring = function (p) return tos:kv(p) end
return mapconcat(kvtostring, ps, sep or ", ")
end,
kv = function (tos, p) return tos:k(p.key).."="..tos:o(p.val) end,
k = function (tos, k) return tos:o(k) end,
v = function (tos, v) return tos:o(v) end,
--
-- t0 uses getsortedkvs to sort the key-value pairs of a table.
getsortedkvs = function (tos, T)
return sorted(tos:getkvs(T), tos.comparekvs)
end,
getkvs = function (tos, T)
local kvs = {}
for k,v in pairs(T) do table.insert(kvs, {key=k, val=v}) end
return kvs
end,
comparekvs = function (kv1, kv2) -- not a method!
local k1,k2 = kv1.key, kv2.key
return rawtostring_comp(k1, k2)
end,
--
-- A "vertical" alternative to o.
ov = function (tos, o, a,sep,b,emp)
return tos:o(o, "{ ", ",\n ", "\n}", "{}")
end,
--
-- An alternative to kv that uses square brackets.
kvb = function (tos, p)
return "["..tos:k(p.key).."]="..tos:o(p.val)
end,
--
-- An alternative to t.
-- When tos is an object of the class Tos
-- and foo is an object of the class Foo we have this:
-- tos:t (foo) --> "{...}"
-- tos:tp(foo) --> "Foo:{...}"
--
tp = function (tos, T, a,sep,b,emp)
return tos:tprefix(T)..tos:t0(T, a,sep,b,emp)
end,
tprefix = function (tos, T, sep)
local mt = getmetatable(T)
local typename = mt and mt.type
return typename and (typename..(sep or ":")) or ""
end,
--
-- Another alternative to (the outermost) t.
tcols = function (tos, T, fmt)
fmt = fmt or "%-14s %s"
local kvs = tos:getsortedkvs(T)
local f = function (kv) return format(fmt, tos:o(kv.key), tos:o(kv.val)) end
return mapconcat(f, kvs, "\n")
end,
},
}
-- «Tos-tests» (to ".Tos-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Tos2.lua"
A = { 2, "foo", {3, 4}, VTable{5, 6} }
A = { 2, "foo", a={3, 4}, b=VTable{5, 6} }
= Tos{}:o(A)
= Tos{} :tcols(Tos.__index)
= Tos{f=Tos.__index.f1} :tcols(Tos.__index)
= Tos{f=Tos.__index.f1} :tcols(Tos.__index, " %-14s %s")
= Tos{f=Tos.__index.f1} :tcols(Tos) -- messy
Tos.__index.f = Tos.__index.f1
= Tos{}:tcols(Tos)
= Tos{}:tcols(Tos.__index)
= Tos{}:tcols(Tos.__index, " %-14s %s")
PP(split)
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Tos2.lua"
tos0 = Tos({})
tosp = Tos({t = Tos.__index.tp})
Tos.__index.f = Tos.__index.f1
PP(split)
tos = Tos {}
tosp = Tos { t=Tos.__index.tp }
tosv = Tos { o=Tos.__index.ov }
tosb = Tos { kv=Tos.__index.kvb }
= Tos.__index.f(nil, split)
= tos :o(split)
PP(split)
= tos :o(A)
= tosp:o(A)
= tos :ov(A)
= tosp:ov(A)
= tosb:ov(A)
PPV(Tos.__index)
= tosv:o(Tos.__index) -- Fix this
= tosv:ov(Tos.__index) -- Fix this
= mapconcat(mytostring, sortedkeys(A), " ")
= keys(A)
PP(keys(A))
--]]
-- «PPC» (to ".PPC")
PPC = function (T) print(Tos{f=Tos.__index.f1}:tcols(T)) end
-- «PPC-tests» (to ".PPC-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Tos2.lua"
PPC(Tos.__index)
--]]
-- Local Variables:
-- coding: utf-8-unix
-- End: