Hi,
I'm checking out some old experiments (either use or drop 'm) and here's
one that made it into lmtx in the end (not much code). We have a bunch
of arrays in the engine: \uccode, \lccode, \sfcode, \efcode, catcodes
etc and while traditional tex just has 256 slot arrays in luatex these
are sparse: it saves memory because often these lists cover a small
range of unicode.
Because this is kind of a general mechanism, I've added a lua interface
to 'user sparse arrays' shown in the following examples (they can be 1,
2 or 4 bytes numbers):
\setuplayout[tight] \setupbodyfont[tt,10pt]
\starttext
\startluacode
local d = io.loaddata(resolvers.findfile("tufte.tex"))
local a = sparse.new()
for v in string.utfvalues(d) do
-- sparse.set(a,v,sparse.get(a,v)+1)
a[v] = a[v] + 1
end
for i, v in sparse.traverse(a) do
if i > 32 and v > 0 then
context("%03i %U\\crlf",i,i)
end
end
\stopluacode
\blank
\startluacode
local a = { }
local y = string.byte("1")
local n = string.byte("0")
for i=1,20 do
a[i] = sparse.new(1,n) -- bytes (1|2|4) | default
end
for i=8,15 do
local ai = a[i]
for j=10,15 do
-- sparse.set(ai,j,y)
ai[j] = y
end
end
for i=1,20 do
a[i] = sparse.concat(a[i],1,20)
end
context(table.concat(a,"\\crlf"))
\stopluacode
\blank
\codedef\mycode
{ \mycode 999 = 123} 000 = \the\mycode999\par
{\global\mycode 999 = 124} 124 = \the\mycode999\par
{ \mycode 999 = 125} 124 = \the\mycode999\par
\stoptext
Often using a lua array or hash is more efficient, but when you allocate
many real large sets the sparse arrays might win. I can add more options
at the tex end, like wipe, concat, prealloc, save, load, always global
etc. but that depends on expected usage of which I have no clue (but as
usual with tex features, at some point they will be used in unexpected
ways).
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
-----------------------------------------------------------------
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the
Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage : http://www.pragma-ade.nl / http://context.aanhet.net
archive : https://bitbucket.org/phg/context-mirror/commits/
wiki : http://contextgarden.net
___________________________________________________________________________________