El mié, 24 de mar. de 2021 a la(s) 16:47, Hans Hagen (j.hagen@xs4all.nl) escribió:
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


It does exactly what I need. It's good to know datasets can be directly generated, too. Thank you a lot!
 
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)


It was only a toy example. I intend to work with way larger numbers. :)
 
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
-----------------------------------------------------------------

Best regards,

Jairo