Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file: -- http://anggtwu.net/LUA/Dang1.lua.html -- http://anggtwu.net/LUA/Dang1.lua -- (find-angg "LUA/Dang1.lua") -- Author: Eduardo Ochs <eduardoochs@gmail.com> -- -- (defun e () (interactive) (find-angg "LUA/Dang1.lua")) -- Used by: -- (find-angg "LUA/Show2.lua") -- (find-angg "LUA/CLua1.lua") -- «.Dang» (to "Dang") -- «.Dang-tests» (to "Dang-tests") -- "tostring-empty": like tostring, but -- returns the empty string when o is nil. -- Used by Dang.__index.eval(). tostringe = function (o) return o and tostring(o) or "" end -- ____ -- | _ \ __ _ _ __ __ _ -- | | | |/ _` | '_ \ / _` | -- | |_| | (_| | | | | (_| | -- |____/ \__,_|_| |_|\__, | -- |___/ -- -- An object is the class Dang "is" a string whose parts -- between <<D>>ouble <<ANG>>le brackets "are to be expanded". -- -- More precisely: each object of the class Dang contains a -- field .bigstr with a string. When that object is "expanded" -- by tostring all the parts between double angle brackets -- in .bigstr are "expanded" by :eval(). The expansion -- happens every time that the tostring is run, and so the -- result of the expansion may change. -- -- Note that I use these conventions: -- a bigstr is a string that may contain newlines, -- a str is a string that does not contain newlines, -- an s is the argument for the function f when -- we run bigstr:gsub(pat, f) or str:gsub(pat, f). -- -- To understand the details, see the tests below, in: -- (to "Dang-tests") -- Based on: (find-angg "LUA/tikz1.lua" "Dang") -- Uses: (find-angg "LUA/lua50init.lua" "eval-and-L") -- -- «Dang» (to ".Dang") Dang = Class { type = "Dang", from = function (bigstr) return Dang {bigstr=bigstr} end, __call = function (da,...) return da:tostring(...) end, __tostring = function (da) return da:tostring() end, __index = { code = function (da,s) if s:match"^::" then return Code.eval(s:sub(3)) end if s:match"^%." then return Code.ve("_ => _."..s:sub(2)) end if s:match"^:" then return Code.ve(s:sub(2)) end return Code.expr(s) end, eval0 = function (da,s,...) return da:code(s)(...) end, eval = function (da,s,...) return tostringe(da:eval0(s,...)) end, -- pat = "<<(.-)>>", tostring = function (da,...) local args = pack(...) local f = function (s) return da:eval(s, myunpack(args)) end return (da.bigstr:gsub(da.pat, f)) end, }, } -- «Dang-tests» (to ".Dang-tests") --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "Show2.lua" da = Dang {} = da:code "2+3" = da:code "2+3" () = da:eval0 ("2+3") = da:eval ("2+3") = da:code ".foo" = da:code ".foo" ({foo="FOO", bar="BAR"}) = da:eval0 (".foo", {foo="FOO", bar="BAR"}) = da:eval (".foo", {foo="FOO", bar="BAR"}) = da:code ":a,b => a+b,a*b" = da:code ":a,b => a+b,a*b" (2, 3) = da:eval0 (":a,b => a+b,a*b", 2, 3) = da:eval (":a,b => a+b,a*b", 2, 3) = Dang.from "a<<2+3>>b" = Dang.from "_<<2+3>>_<<: a,b => a*b >>_" (4,5) = Dang.from "_<<2+3>>_<<. foo >>_" ({foo="FOO", bar="BAR"}) = Dang.from "_<<2+3>>_<<:: return true >>_" --]==] -- Local Variables: -- coding: utf-8-unix -- End: