LuaTeX : Lua 모범 코딩 사례

Nov 17 2020

여러 외부 lua 파일에서 lua 코드를 분할 및로드하고 다른 lualatex 패키지의 lua 코드를 처리 할 때 따라야 할 모범 코딩 사례는 무엇입니까? 이 생각은 내가로드하고 사용할 수있는 많은 lua 파일을 가지고 있기 때문에 떠 오릅니다. 그러나 가장 명확하게 분할 된 코드는 아닙니다. 여기에서 "Side-note"로 묻는 몇 가지 질문은 더 명확하게 (및 추가) 아래에서 반복됩니다.

  1. 범위 및 외부 lua 파일에서 "로컬 변수"의 가능한 이름 충돌과 관련하여 :이 질문의 linebreak.lua 파일 에서 지역 변수의 범위는 무엇 local n, head, last입니까? "require"와 비슷한 이름의 지역 변수를 가진 다른 lua 파일을로드하면 문제가 될까요? 루아는로드되는 파일의 함수에 로컬 변수를 유지합니까? (글로벌 네임 스페이스에 방금로드 한 경우에도)

  2. 파일의 변수 및 함수가 다른 파일의 변수와 충돌 / 재정의 / 간섭하지 않도록하는 가장 좋은 방법은 무엇입니까?

  3. lualatex 패키지 개발자가 글로벌 네임 스페이스에 추가하는 내용을 문서화하는 문서 지침의 일부입니까? lualatex 패키지가 전역 네임 스페이스에 이름을 쓰고 내 변수 / 함수 이름과 충돌하는 경우 디버깅을 시작하기에 가장 좋은 곳은 어디입니까?

  4. 두 개의 서로 다른 directlua / latelua 블록 사이의 범위는 무엇입니까? 내 관찰에서 로컬 변수는 directlua 블록에 로컬이며, 과거에는 한 directlua 블록에서 다른 블록으로 값을 "전달"하기 위해 전역 네임 스페이스를 사용했습니다. 글로벌 네임 스페이스를 사용하지 않는 더 깨끗한 방법이 있습니까?

답변

3 JosephWright Nov 17 2020 at 11:18

Lua 변수는 정의 된 함수 또는 범위에 국한됩니다. 별도의 소스 파일이 범위를 구성하므로 각각 require()변수가 해당 파일에 대해 로컬임을 의미합니다. 이것은 \directlua호출 에도 해당 되지만 사소한 응용 프로그램 외에 한 \directlua{require("myfile")}줄을 사용하여 Lua 코드를로드해야 합니다. ' \directlua통화 간 정보 전달'에 대해 좀 더 언급하기 위해서는 당신이하고있는 일에 대한 더 자세한 설명이 필요하다고 생각 합니다.

일반적으로 전역을 처리하는 가장 좋은 방법은 단일 테이블을 선언하고 모든 전역 자료를 포함하는 것입니다. 몇 가지 방법이 있지만 예를 들면 다음과 같습니다.

foo = foo or { }
foo.my_func = function(...)
end

또는

foo = foo or { }
local function my_func(...)
end
foo.my_func = foo.my_func or my_func

원하는 경우 글로벌 테이블에 대한 안전 테스트를 포함 할 수 있습니다.

if foo then
  print("Oh no, someone has taken my table")
  os.exit(1)
end

글로벌 네임 스페이스를 처리하기위한 공식 문서 / 시스템은 없습니다. TeX 매크로에 사용되는 것과 동일한 접근 방식을 따르는 것이 좋습니다. 패키지 이름에 따라 합리적인 이름을 선택하십시오.