![将使用数据集变量构建的整个表传递给 Lua 函数](https://linux22.com/image/405511/%E5%B0%86%E4%BD%BF%E7%94%A8%E6%95%B0%E6%8D%AE%E9%9B%86%E5%8F%98%E9%87%8F%E6%9E%84%E5%BB%BA%E7%9A%84%E6%95%B4%E4%B8%AA%E8%A1%A8%E4%BC%A0%E9%80%92%E7%BB%99%20Lua%20%E5%87%BD%E6%95%B0.png)
我正在使用ConTeXt
半自动化方式为学生评分。我的评论和成绩存储在数据集变量中,如下面的 MWE 所示。我正在尝试使用Lua
受 wiki 启发的函数自动求和分数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
只返回一个变量,而不是整个表,我对文件中的数据结构有点困惑*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