Übergeben Sie eine ganze Tabelle, die mit Datensatzvariablen erstellt wurde, an eine Lua-Funktion

Übergeben Sie eine ganze Tabelle, die mit Datensatzvariablen erstellt wurde, an eine Lua-Funktion

Ich verwende es, ConTeXtum 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 Luavon Wiki inspirierten Funktion zu summieren Lua. Leider weiß ich nicht, wie ich eine ganze mit definierte Tabelle \setdatasetan ein LuaMakro ü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

\datasetvariablegibt 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 AsterixSchlü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 datasetfehl. Dank @Wolfgang Schuster habe ich verstanden, dass es sich um ein Formatproblem handelt, das sich durch Herumspielen tonumbernicht 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

verwandte Informationen