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

-- See: (find-anggfile "LUA/Tree1.lua")
treetor = function (o) return SynTree.from(o):torect() end
treetos = function (o) return tostring(treetor(o)) end
trees = function (...)
    local conc = function (a, b) return a.."  "..b end
    local torect = function (o) return SynTree.from(o):torect() end
    return foldl1(conc, map(torect, {...}))
  end

Tree = Class {
  type = "Tree",
  __tostring = function (o) return treetos(o) end,
  __index = {
  },
}

evall = function (str, ...) return assert(loadstring(str))(...) end

bin   = function (a, op, b) return Tree {[0]=op, a, b} end
mul   = function (a, b) return bin(a, "*", b) end
add   = function (a, b) return bin(a, "+", b) end
minus = function (a, b) return bin(a, "-", b) end
frac  = function (a, b) return bin(a, "/", b) end
pown  = function (a, n) return bin(a, "^", n) end
Eq    = function (a, b) return bin(a, "=", b) end
app   = function (f, a) return Tree {[0]=f, a} end
ddx   = function (f)    return Tree {[0]="ddx", f} end
by2   = function (rule, a, b) return Tree {[0]="by2", rule, a, b} end

matches = function (t, o)
    if not otype(t) == otype(o) then return false end
    if type(t) == "table" then return t[0] == o[0] end
    return t == o
  end

acton = function (o)
    if matches(ddx(), o) and matches(add(), o[1]) then
      local f,g = o[1][1], o[1][2]
      return add(ddx(f), ddx(g)), by2("+", f, g)
    end
    if matches(ddx(), o) and matches(minus(), o[1]) then
      local f,g = o[1][1], o[1][2]
      return minus(ddx(f), ddx(g)), by2("-", f, g)
    end
    if matches(ddx(), o) and matches(mul(), o[1]) then
      local f,g = o[1][1], o[1][2]
      return add(mul(ddx(f),g), mul(f,ddx(g))), by2("*", f, g)
    end
    if matches(ddx(), o) and matches(frac(), o[1]) then
      local f,g = o[1][1], o[1][2]
      return frac(minus(mul(ddx(f),g), mul(f,ddx(g))), pown(g,2)),
             by2("/", f, g)
    end
    error()
  end



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

o = ddx(add(2, 3))
= trees(acton(o))
o = ddx(minus(2, 3))
= trees(acton(o))
o = ddx(mul(2, 3))
o = ddx(mul("ff", "gg"))
= trees(acton(o))
o = ddx(frac("ff", "gg"))
= trees(acton(o))

= foo[1][1]
= foo[1][2]

PPP(mul())

= trees(ddx(app("f", app("g", "x"))))

= trees({1, 2, {3, 4}}, {22, 33})

A = HTable {11, 22, 33}
evall([=[
  local _ = ...
  print(_[1], _[2])
  _[3] = _[3] * 10
]=], A)
= A

--]]







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