將使用 datasetvariables 建構的整個表傳遞給 Lua 函數

將使用 datasetvariables 建構的整個表傳遞給 Lua 函數

我習慣ConTeXt以半自動的方式標記我的學生。我的評論和成績儲存在資料集變數中,如下面的 MWE 所示。我正在嘗試使用Lua受 wiki 啟發的函數自動求和點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僅返回一個變量,而不是整個表,並且我對文件中的數據結構有點迷失*tuc。如何聲明我的 Total 函數以將所有Asterix鍵和值(即 Astérix 的表)作為變數傳遞?

我期望\Total{Astérix}返回 1 和\Total{Obélix}返回 2。

我懷疑在 中完成整個事情可能會更容易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

相關內容