데이터 세트 변수로 구축된 전체 테이블을 Lua 함수에 전달

데이터 세트 변수로 구축된 전체 테이블을 Lua 함수에 전달

나는 ConTeXt반자동 방식으로 학생들을 표시하는 데 사용하고 있습니다. 내 댓글과 성적은 아래 MWE와 같이 데이터세트 변수에 저장됩니다. 위키 Lua에서 영감을 받은 기능 을 사용하여 자동으로 포인트를 합산하려고 합니다 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. 모든 Asterix키와 값(Asterix의 테이블)을 변수로 전달하도록 Total 함수를 선언하려면 어떻게 해야 합니까 ?

나는 \Total{Astérix}1을 반환하고 \Total{Obélix}2를 반환할 것으로 예상합니다.

에서 모든 작업을 수행하는 것이 더 쉬울 수도 있지만 Lua아직은 수행할 수 없습니다.

답변1

모든 사용 시도가 dataset실패했습니다. @Wolfgang Schuster 덕분에 이것이 형식 문제이며 가지고 놀아도 tonumber해결되지 않는다는 것을 이해했습니다. 효과적이고 더 짧은 솔루션은 해당 테이블을 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

관련 정보