|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file:
-- http://anggtwu.net/LUA/tos3.lua.html
-- http://anggtwu.net/LUA/tos3.lua
-- (find-angg "LUA/tos3.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
-- This is a backup of one of my old versions of "mystring" that
-- didn't use classes. Compare with:
-- (find-angg "LUA/lua50init.lua" "Tos")
-- (find-angg "LUA/tos.lua")
-- (find-angg "LUA/tos2.lua")
--
-- (defun e () (interactive) (find-angg "LUA/tos3.lua"))
-- «.mysortedpairs» (to "mysortedpairs")
-- «.mytostringk2» (to "mytostringk2")
tos_compare_pairs = function (pair1, pair2)
local key1, key2 = pair1.key, pair2.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 tostring(key1) < tostring(key2) -- fast
else
return type1 < type2 -- numbers before strings before tables, etc
end
end
tos_sorted_pairs = function (T)
local Tpairs = {}
for key,val in pairs(T) do
table.insert(Tpairs, {key=key, val=val})
end
return sorted(Tpairs, tos_compare_pairs)
end
tos_table_orig = function (T, sep)
return "{"..mapconcat(tos_pair, tos_sorted_pairs(T), sep or ", ").."}"
end
tos_table = tos_table_orig
tos = function (o)
local t = type(o)
if t=="number" then return tostring(o) end
if t=="string" then return format("%q", o) end
if t=="table" then return tos_table(o) end
return "<"..tostring(o)..">"
end
tos_key = tos -- change this to print string keys differently
tos_pair = function (pair)
return tos_key(pair.key).."="..tos(pair.val)
end
mysort = tos_sorted_pairs -- compatibility
mytostring = tos -- compatibility
mytostring_arg = function (T, sep)
return mapconcat(tos, T, sep or " ", T.n)
end
-- Tools for building extensions
tos_good_string_key = function (key)
return type(key) == "string" and key:match("^[A-Za-z_][A-Za-z_0-9]*$")
end
tos_has_tostring = function (o)
return getmetatable(T) and getmetatable(T).__tostring
end
tos_has_eootype = function (o)
return type(o) == "table" and getmetatable(o) and getmetatable(o).type
end
mytostringk = mytostring -- change this to print string keys differently
mytostring_arg = function (arg, sep)
local images = {}
for i=1,arg.n do images[i] = mytostring(arg[i]) end
return table.concat(images, sep or " ")
end
-- mytostring_arg({n=4, nil, 22, 33, nil})
--> "<nil> 22 33 <nil>"
-- «mysortedpairs» (to ".mysortedpairs")
-- This is useful in iteractive scripts. The name is bad, I know.
-- (find-pilw3m "7.1.html" "simple iterator")
mysortedpairs = function (T)
local T = mysort(T)
local i,n = 0,#T
return function ()
i = i + 1
if i <= n then return T[i].key,T[i].val end
end
end
-- «mytostringk2» (to ".mytostringk2")
-- Experimental. Usage:
-- mytostringk = mytostringk2
mytostringk2 = function (o)
if type(o) == "string" and o:match("^[A-Za-z_][A-Za-z_0-9]*$") then
return o
else
return mytostring(o)
end
end
-- Local Variables:
-- coding: utf-8-unix
-- End: