Ich verwende es, ConTeXt
um meine Schüler halbautomatisch zu benoten. Meine Kommentare und Noten werden in einer Datensatzvariable gespeichert, wie im MWE unten. Ich versuche, Punkte automatisch mithilfe einer Lua
von Wiki inspirierten Funktion zu summieren Lua
. Leider weiß ich nicht, wie ich eine ganze mit definierte Tabelle \setdataset
an ein Lua
Makro übergeben kann.
\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
gibt nur eine Variable zurück, nicht eine ganze Tabelle, und ich bin mit der Datenstruktur der Datei etwas überfordert *tuc
. Wie kann ich meine Total-Funktion so deklarieren, dass sie alle Asterix
Schlüssel und Werte (also die Tabelle von Astérix) als Variable übergibt?
Ich erwarte, \Total{Astérix}
1 und \Total{Obélix}
2 zurückzugeben.
Ich vermute, dass es einfacher wäre, das Ganze in zu erledigen Lua
, aber ich bin noch nicht dazu in der Lage.
Antwort1
Alle meine Versuche schlugen dataset
fehl. Dank @Wolfgang Schuster habe ich verstanden, dass es sich um ein Formatproblem handelt, das sich durch Herumspielen tonumber
nicht lösen ließ. Eine funktionierende – und kürzere – Lösung besteht darin, diese Tabellen direkt in Lua zu speichern. Für die Protokolle und für diejenigen, die wie ich Lua-Neulinge sind: Zeichenfolgen stehen in Anführungszeichen, Zahlen nicht.
\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