Estou usando ConTeXt
para marcar minhas pupilas de forma semiautomática. Meus comentários e notas são armazenados na variável do conjunto de dados, como no MWE abaixo. Estou tentando somar pontos automaticamente usando uma Lua
função inspirada no Lua
wiki. Infelizmente não sei como passar uma tabela inteira definida para \setdataset
uma Lua
macro.
\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
retorna apenas uma variável, não uma tabela inteira, e estou um pouco perdido com a estrutura de dados do *tuc
arquivo. Como posso declarar minha função Total para passar todas Asterix
as chaves e valores (que é a tabela do Astérix) como uma variável?
Espero \Total{Astérix}
retornar 1 e \Total{Obélix}
retornar 2.
Suspeito que seja mais fácil fazer tudo isso Lua
, mas ainda não sou capaz de fazer isso.
Responder1
Todas as minhas tentativas de uso dataset
falharam. Graças ao @Wolfgang Schuster, entendi que é um problema de formato, que brincar tonumber
não resolveu. Uma solução funcional - e mais curta - é armazenar essas tabelas diretamente em lua. Para os registros e para aqueles que são novatos em lua, como eu, as strings estão entre aspas, os números não.
\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