Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file: -- http://angg.twu.net/LUA/Lazy1.lua.html -- http://angg.twu.net/LUA/Lazy1.lua -- (find-angg "LUA/Lazy1.lua") -- Author: Eduardo Ochs <eduardoochs@gmail.com> -- 2022jul16 -- -- (defun l () (interactive) (find-angg "LUA/Lazy1.lua")) -- Obsolete! Superseded by: (find-angg "LUA/Lazy2.lua") require "C2Subst1" -- (find-angg "LUA/C2Subst1.lua") -- (find-angg "LUA/C2Subst1.lua" "LExpr") tolua = function (o) if type(o) == "number" then return tostring(o) end if type(o) == "string" then return format("%q", o) end if not o.tolua then PPP(o); error "No :tolua" end return o:tolua() end LazyFun = Class { type = "LazyFun", __tostring = function (la) return la:tolua() end, __index = { tolua = function (la) local args = mapconcat(tolua, la, ", ") return format("%s(%s)", la[0], args) end, totree = function (la) return SynTree.from(la) end, }, } LazyVar = Class { type = "LazyVar", __tostring = function (la) return la:tolua() end, __index = { tolua = function (la) return la[0] end, totree = function (la) return SynTree.from(la) end, }, } fun = function (name) _G[name] = function (...) return LazyFun {[0]=name, ...} end end var = function (name) _G[name] = LazyVar {[0]=name} end funs = function (bigstr) for _,name in ipairs(split(bigstr)) do fun(name) end end vars = function (bigstr) for _,name in ipairs(split(bigstr)) do var(name) end end vareq = function (o1, o2) return otype(o1) == "LazyVar" and otype(o2) == "LazyVar" and o1[0] == o2[0] -- vars with the same name end funeq = function (o1, o2) return otype(o1) == "LazyFun" and otype(o2) == "LazyFun" and o1[0] == o2[0] -- apps of the same function end funarg = function (o, n) if otype(o) ~= "LazyFun" then error "Not a function" end return o[n or 1] end --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "Lazy1.lua" f = LazyFun {[0]="f", 22, "foo"} = f funs " ddx eq mul f g fp gp und " = f(22, "foo") vars " x y " RC = eq(ddx(f(g(x))), mul(fp(g(x)), gp(x))) = RC = vareq(x,x), vareq(x,y) = funeq(f(22),f(33)), funeq(f(22),g(33)) = funarg(f(22)) = funarg(f(22, 33), 2) foo = f(und(g(x))) = foo = PP( foo ) = PP( tostring(foo) ) = PP(expr(tostring(foo))) foo = expr(tostring(foo)) = PP( foo ) = PP( tostring(foo) ) = PP(expr(tostring(foo))) und = id foo = expr(tostring(foo)) = PP( foo ) = PP( tostring(foo) ) = PP(expr(tostring(foo))) -- (find-angg "LUA/C2Subst1.lua" "basic-ops") --]==] makesubst_v1 = function (S_core) local S S = function (o) if type(o) == "number" then return o end if type(o) == "string" then return o end local oisvar = function (v) return vareq(o, v) end local oisapp = function (f) return funeq(o, f("_")) end local oarg = function (n) return funarg(o, n) end local oSarg = function (n) return S(funarg(o, n)) end local Sresult = S_core(o,oisvar,oisapp,oarg,oSarg) if Sresult then return Sresult end local o2 = shallowcopy(o) for i=1,#o2 do o2[i] = S(o2[i]) end return o2 end return S end Subst = Class { type = "Subst", fmt0 = "function (o,isvar,isapp,arg,Sarg)\n%s\n end", fmt1 = "makesubst_v1(%s)", from = function (bigstr0) return Subst({bigstr=rtrim(bigstr0)}):compile() end, __call = function (s, ...) return s.S(...) end, __tostring = function (s) return s.bigstr end, __index = { code = function (s) return format(Subst.fmt1, format(Subst.fmt0, s.bigstr)) end, compile = function (s) s.S = expr(s:code()); return s end, }, } --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "Lazy1.lua" S1 = Subst.from [[ if isapp(f) then return sen(Sarg()) end if isapp(fp) then return cos(Sarg()) end if isapp(g) then return mul(42,Sarg()) end if isapp(gp) then return 42 end if isvar(x) then return t end ]] = S1 = S1:code() = RC :totree() = S1(RC):totree() und0 = function (o) if funeq(o, und("_")) then return und0(funarg(o)) end return o end S2unds = Subst.from [[ if isapp(f) then return und(f (und(Sarg()))) end if isapp(fp) then return und(fp(und(Sarg()))) end if isapp(g) then return und(g (und(Sarg()))) end if isapp(gp) then return und(gp(und(Sarg()))) end if isvar(x) then return und(x) end ]] S2und1 = Subst.from [[ if isapp(und) then return und(und0(Sarg())) end ]] = RC :totree() = S2unds(RC) :totree() = S2und1(S2unds(RC)):totree() S3u = Subst.from [[ return und(o) ]] = S3u(RC):totree() = und0(und(und(x))) foo = mul(und(und(x)), und(y)) = foo:totree() --]==] funs " ddx ddvar eq mul sen cos f g fp gp und " vars " x y t " RC = eq(ddx ( f(g(x))), mul(fp(g(x)), gp(x))) RC = eq(ddvar(x, f(g(x))), mul(fp(g(x)), gp(x))) S1_core = function (o,isvar,isapp,arg,Sarg) if isvar(x) then return y end end S2_core = function (o,isvar,isapp,arg,Sarg) if isapp(und) then return t end end S3_core = function (o,isvar,isapp,arg,Sarg) if isapp(f) then return sen(Sarg()) end if isapp(fp) then return cos(Sarg()) end if isapp(g) then return mul(42,Sarg()) end if isapp(gp) then return 42 end if isvar(x) then return t end end --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "Lazy1.lua" S1 = makesubst_v1( function (o,isvar,isapp,arg,Sarg) if isvar(x) then return t end end) = RC = S1(RC) S2 = makesubst_v1(function (o,isvar,isapp,arg,Sarg) if isapp(f) then return sen(Sarg()) end if isapp(fp) then return cos(Sarg()) end if isapp(g) then return mul(42,Sarg()) end if isapp(gp) then return 42 end if isvar(x) then return t end end) = RC = S2(RC) = RC :totree() = S2(RC):totree() funs " u " RCU = eq(ddvar(u(x), u(f(u(g(u(x)))))), mul(fp(u(g(u(x)))), u(gp(u(x))))) = RCU S1 = makesubst_v1(S1_core) S3 = makesubst_v1(S3_core) = S1("foo") = S1(x) = S1(RC) = S3(RC) = S3(f(42)) = RC foo = x PPP(foo) = x isvar = function (o, v) return otype -- ( c2m221dp1p 2 "introducao") -- (c2m221dp1a "introducao") RC_example1 = applysubst(RC, S1) end --]==] -- Local Variables: -- coding: utf-8-unix -- End: