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