Estoy utilizando ConTeXt
para 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 Lua
función inspirada en Lua
wiki. Desafortunadamente, no sé cómo pasar una tabla completa definida a \setdataset
una Lua
macro.
\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
\datasetvariable
devuelve solo una variable, no una tabla completa, y estoy un poco perdido con la estructura de datos del *tuc
archivo. ¿Cómo puedo declarar mi función Total para pasar todas Asterix
las 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 dataset
fallaron. Gracias a @Wolfgang Schuster, entendí que se trata de un problema de formato que jugar tonumber
no 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