Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file: -- http://angg.twu.net/LUA/DFS-old.lua.html -- http://angg.twu.net/LUA/DFS-old.lua -- (find-angg "LUA/DFS-old.lua") -- Author: Eduardo Ochs <eduardoochs@gmail.com> -- -- (defun e () (interactive) (find-angg "LUA/DFS-old.lua")) DFS = Class { type = "DFS", new = function () return DFS { opened = SetL.new(), closed = SetL.new(), nodetok = Set.new(), ktonode = Set.new(), nodetoname = {}, nodenames = Set.new(), } end, __index = { register = function (dfs, node) if not dfs.nodetok:has(node) then local k = rawtostring(node) dfs.nodetok:add(node, k) dfs.ktonode:add(k, node) end return dfs.nodetok:get(node) end, -- rejecttarget = function (dfs, arrowname, tgt) local ot = otype(tgt) return ot == "Set" or ot == "SetL" or ot == "DFS" end, genarrows = function (dfs, o) local send = function (arrowname, tgt) if not dfs:rejecttarget(arrowname, tgt) then coy(arrowname, tgt) end end if type(o) == "table" then return cow(function () for k,v in pairs(o) do if type(k) == "string" and type(v) == "table" then send(k, v) end end local mt = getmetatable(o) if type(mt) == "table" then send("__mt", mt) end end) end end, -- isclosed = function (dfs, o) return dfs.closed:has(o) end, isopened = function (dfs, o) return dfs.opened:has(o) end, open = function (dfs, o) dfs.opened:add(o) end, close = function (dfs, o) dfs.closed:add(o) end, recurse = function (dfs, o) if dfs:isclosed(o) then return end if dfs:isopened(o) then return end dfs:register(o) dfs:open(o) for arrowname,tgt in dfs:genarrows(o) do dfs:recurse(tgt) end dfs:close(o) return dfs end, -- setdfsnumbers = function (dfs) dfs.openn = Set.new() dfs.closen = Set.new() for i,node in ipairs(dfs.opened.list) do dfs.openn :add(node, i) end for i,node in ipairs(dfs.closed.list) do dfs.closen:add(node, i) end return dfs end, -- setarrowname = function (dfs, src, tgt, arrowname) local anames = dfs.arrownames if not anames[src] then anames[src] = {} end if not anames[src][tgt] then anames[src][tgt] = SetL.new() end anames[src][tgt]:add(arrowname) end, setarrownames1 = function (dfs, src) for arrowname,tgt in dfs:genarrows(src) do dfs:setarrowname(src, tgt, arrowname) end end, setarrownames = function (dfs) dfs.arrownames = {} for _,src in ipairs(dfs.opened.list) do dfs:setarrownames1(src) end return dfs end, -- hasnode = function (dfs, node) return dfs.nodetok:has(node) end, hasnodename = function (dfs, node) return dfs.nodetoname[node] end, setnodename1 = function (dfs, node, name) dfs.nodetoname[node] = dfs.nodetoname[node] or name end, setnodenames1 = function (dfs, node, name) if not dfs:hasnode(node) then return end if dfs:hasnodename(node) then return end dfs.nodetoname[node] = name for arrowname,tgt in dfs:genarrows(node) do dfs:setnodenames1(tgt, name.."."..arrowname) end return dfs end, setnodenames2 = function (dfs) for node,name in pairs(dfs.nodetoname) do if not dfs.nodenames:has(name) then dfs.nodenames:add(name, node) end end dfs.openedntonode = dfs.opened.list dfs.closedntonode = dfs.closed.list dfs.nodetoopenedn = transpose(dfs.openedntonode) dfs.nodetoclosedn = transpose(dfs.closedntonode) return dfs end, -- nodenamessorted = function (dfs) return dfs.nodenames:ks() end, nodenamessortedc = function (dfs, sep) return table.concat(dfs:nodenamessorted(), sep or "\n") end, -- nnodes = function (dfs) return #dfs.opened.list end, maxk = function (dfs) return dfs:nnodes() end, ntok = function (dfs, n) return dfs:nnodes() + 1 - n end, kton = function (dfs, k) return dfs:nnodes() + 1 - k end, nodeinfo = function (dfs, node, short) local maybenode if not short then maybenode = node end local n = dfs.nodetoclosedn[node] return { node = maybenode, name = dfs.nodetoname[node], openedn = dfs.nodetoopenedn[node], closedn = dfs.nodetoclosedn[node], n = n, k = dfs:ntok(n), } end, nameinfo = function (dfs, name, s) return dfs:nodeinfo(dfs.nodenames:get(name), s) end, openedninfo = function (dfs, n, s) return dfs:nodeinfo(dfs.openedntonode[n], s) end, closedninfo = function (dfs, n, s) return dfs:nodeinfo(dfs.closedntonode[n], s) end, ninfo = function (dfs, n, s) return dfs:closedninfo(n, s) end, kinfo = function (dfs, k, s) return dfs:ninfo(dfs:kton(k), s) end, }, } classnames = [[ Class Blogme DFSTriangle DedTree ELispH ELispHF ELispInfo EevIntro HTable NamedFunction Rect Set SetL Sexp SexpSkel SynTree VTable ]] dfs_from_G = function (thesenamesfirst) dfs = DFS.new() dfs:recurse(_G):setdfsnumbers():setarrownames() dfs:setnodename1(_G, "_G") for _,name in ipairs(split(thesenamesfirst or "Class")) do dfs:setnodenames1(expr(name), name) end -- for name,o in pairs(_G) do dfs:setnodenames1(o, name) end dfs:setnodenames2() end tname = function (o) return dfs.nodetoname[o] end PPT = function (o) print(tname(o) or mytostringpv(o)); return o end dofile "DFSTriangle.lua" -- (find-angg "LUA/DFSTriangle.lua") -- «test-triangle» (to ".test-triangle") --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "DFS.lua" dfs_from_G(classnames) = dfs:nodenamessortedc() for k=1,dfs:maxk() do PP(dfs:kinfo(k, "s")) end for name,o in pairs(_G) do dfs:setnodenames1(o, name) end dfst = DFSTriangle.from(dfs) dfst:drawdiagonal() dfst:setgrid0() dfst:setgrid1() dfst:setgrid2() = dfst.r --]==] -- «test-tname» (to ".test-tname") --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "DFS.lua" dfs_from_G(classnames) for name,o in pairs(_G) do dfs:setnodenames1(o, name) end tname = function (o) return dfs:nodeinfo(o).name end = tname(Set) = tname(Set.__index) PPV(Set) PPV(Set.__index) PPT(Set) PPT(Set.__index) --]==]