Passar uma tabela inteira construída com variáveis ​​do conjunto de dados para uma função Lua

Passar uma tabela inteira construída com variáveis ​​do conjunto de dados para uma função Lua

Estou usando ConTeXtpara marcar minhas pupilas de forma semiautomática. Meus comentários e notas são armazenados na variável do conjunto de dados, como no MWE abaixo. Estou tentando somar pontos automaticamente usando uma Luafunção inspirada no Luawiki. Infelizmente não sei como passar uma tabela inteira definida para \setdatasetuma Luamacro.

\startluacode
   userdata = userdata or {}
   -- http://lua-users.org/wiki/SimpleStats
   function userdata.somme(n)
   local sum=0
   -- loop sur key=value d’une table
   for k,v in pairs(t) do
      -- si c’est un nombre, on ajoute à la somme
      if type(v) == 'number' then
         sum=sum+v
      end
   end
   return sum
end
\stopluacode

%how to declare a whole list?
\def\Total#1{userdata.somme(#1)}

\setdataset [Exercice] [Astérix]
   [introduction={Nice try},
    PointsIntro={1},
    conclusion={where is it?},
    PointsConclusion={0},
    Bonus={did you take your magic potion?},
    PointsBonus={},
   ]

\setdataset [Exercice] [Obélix]
   [introduction={too big},
    PointsIntro={1},
    conclusion={don't hurt me!},
    PointsConclusion={0},
    Bonus={you didn't need any magic potion},
    PointsBonus={1},
   ]

\starttext

\Total{Astérix}

\Total{Obélix}
\stoptext

\datasetvariableretorna apenas uma variável, não uma tabela inteira, e estou um pouco perdido com a estrutura de dados do *tucarquivo. Como posso declarar minha função Total para passar todas Asterixas chaves e valores (que é a tabela do Astérix) como uma variável?

Espero \Total{Astérix}retornar 1 e \Total{Obélix}retornar 2.

Suspeito que seja mais fácil fazer tudo isso Lua, mas ainda não sou capaz de fazer isso.

Responder1

Todas as minhas tentativas de uso datasetfalharam. Graças ao @Wolfgang Schuster, entendi que é um problema de formato, que brincar tonumbernão resolveu. Uma solução funcional - e mais curta - é armazenar essas tabelas diretamente em lua. Para os registros e para aqueles que são novatos em lua, como eu, as strings estão entre aspas, os números não.

\startluacode
   userdata = userdata or {}
   -- http://lua-users.org/wiki/SimpleStats
   function userdata.somme(t)
   local sum=0
   -- loop on table key=value
   for k,v in pairs(t) do
      -- if it is a number, then sumed
      if type(v) == 'number' then
         sum=sum+v
      end
   end
   return sum
end

Astérix = {
    introduction="Nice try",
    PointsIntro=2,
    conclusion="where is it?",
    PointsConclusion=0,
    Bonus="did you take your magic potion?",
    PointsBonus=0,
}

Obélix = {
    introduction="too big",
    PointsIntro=1,
    conclusion="don't hurt me!",
    PointsConclusion=2,
    Bonus="you didn't need any magic potion",
    PointsBonus=0,
}
\stopluacode


\starttext

Astérix: \ctxlua{context(userdata.somme(Astérix))}

Obélix: \ctxlua{context(userdata.somme(Obélix))}
\stoptext

informação relacionada