[NTG-context] Writing to .tuc directly from Lua

Hans Hagen j.hagen at xs4all.nl
Wed Mar 24 22:47:02 CET 2021


On 3/24/2021 6:33 PM, Jairo A. del Rio wrote:
> Hi, Hans. Here's my (miserably failing) attempt:
> 
> \definedataset[nicedata]
> 
> \starttext
> 
> \startluacode
> 
> local name = "nicedata"
> 
> 
> -- For exposition only
> 
> local function dofactorial(n)
> 
> local function inner(c,m)
> 
> if m<2 then return c end
> 
> return inner(c*m, m-1)
> 
> end
> 
> return inner(1,n)
> 
> end
> 
> 
> local function factorial(n)
> 
> local stringn = tostring(n)
> 
> if job.datasets.collected[name] then
> 
> return job.datasets.collected[name].factorial[stringn]
> 
> else
> 
> local mydata = {[stringn] = tostring(dofactorial(n))}
> 
> job.datasets.setdata{
> 
> name = name,
> 
> tag = "factorial",
> 
> data = mydata
> 
> }
> 
> return mydata[stringn]
> 
> end
> 
> end
> 
> 
> interfaces.implement{
> 
> name = "factorial",
> 
> public = true,
> 
> arguments = {"string"},
> 
> actions = {tonumber, factorial, context}
> 
> }
> 
> 
> \stopluacode
> 
> \factorial{7}
> 
> \stoptext
> 
> 
> What happens is that, in each run, both the first and the second 
> conditions are met, so the compilation is twice as slow, the opposite 
> result of what I meant to do. How do I fix that?

\definedataset[nicedata]

\starttext

\startluacode

local function dofactorial(n)
	local function inner(c,m)
		if m < 2 then
             return c
         else
             return inner(c*m, m-1)
         end
	end
	return inner(1,n)
end

local function factorial(n)
     local data = job.datasets.getdata("factorials","list")
     if not data then
         data = { }
     end
     local f = data[n]
     if not f then
		f = dofactorial(n)
         data[n] = f
     end
     job.datasets.setdata {
         name = "factorials",
         tag  = "list",
         data = data
     }
     return f
end

interfaces.implement{
	name      = "factorial",
	public    = true,
	arguments = { "integer" },
	actions   = { factorial, context }
}

\stopluacode

\dorecurse {20} {
     \factorial #1 \relax
}

\stoptext

but you probably don't gain much as these factorials are not that slow 
(if you use them many times in a document you can just cache them)

Hans


-----------------------------------------------------------------
                                           Hans Hagen | PRAGMA ADE
               Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
        tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl
-----------------------------------------------------------------


More information about the ntg-context mailing list