Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- This file:
--   http://angg.twu.net/LUA/Arith1.lua.html
--   http://angg.twu.net/LUA/Arith1.lua
--           (find-angg "LUA/Arith1.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- (defun e () (interactive) (find-angg "LUA/Arith1.lua"))


Tokens = Class {
  fromcs = function (str) return Tokens(split(str, "(.)")) end,
  fromws = function (str) return Tokens(split(str)) end,
  type    = "Tokens",
  __tostring = function (tks) return tks:tostring() end,
  __index = {
    torect1 = function (tks, i)
        return Rect.from(tks[i].."\n"..i)
      end,
    torect = function (tks, i, j)
        i, j = i or 1, j or #tks
        local out = tks:torect1(i)
        for k=i+1,j do out = out.." "..tks:torect1(k) end
        return out
      end,
    torectp = function (tks) return tks:torect() .. "  pos=" .. tks.pos end,
    tostring1 = function (tks, i, j, sep)
        return table.concat(tks, sep or tks.sep or "", i or 1, j or #tks)
      end,
    tostring = function (tks, i, j)
        return tks:torect(i or 1, j or #tks):tostring()
      end,
    tostringp = function (tks) return tks:torectp():tostring() end,
    sub = function (tks, i, j) return TokenSeq.from(tks, i, j) end,
  },
}

TokenSeq = Class {
  type = "TokenSeq",
  from = function (tks, i, j) return TokenSeq {tks=tks, i=i, j=j} end,
  __tostring = function (ts) return ts:tostring1() end,
  __concat   = function (tsl, tsr) return tsl:glue(tsr) end,
  __index = {
    tostring1 = function (ts) return ts.tks:tostring1(ts.i, ts.j) end,
    tostring  = function (ts) return ts.tks:tostring (ts.i, ts.j) end,
    glue = function (tsl, tsr) return TokenSeq.from(tsl.tks, tsl.i, tsr.j) end,
  },
}

-- (find-dn6 "stacks.lua" "Stack")
--
Stack = Class {
  type    = "Stack",
  new     = function () return Stack {} end,
  --
  __tostring = function (s) return mapconcat(tostring, s, " ") end,
  __index = {
    push  = function (s, o) table.insert(s, o); return s end,
    pushs = function (s, ...) for _,o in {...} do s:push(o) end; return s end,
    --
    check     = function (s) assert(#s>0, s.msg or "Empty stack"); return s end,
    drop      = function (s) s:check(); s[#s]=nil; return s end,
    dropn     = function (s, n) for i=1,n  do s:drop() end; return s end,
    dropuntil = function (s, n) while #s>n do s:drop() end; return s end,
    clear     = function (s)    return s:dropn(#s) end,
    --
    pop  = function (s) return                            s[#s], s:dropn(1) end,
    pop2 = function (s) return                   s[#s-1], s[#s], s:dropn(2) end,
    pop3 = function (s) return          s[#s-2], s[#s-1], s[#s], s:dropn(3) end,
    pop4 = function (s) return s[#s-3], s[#s-2], s[#s-1], s[#s], s:dropn(4) end,
    --
    pick = function (s, offset) return s[#s-offset] end,
    pock = function (s, offset, o)     s[#s-offset] = o; return s end,
  },
}

push     = function (stack, o)         return stack:push(o)          end
pop      = function (stack)            return stack:pop()            end
popuntil = function (stack, depth)     return stack:dropuntil(depth) end
pick     = function (stack, offset)    return stack:pick(offset)     end
pock     = function (stack, offset, o) return stack:pock(offset, o)  end

tks = Tokens.fromcs "(1+2)*3^(4+5)"
tks.pos = 1
s = Stack.new()
prt = function () print(tks:torect()) end
prt = function () print(tks:tostringp()) end
prs = function () print(s) end
pup = function () s:push(tks:sub(tks.pos, tks.pos)); tks.pos = tks.pos + 1 end
glue = function () local l,r = s:pop2(); s:push(l..r) end

-- (find-angg "LUA/lua50init.lua" "Code")
vc = Code.vc
cmds = {
  ["push"] = vc [[ o => pup()                 ]],
  ["_+"]   = vc [[ o => glue()                ]],
  ["_+_"]  = vc [[ o => glue()                ]],
  ["(_)"]  = vc [[ o => pup(); glue(); glue() ]],
}
runcmds = function (bigstr)
    for _,cmd in ipairs(split(bigstr)) do
      printf("%-5s ->  ", cmd)
      cmds[cmd]()
      local newstack = tostring(s)
      print(newstack)
    end
  end



--[[
 (eepitch-lua51)
 (eepitch-kill)
 (eepitch-lua51)
dofile "Arith1.lua"
prt()
runcmds "push push push _+ push _+_ (_) "
runcmds "push _+ push push _+ "
runcmds "push push push _+ "
runcmds "push _+_"
runcmds "(_) _+_ _+_"

--]]


--[[
 (eepitch-lua51)
 (eepitch-kill)
 (eepitch-lua51)
dofile "Arith1.lua"
prt()
pup(); prs()
pup(); prs()
pup(); prs()
glue(); prs()
pup(); prs()
glue(); prs()
pup(); glue(); glue(); prs()
pup(); prs()
glue(); prs()
pup(); prs()

= (tks:sub(2,5) .. tks:sub(6, 9))
= (tks:sub(2,5) .. tks:sub(6, 9)):tostring()
a, b = s:pop2(); print(a..b)


= s

--]]




-- (find-angg "LUA/Rect.lua" "Rect-tests")

--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Arith1.lua"

= tks
= tks:tostring1()
= tks:tostring1(3, 5)
= tks:sub(3, 5)
= tks:sub(3, 5):tostring()

--]]




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