|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file:
-- http://angg.twu.net/LUA/UbExpr1.lua.html
-- http://angg.twu.net/LUA/UbExpr1.lua
-- (find-angg "LUA/UbExpr1.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- Expressions with underbraces.
--
-- (defun o () (interactive) (find-angg "LUA/UbExpr1.lua"))
-- (defun l () (interactive) (find-angg "LUA/UbExpr2.lua"))
-- (defun r () (interactive) (find-angg "LUA/RAng1.lua"))
-- (defun rf () (interactive) (find-angg "LUA/RAngFormulas1.lua"))
UbExpr = Class {
type = "UbExpr",
from = function (u, fmt, ...)
return UbExpr {u=u, fmt=fmt, ...}
end,
__tostring = function (ue) return ue:tostring2() end,
__index = {
get = function (ue, str)
local a = str:match("^<(%d)>$")
if a then return tostring(ue[tonumber(a)]) or error("No field "..tostring(str)) end
if str == "<u>" and ue.u then return tostring(ue.u) end
error(format("UbExpr object can't handle :get(\"%s\")", str))
end,
format0 = function (ue, fmt)
local f = function (str) return ue:get(str) end
return (fmt:gsub("<.->", f))
end,
format1 = function (ue, fieldname)
if ue[fieldname] then return ue:format0(ue[fieldname]) end
end,
formatn = function (ue, ...)
local fieldnames = {...}
for i,fieldname in ipairs(fieldnames) do
local result = ue:format1(fieldname)
if result then return result end
end
error("None of these fields exist: "..mytostring(fieldnames))
end,
tostring1 = function (ue)
return ue:formatn("fmt")
end,
tostring2 = function (ue)
if ue.u then
local over, under = ue:tostring1(), tostring(ue.u)
return format("\\und{%s}{%s}", over, under)
else
return ue:tostring1()
end
end,
tostring = function (ue) return ue:tostring2() end,
topict = function (ue) return PictList({ue:tostring()}) end,
sa = function (ue, name) return ue:topict():sa(name) end,
},
}
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "UbExpr1.lua"
es = UbExpr {"foo", "bar", bpa="<2>+<1>", asb="<1>*<2>"}
= es:get("<2>")
= es:format0(es.bpa)
= es:format1("bpa")
= es:format1("asb")
= es:formatn("foo", "bpa", "bletch")
= es:formatn("foo", "asb", "bpa", "bletch")
aa = UbExpr {fmt="<1> + <2>", 22, 33}
bb = UbExpr {fmt="<1> · <2>", 44, 55, u=aa}
= aa
= bb
plus = function (u, a, b) return UbExpr.from(u, "<1> + <2>", a, b) end
times = function (u, a, b) return UbExpr.from(u, "<1> · <2>", a, b) end
equal = function (u, a, b) return UbExpr.from(u, "<1> = <2>", a, b) end
paren = function (u, a) return UbExpr.from(u, "(<1>)", a) end
und = function (u, a) return UbExpr.from(u, "<1>", a) end
app = function (u, f, a) return UbExpr.from(u, "<1>(<2>)", f, a) end
ddvar = function (u, var, body) return UbExpr.from(u, "\\frac{d}{d<1>} <2>", var, body) end
sin = function (u, a) return UbExpr.from(u, "\\sin(<1>)", a) end
cos = function (u, a) return UbExpr.from(u, "\\cos(<1>)", a) end
= plus(nil, 22, 33)
= ddvar(nil, "x", plus(22, 33))
= ddvar(nil, "x", paren(plus(22, 33)))
= ddvar(nil, "x", "foo")
agx,afgx,aleft = nil
afpgx,agpx,aright,aeq = nil
ax = "x"
agx = times(nil, "42", "x")
afgx = app (nil, "\\sin", agx)
aleft = ddvar(nil, "x", afgx)
afpgx = app (nil, "\\cos", agx)
agpx = 42
aright = times(nil, afpgx, agpx)
aeq = equal(nil, aleft, aright)
= aeq
ex = und (ax, "x")
egx = app (agx, "g", ex)
efgx = app (afgx, "f", egx)
eleft = ddvar(aleft, ex, efgx)
efpgx = app (afpgx, "f'", egx)
egpx = app (agpx, "g'", ex)
eright = times(aright, efpgx, egpx)
eeq = equal(aeq, eleft, eright)
= eeq
= edfgx
e4 = app(nil, "g", "x")
e5 = app(nil, "f'", e4)
e6 = app(nil, "g'", "x")
e7 = times(nil, e5, e6)
e8 = equal(nil, e3, e7)
= e8
e3 = ddvar(nil, ex, e2)
= e1
= e2
= e3
--]]
-- Local Variables:
-- coding: utf-8-unix
-- End: