Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- This file:
--   https://anggtwu.net/LUA/Trav1.lua.html
--   https://anggtwu.net/LUA/Trav1.lua
--           (find-angg "LUA/Trav1.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- (defun e () (interactive) (find-angg "LUA/Trav1.lua"))
--
-- «.Trav»		(to "Trav")
-- «.Trav-tests»	(to "Trav-tests")


--  _____                
-- |_   _| __ __ ___   __
--   | || '__/ _` \ \ / /
--   | || | | (_| |\ V / 
--   |_||_|  \__,_| \_/  
--                       
-- "Traverse".
-- «Trav»  (to ".Trav")
Trav = Class {
  type       = "Trav",
  from       = function (o)       return Trav { o=o } end,
  __call     = function (tr,cmds) return tr:run(cmds) end,
  __tostring = function (tr)      return tr:tostring() end,
  __index = {
    tostring = function (tr) return tostring(tr.o) end,
    run1     = function (tr,cmd)
        local fieldname = cmd:match("^%.(.*)")
        local funname   = cmd:match("^(.*)%(%)$")
        local tablekey  = cmd:match("^%[(.*)%]$")
        local method    = "_"..cmd
        if    fieldname then return Trav.from(tr.o[fieldname]) end
        if    funname   then return Trav.from(_G[funname](tr.o)) end
        if    tablekey  then return Trav.from(tr.o[expr(tablekey)]) end
        if   tr[method] then return Trav.from(tr[method](tr,tr.o)) end
        error("Bad cmd: "..cmd)
      end,
    run = function (tr,cmds)
        for _,cmd in ipairs(split(cmds)) do tr = tr:run1(cmd) end
        return tr
      end,
    --
    _mt    = function (tr,o) return getmetatable(o) end,
    _keys  = function (tr,o) return VTable(sortedkeys(o)) end,
    _c     = function (tr,o) return mapconcat(mytostring, o, " ")  end,
    _cv    = function (tr,o) return mapconcat(mytostring, o, "\n") end,
    _ksc   = function (tr,o) return tr:_c (tr:_keys(o)) end,
    _kscv  = function (tr,o) return tr:_cv(tr:_keys(o)) end,
    _char  = function (tr,o) return string.char(o) end,
    _type  = function (tr,o) return type(o) end,
    _otype = function (tr,o) return otype(o) end,
    _PP    = function (tr,o) return mytostring(o) end,
    _PPP   = function (tr,o) return mytostringp(o) end,
    _PPV   = function (tr,o) return mytostringv(o) end,
    _PPPV  = function (tr,o) return mytostringpv(o) end,
    _PPP0  = function (tr,o) return mytostringp(tr) end,
    _PPPV0 = function (tr,o) return mytostringpv(tr) end,
  },
}


-- «Trav-tests»  (to ".Trav-tests")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Trav1.lua"

Vector = Class {
  type       = "Vector",
  __add      = function (V, W) return Vector {V[1]+W[1], V[2]+W[2]} end,
  __tostring = function (V) return "("..V[1]..","..V[2]..")" end,
  __index    = {
    norm = function (V) return math.sqrt(V[1]^2 + V[2]^2) end,
  },
}
v = Vector  {3,  4}  --  v = { 3,  4, __mt = Vector}

PP(v)
PPP(v)
PPV(getmetatable(v))
PPV(getmetatable(v).type)
PPV(getmetatable(v).__index)
PPV(getmetatable(v).__index.norm)

x = Trav.from(v)
= x
= x "PPP"
= x "PPPV"
= x "PPP0"
= x "PPPV0"

= x "PP"
= x "ksc"
= x "kscv"

= x
= x "mt"
= x "mt PPV"
= x "mt kscv"
= x "mt keys"
= x "mt .type"
= x "mt .__index PPV"

o = Trav.from(HTable {11, 22, a=33, b=44})
= o
= o ".a"
= o "[1]"
= o "['b']"
= o "['b'] type"
= o "['b'] type()"
= o "   otype"
= o ".a otype"
= o "keys"
= o "mt"
= o "PPPV"
= o "mt kscv"
= o "mt keys"
= o "mt PP"
= o "mt .type"
= o "mt .__index"
= o "mt keys"
= o "mt mt keys"

--]==]




-- Local Variables:
-- coding:  utf-8-unix
-- End: