《루아프로그래밍》 독서노트 제8장: 번역, 집행과 오류

4853 단어
비록 Lua는 해석형 언어이지만, Lua는 원본 코드를 실행하기 전에 먼저 원본 코드를 중간 형식으로 미리 컴파일할 수 있도록 허용한다.사실 해석형 언어를 구분하는 주요 기능은 물고기가 그것을 컴파일할 수 있는지가 아니라 컴파일러가 언어 운행 라이브러리의 일부인지, 즉 동적 생성을 실행할 수 있는 능력(그리고 쉽게) 있는 코드인지에 있다.Dofile 같은 함수가 존재하기 때문에 Lua를 해석형 언어라고 할 수 있다고 할 수 있다.

8.1 번역


8.1.1 loadfile


Lua에서 dofile 함수는 Lua 코드 블록을 실행하는 데 사용되지만 실제로dofile는 보조 함수일 뿐이고loadfile는 진정한 핵심 작업을 했다.loadfile은 파일에서 Lua 코드 블록을 불러오지만 코드를 실행하지 않고 코드를 컴파일하여 컴파일 결과를 함수로 되돌려줍니다.또한loadfile는 오류를 일으키지 않습니다. 오류 값만 되돌려주고 오류를 처리하지 않습니다.일반 dofile은 다음과 같이 정의됩니다.
function dofile(filename)
    local f = assert(loadfile(filename))
    return f()
end

loadfile가 실패하면 assert에서 오류가 발생합니다.

8.1.2 loadstring


함수loadstring은loadfile와 유사하지만 파일에서 코드를 읽는 것이 아니라 문자열에서 코드를 읽는 것이 다르다.loadstring은 비용이 많이 드는 함수이므로 조심스럽게 사용해야 한다.코드에 오류가 있으면loadstring은nil을 되돌려줍니다.loadstring은 호출할 때마다 코드를 컴파일합니다.loadsting은 컴파일할 때 문법역을 포함하지 않습니다.
i=32
local i = 0
f = loadstring("i=i+1; print(i)")
g = function() i=i+1; print(i) end
f()     -->3,      i
g()     -->1,      i

loadstring의 가장 전형적인 용법은 외부 코드를 실행하는 것이다. loadstring의 기대 입력은 하나의 프로그램 블록, 즉 일련의 문장이다.

8.2 C 코드


Lua 코드와 달리 C 코드는 사용하기 전에 응용 프로그램에 먼저 체인을 연결해야 하는데 가장 간단한 방식은 동적 링크 메커니즘이다.Lua는 몇 가지 플랫폼을 위해 동적 링크 메커니즘을 실현했다.Lua가 제공하는 동적 링크에 대한 기능은 모두 하나의 함수에 모인다. 패키지.loadlib, 이 함수는 두 개의 문자열 인자가 있습니다. 동적 링크의 전체 경로와 함수 이름입니다.
    local path = "/user/local/lib/lua/5.1/socket.so"
    local f = package.loadlib(path, "luaopen_socket")

loadlib은 매우 밑바닥의 함수입니다.완전한 라이브러리 경로와 정확한 함수 이름을 제공해야 합니다.보통 Require를 사용하여 C 프로그램 라이브러리를 불러옵니다. 이 함수는 지정한 라이브러리를 검색한 다음loadlib로 라이브러리를 불러오고 초기화 함수를 되돌려줍니다.

8.3 오류


Lua는 다음과 같은 명시적인 error 함수를 사용하여 오류를 일으킬 수 있습니다.
if not  then error() end

그와 같은 가격은 asserth 함수이다
assert(, )      -->         

8.4 오류 예외 및 처리


Lua에서 오류를 처리하려면 함수 pcall을 사용하여 실행할 코드를 포장해야 합니다.사용 방법은 pcall을 통해 오류를 일으킬 수 있는 함수를 호출하는 것입니다.
if pcall(foo) then
    
else
    
end

pcall 함수는 '보호 모드' 로 첫 번째 인자를 호출합니다. 함수 실행종의 모든 오류를 포착할 수 있으며, 이로써 Lua에서 모든 이상 처리를 완성할 수 있습니다.

8.5 오류 정보와 트레이스


error 메시지는 일반적으로 오류 내용을 설명하는 문자열로 오류 발생에 대한 알 수 없는 정보를 추가합니다.error 함수는 두 번째 추가 매개 변수 층 level도 있습니다. 호출 층의 함수를 지정하여 현재 오류를 보고합니다. 즉, 물은 누가 오류를 책임져야 하는지를 설명합니다.
function foo(str)
    if type(str) ~= "string" then
        error("string expected", 2)
    end
    end

또한 debug 라이브러리는 두 개의 일반적인 오류 처리 함수를 제공합니다. 하나는 debug입니다.debug, 사용자가 오류의 원인을 검사할 수 있도록 Lua 알림을 제공합니다.다른 하나는 debug입니다.traceback, 호출 창고에 따라 확장된 오류 메시지를 구축합니다. 이 함수를 언제든지 호출해서 현재 실행 중인 창고 정보를 얻을 수 있습니다.이 두 함수는 xpcall 함수에 맞추어 사용할 수 있으며, xpcall은 pcall보다 매개 변수 - 오류 처리 함수가 하나 더 있습니다.오류가 발생하면 Lua에서 오류 처리 함수를 호출합니다.

좋은 웹페이지 즐겨찾기