データセット変数で構築されたテーブル全体をLua関数に渡す

データセット変数で構築されたテーブル全体をLua関数に渡す

私はConTeXt半自動で生徒に採点するために使用しています。コメントと成績は、以下の MWE のようにデータセット変数に保存されます。WikiLuaにヒントを得た関数を使用して、ポイントを自動的に合計しようとしています。残念ながら、 で定義されたテーブル全体をマクロにLua渡す方法がわかりません。\setdatasetLua

\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テーブル全体ではなく、1 つの変数のみを返すため、ファイルのデータ構造が少しわかりません*tuc。すべてのキーと値 (つまり Astérix のテーブル) を変数として渡すように Total 関数を宣言するにはどうすればよいですかAsterix?

\Total{Astérix}1 を返し、2 を返すことを期待します\Total{Obélix}

全体を で行う方が簡単かもしれないと思うのですLuaが、まだそれができません。

答え1

使用しようとした試みはすべてdataset失敗しました。@Wolfgang Schuster のおかげで、これはフォーマットの問題であり、いじってもtonumber解決しないことを理解しました。機能的でより短い解決策は、これらのテーブルを直接 lua に保存することです。記録のために、そして私のように lua 初心者である人のために、文字列は引用符で囲みますが、数値はそうではありません。

\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

関連情報