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

-- -- (find-angg "LUA/Pict2e1.lua" "PradClass")



Es = Class {
  type   = "Es",
  --
  -- Low-level formatting words:
  format = function (fmt, ...)
      local args = {...}
      local f = function (n) return tostring(args[tonumber(n)]) end
      return (fmt:gsub("%%(%d)", f))
    end,
  find_fline = function (fname, n)
      return Es.format('(find-fline "%1" %2)', fname, n)
    end,
  find_2a = function (sexp)
      return Es.format("(find-2a nil '%1)", sexp)
    end,
  mkbutton = function (text, sexp)
      return Es.format("(mkbutton \"%1\" '%2)", text, sexp)
    end,
  --
  -- toe (to Emacs string) and variants:
  toe = function (es)
      if type(es) == "string" then return '"'..es..'"' end
      return es:toe()
    end,
  insert = function (es) return "(insert "..Es.toe(es).."\n)" end,
  concat = function (es) return "(concat "..Es.toe(es).."\n)" end,
  insertn = function (es) return "(insert \"\\n\"\n"..Es.toe(es).."\n)" end,
  --
  __index = {
    concat  = function (es) return Es.concat(es) end,
    insert  = function (es) return Es.insert(es) end,
    insertn = function (es) return Es.insertn(es) end,
  },
}

--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "TProps1.lua"
= Es.format("foo %1 %2 %1:", 22, "3_3")
= Es.find_fline("/tmp/foo", 42)
= Es.find_2a(Es.find_fline("/tmp/foo", 42))
= Es.mkbutton("tofile", Es.find_2a(Es.find_fline("/tmp/foo", 42)))

--]]



EsFindFline = Class {
  type = "EsFindFline",
  new  = function (text, fname, linen)
      return EsFindFline {text=text, fname=fname, linen=linen}
    end,
  __concat = function (a, b) return EsList {a, b} end,
  __tostring = function (esfl) return esfl.text end,
  __index = methodsover(Es.__index) {
    find_fline = function (esfl)
        return Es.find_fline(esfl.fname, esfl.linen)
      end,
    mkbutton = function (esfl)
        return Es.mkbutton(esfl.text, Es.find_2a(esfl:find_fline()))
      end,
    toe = function (esfl)
        return esfl:mkbutton()
      end,
  },
}

--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "TProps1.lua"
esfl = EsFindFline.new("tofoo", "/tmp/foo", 42)
= esfl
= esfl:toe()
= esfl:insertn()

= esfl:toe()
= Es.insertn(esfl)

= Es.toe("foo")
esl = EsList { "foo: ", esfl }
= esl
= esl[1]
= esl[2]
= esl:toe()
= Es.insert(esl)
= Es.insertn(esl)
= Es.concat(esl)

--]]


EsList = Class {
  type      = "EsList",
  mapconcat = function (f, A, sep)
      if #A == 0 then return EsList {} end
      local B = EsList { f(A[1]) }
      for i=2,#B do
        if sep then table.insert(B, sep) end
        table.insert(B, f(A[i]))
      end
      return B
    end,
  __concat  = function (a, b) return EsList {a, b} end,
  __tostring = function (esl)
      return mapconcat(tostring, esl)
    end,
  __index = methodsover(Es.__index) {
    toe = function (esl)
      return mapconcat(Es.toe, esl, "\n")
    end,
  },
}



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

-- (find-emlua "emlua-buttons.el")
* (defun mkbutton (text sexp) (buttonize text `(lambda (&rest rest) ,sexp)))

= esl.."bar"
= (esl.."bar"):toe()

es = Es {a="aa", b="bb"}


--]]





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