Pasar una tabla completa construida con variables del conjunto de datos a una función Lua

Pasar una tabla completa construida con variables del conjunto de datos a una función Lua

Estoy utilizando ConTeXtpara marcar a mis alumnos de forma semiautomática. Mis comentarios y calificaciones se almacenan en una variable de conjunto de datos, como en el MWE a continuación. Estoy intentando sumar puntos automáticamente usando una Luafunción inspirada en Luawiki. Desafortunadamente, no sé cómo pasar una tabla completa definida a \setdatasetuna 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

\datasetvariabledevuelve solo una variable, no una tabla completa, y estoy un poco perdido con la estructura de datos del *tucarchivo. ¿Cómo puedo declarar mi función Total para pasar todas Asterixlas claves y valores (es decir, la tabla de Astérix) como una variable?

Espero \Total{Astérix}devolver 1 y \Total{Obélix}devolver 2.

Sospecho que podría ser más fácil hacer todo en Lua, pero todavía no puedo hacerlo.

Respuesta1

Todos mis intentos de uso datasetfallaron. Gracias a @Wolfgang Schuster, entendí que se trata de un problema de formato que jugar tonumberno resolvió. Una solución funcional (y más corta) es almacenar esas tablas directamente en lua. Para que conste y para aquellos que son novatos en lua, como yo, las cadenas están entre comillas, los números no.

\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

información relacionada