|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
#!/usr/bin/env lua51
-- defwithmanyargs.lua
-- Eduardo Ochs, 2011jan17
-- This file: (find-angg "LUA/defwithmanyargs.lua")
-- http://angg.twu.net/LUA/defwithmanyargs.lua
-- http://angg.twu.net/LUA/defwithmanyargs.lua.html
-- See:
-- (find-es "tex" "more-than-9-args")
-- (find-angg ".emacs" "tex-def-many")
-- «.DefWithManyArgs-class» (to "DefWithManyArgs-class")
-- «.defwithmanyargs» (to "defwithmanyargs")
-- «.DefWithManyArgs-tests» (to "DefWithManyArgs-tests")
-- «.SetManyArgs» (to "SetManyArgs")
-- «.SetManyArgs-tests» (to "SetManyArgs-tests")
-- «.Bottle» (to "Bottle")
-- «.run» (to "run")
-- «.test-arg» (to "test-arg")
-- «.test-run» (to "test-run")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
--]]
-- Old:
name = "foo"
body = "% body\n"
ha = function (hn) return format("#%d", hn) end
han = function (np) return mapconcat(ha, seq(1, np)) end
sa = function (myn, hn) return format("\\sa{%d}{#%d}", myn, hn) end
saf = function (n) return function (hn) return sa(5*n + hn, hn) end end
san = function (n, np) return mapconcat(saf(n), seq(1, np)) end
na = function (n) return format("\\%s%s", name, ("@"):rep(n)) end
bg = function (n) return n==0 and "\\begingroup" or "" end
-- ga = function (myn) return format("\\ga{%d}", myn) end
da = function (n)
return format("\\def%s%s{%s%%\n", na(n), han(5), bg(n)) ..
format(" %s%s}\n", san(n, 5), na(n + 1))
end
dal = function (n, np)
return format("\\def%s%s{%%\n", na(n), han(np)) ..
format(" %s%%\n", san(n, np)) ..
body ..
" \\endgroup}\n"
end
fulldef_ = function (np)
local T = {}
for n=0,10000 do
if np > 5
then tinsert(T, da(n)); np = np - 5
else tinsert(T, dal(n, np)); break
end
end
return table.concat(T, "")
end
-- «DefWithManyArgs-class» (to ".DefWithManyArgs-class")
-- Written in 2021mar16.
--
DefWithManyArgs = Class {
type = "DefWithManyArgs",
fromnames = function (name, argnames)
local n = #split(argnames)
return DefWithManyArgs {name=name, argnames=argnames, remaining=n}
end,
__index = {
subst = function (dma, str)
local f = function (method, arg) return dma[method](dma, arg) end
return (str:gsub("<(.-):(.-)>", f))
end,
mapn = function (dma, method, n)
return mapconcat(function (k) return dma[method](dma, k) end, seq(1, n))
end,
advance = function (dma)
dma.ats = dma.ats .. "@"
dma.delta = dma.delta + 5
dma.remaining = dma.remaining - 5
return ""
end,
mapremaining = function (dma, method)
local A = {}
while dma.remaining > 0 do
table.insert(A, dma[method](dma, dma:N()))
dma:advance()
end
return table.concat(A, "\n")
end,
--
ats = "",
delta = 0,
remaining = 7,
N = function (dma) return min(dma.remaining, 5) end,
v = function (dma, fieldname) return dma[fieldname] end,
arg = function (dma, n) return "#"..n end,
args = function (dma, n) return dma:mapn("arg", n) end,
argsN = function (dma, _) return dma:args(dma:N()) end,
setarg = function (dma, n) return "\\sa{"..dma.delta+n.."}{#"..n.."}" end,
setargs = function (dma, n) return dma:mapn("setarg", n) end,
setargsN = function (dma, _) return dma:setargs(dma:N()) end,
defN = function (dma) return dma:subst("\\def\\<v:name><v:ats><argsN:>{%\n"..
" <setargsN:>%\n"..
" \\<v:name>@<v:ats>}\n") end,
defNs = function (dma)
local bigstr = ""
while dma.remaining > 0 do
bigstr = bigstr .. dma:defN()
dma.ats = dma.ats .. "@"
dma.delta = dma.delta + 5
dma.remaining = dma.remaining - 5
end
return bigstr
end,
defbody = function (dma)
return dma:subst("\\def\\<v:name><v:ats>{<v:body>}")
end,
deffull = function (dma)
return dma:subst("\\makeatletter%\n"..
"<defNs:><defbody:>%\n"..
"\\makeatother")
end,
},
}
-- «defwithmanyargs» (to ".defwithmanyargs")
defwithmanyargs = function (name, nargs, body)
return DefWithManyArgs {name=name, remaining=nargs, body=body}:deffull()
end
-- «DefWithManyArgs-tests» (to ".DefWithManyArgs-tests")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "defwithmanyargs.lua"
dma = DefWithManyArgs {delta=0, name="foo", ats="@@", argnames="aa bb cc dd ee ff gg hh"}
dma = DefWithManyArgs.fromnames("foo", "aa bb cc dd ee ff gg hh")
= dma:subst [[<argname:2>]]
= dma:subst [[<setargname:2>]]
= dma:subst [[<setargnames0:3>]]
= dma:subst [[<setargnames0:3>]]
= dma:subst [[<setargnames1:>]]
= dma:subst "<setargnames1:><advance:>\n<setargnames1:>"
dma = DefWithManyArgs.fromnames("foo", "aa bb cc dd ee ff gg hh")
= dma:subst "<setargnames1:><advance:>\n<setargnames1:>"
dma = DefWithManyArgs.fromnames("foo", "aa bb cc dd ee ff gg hh")
= dma:subst "<mapremaining:setargnames1>"
dma = DefWithManyArgs.fromnames("foo", "aa bb cc dd ee ff gg hh")
= dma:setargnames2()
= dma:subst("\\def\\<v:name><v:ats><argsN:>{%\n"..
" <setargsN:>%\n"..
" \\<v:name>@<v:ats>}\n")
--]==]
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "defwithmanyargs.lua"
dma = DefWithManyArgs {delta=0}
dma = DefWithManyArgs {delta=0, name="foo", ats="@@"}
= dma:subst "foo <setarg:3> plic"
= dma:subst "foo <setargs:5> plic"
= dma:subst "foo <args:5><setargs:5> plic"
= dma:subst "foo <args:5><v:remaining> plic"
= dma:subst [[\def\<v:name><v:ats><args:5>{%
<setargs:5>
}]]
= dma:subst [[\def\<v:name><v:ats><argsN:>{%
<setargsN:>%
\<v:name>@<v:ats>}]]
dma = DefWithManyArgs {name="Foo", remaining=23, body="BLA"}
= dma:defNs()
dma = DefWithManyArgs {name="Foo", remaining=23, body="BLA"}
= dma:deffull()
dma = DefWithManyArgs {name="Foo", remaining=10, body="BLA"}
= dma:deffull()
= defwithmanyargs("Boo", 12, "BAR")
--]==]
-- «Bottle» (to ".Bottle")
-- (find-es "tex" "more-than-9-args")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "defwithmanyargs.lua"
= defwithmanyargs("Bottle", 10, "\\BottleCore")
= defwithmanyargs("WideBottle", 14, "\\WideBottleCore")
--]]
-- «SetManyArgs» (to ".SetManyArgs")
SetManyArgs = Class {
type = "SetManyArgs",
from = function (name, argnames)
local n = #split(argnames)
return SetManyArgs {name=name, argnames=argnames, remaining=n}
end,
__index = {
subst = function (sma, str)
local f = function (method, arg) return sma[method](sma, arg) end
return (str:gsub("<(.-):(.-)>", f))
end,
advanceat = function (sma) sma.ats = sma.ats.."@"; return "" end,
advance = function (sma)
sma.ats = sma.ats .. "@"
sma.delta = sma.delta + 5
sma.remaining = sma.remaining - 5
return ""
end,
mapn = function (sma, method, n)
return mapconcat(function (k) return sma[method](sma, k) end, seq(1, n))
end,
mapremaining = function (sma, method)
local A = {}
while sma.remaining > 0 do
table.insert(A, sma[method](sma, sma:N()))
sma:advance()
end
return table.concat(A, "\n")
end,
--
ats = "",
delta = 0,
remaining = 7,
N = function (sma) return min(sma.remaining, 5) end,
v = function (sma, fieldname) return sma[fieldname] end,
N = function (sma) return min(sma.remaining, 5) end,
v = function (sma, fieldname) return sma[fieldname] end,
arg = function (sma, n) return "#"..n end,
args = function (sma, n) return sma:mapn("arg", n) end,
argsN = function (sma, _) return sma:args(sma:N()) end,
setarg = function (sma, n) return "\\sa{"..sma.delta+n.."}{#"..n.."}" end,
setargs = function (sma, n) return sma:mapn("setarg", n) end,
setargsN = function (sma, _) return sma:setargs(sma:N()) end,
--
argname = function (sma, n)
return split(sma.argnames)[n + sma.delta] end,
setargname = function (sma, n)
return sma:subst("\\sa{<argname:"..n..">}{#"..n.."}") end,
setargnames0 = function (sma)
return sma:mapn("setargname", sma:N()) end,
vnameats = function (sma) return sma:subst "\\<v:name><v:ats>" end,
vnameats1 = function (sma) return sma:subst "\\<v:name>@<v:ats>" end,
vnameats1opt = function (sma)
return sma.remaining > 5 and sma:vnameats1() or "" end,
setargnames1 = function (sma)
return sma:subst("\\def<vnameats:><argsN:>{%\n"..
" <setargnames0:>%\n"..
" <vnameats1opt:>}")
end,
setargnames2 = function (sma)
return sma:subst "<mapremaining:setargnames1>" end,
setargnames3 = function (sma)
return sma:subst("\\makeatletter\n"..
"\\def<vnameats:>#1{<vnameats1:>#1}<advanceat:>\n"..
"<setargnames2:>\n"..
"\\makeatother")
end,
},
}
setmanyargs = function (name, argnames)
return SetManyArgs.from(name.."SetArgs", argnames):setargnames3()
end
-- «SetManyArgs-tests» (to ".SetManyArgs-tests")
--
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "defwithmanyargs.lua"
sma = SetManyArgs.from("FooSetArgs", "aa bb cc dd ee ff gg hh")
= sma:setargnames3()
= setmanyargs( "Bottle", "32 20 21 22 10 11 12 00 01 02")
= setmanyargs("WideBottle", "32 33 20 21 22 23 10 11 12 13 00 01 02 03")
= setmanyargs("OArtDecoN", "32 33 20 21 22 23 10 11 12 13 00 01 02 03")
= setmanyargs("ArtNouveauN", "3_ _3 2_ _2 1_ _1")
--]==]
--[[
texdef = function (Sh, lower)
local out = ""
local printf = function (...) out = out..format(...) end
local w, h = Sh.width, Sh.height
local pw = 6 * w + 2
local ph = 12 * h
local name = Sh.name
local args = texargs[Sh.nvertices]
local plower = (lower or 0) * 12
printf("\\def\\dag%s%s{%%\n", name, args)
printf(" \\dagpicture(%d,%d)(-4,0)[%d]{\n", pw, ph, plower)
for i,xy in ipairs(Sh.coords) do
local x, y = xy[1], xy[2]
local px, py = (x-1)*6, (h-y)*12
printf(" \\dagput(%3d,%3d){$#%d$}\n", px, py, i)
end
printf(" }}\n")
return out
end,
--]]
-- «run» (to ".run")
-- (find-angg ".emacs" "tex-def-many")
if arg and arg[1] == "--longdef" then
name = arg[2]
np = tonumber(arg[3])
body = arg[4] or "% body\n"
print(fulldef_(np))
end
--[[
-- Tests.
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
ee_dofile "~/LUA/defwithmanyargs.lua"
= fulldef_(16)
= fulldef_(20)
= mapconcat(ha, seq(1, 5))
= mapconcat(saf(3), seq(1, 5))
= da(0)..da(1)..da(2)
= dal(3, 1)
= dal(3, 5)
-- «test-arg» (to ".test-arg")
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
arg = {"--longdef", "sixt", "16"}
ee_dofile "~/LUA/defwithmanyargs.lua"
arg = {"--longdef", "sixt", "20", "% bbooddyy\n% bboo\n"}
ee_dofile "~/LUA/defwithmanyargs.lua"
-- «test-run» (to ".test-run")
-- (find-sh "~/LUA/defwithmanyargs.lua -run rect 12")
-- (find-sh "~/LUA/defwithmanyargs.lua -run rect 12 '% body\n% body\n'")
-- (find-angg ".emacs" "tex-def-many")
--]]
-- Local Variables:
-- coding: raw-text-unix
-- modes: (fundamental-mode lua-mode)
-- End: