Lua Tutorial 2, Programming in Lua by 신동호

참조 문서: http://lua-users.org/wiki/TutorialDirectory

본 문서는 Lua Tutorial 의 일부를 발췌하여 간단하게 lua 문법과 활용 예제를 정리하고 있습니다.

ControlStructureTutorial

while 문

while [exp] do [block] end

repeat 문 - C 스타일의 do .. while 문과 같습니다.

repeat [block] until [exp]

for 문

숫자를 올려 가면서 루프를 돌릴 수 있습니다. 아래 구문은 1 에서 3까지 루프를 돌게 됩니다.

> for count = 1, 3 do print(count) end
1
2
3

숫자의 변화량을 조절할 수 있습니다. 기본은 1 이고 아래 예제는 -1 로 설정하여 값이 줄도록 하였습니다.

> for count = 3, 1, -1 do print(count) end
3
2
1

변화 폭은 정수가 아니어도 상관 없습니다.

> for count = 1, 0, -0.25 do print(count) end
1
0.75
0.5
0.25
0

앞전에 살펴본 pairs, ipairs 를 사용하여 table 을 순환할 수도 있습니다.

> for key,value in pairs(t) do print(key,value) end
3       10
1       3
4       17
2       7
pi      3.14159
banana  yellow

> for index,value in ipairs(t) do print(index,value) end
1       3
2       7
3       10
4       17

io 를 사용하여 파일을 라인씩 읽으면서 처리하는 구문도 간단합니다.

> for line in io.lines("my.txt") do print(line) end
This is
some sample text
for Lua.

아래는 file 을 사용한 좀 더 복잡한 예제입니다.

file = assert(io.open("list.txt", "r"))
local line = file:read()
if string.sub(line, 1, 1) ~= '#' then
  ProcessLine(line) -- File doesn't start with a comment, process the first line
end
-- We could also loop on the first lines, while they are comment
-- Process the remainder of the file
for line in file:lines() do
  ProcessLine(line)
end
file:close()

if 문

if [exp] then [block] { elseif [exp] then [block] } [ else block ] end

ForTutorial

FunctionCallTutorial

ScopeTutorial

local 키워드를 사용하면 지역 변수를 만들 수 있습니다.

do [block] end 구문을 사용하여 간단하게 지역 영역을 코딩할 수 있습니다.

> do local seven = 7 print(seven) end
7
> print(seven)
nil

ModulesTutorial

모듈 생성 및 사용하기

아래와 같은 a.lua 파일을 사용하여 쉽게 모듈을 만들 수 있습니다.

module(..., package.seeall);

function foo() print("Hello World!") end

특별한 테이블인 package 는 뒤에서 설명하게 될 것입니다. 지금은 단순히 모듈을 어떻게 사용하는지에 초점을 맞추어 보도록 하겠습니다.

> require "a"
> a.foo()
Hello World!

모듈을 다시 로드하는 것은 약간의 트릭이 필요합니다. 왜냐하면, Lua 케쉬가 이미 모듈을 로드하고 있기 때문입니다. package.loaded 테이블에서 직접 로딩된 모듈을 제거해 줍니다.

우리는 a.lua 에 있는 foo 함수를 수정하여 "Hello Module!" 를 출력하도록 하였습니다. 이전과 같은 방식으로 코드를 호출하면 이미 로딩되어 있는 a 가 사용되어 같은 결과를 가져올 것입니다. 아래와 같이 로딩된 모듈을 제거하고 다시 로드하는 방식을 사용합니다.

> package.loaded.a = nil; require "a"
> a.foo()
Hello Module!

재미있는 점은 패키지의 이름을 마음대로 바꾸어 사용할 수 있다는 점입니다.

> require "a"
> bar = a
> bar.foo()
Hello Module!

The package table

앞에서 잠시 살펴 보았던 package 테이블은 몇 가지 특별한 필드를 가지고 있습니다.

> table.foreach(package, print)
preload table: 0x806d058
loadlib function: 0x806cbe0
loaded  table: 0x806b930
loaders table: 0x806cc50
cpath   ./?.so;/usr/local/lib/lua/5.1/?.so;/usr/lib/lua/5.1/?.so;/usr/local/lib/l ..
ua/5.1/loadall.soconfig  /
;
?
!
-
path    ./?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lu ..
a;/usr/local/lib/lua/5.1/?.lua;/usr/local/lib/lua/5.1/?/init.lua;/usr/share/lua/5 ..
.1/?.lua;/usr/share/lua/5.1/?/init.lua

흥미있는 부분은 package.path 부분입니다. Lua 는 파일을 검색하여 '?' 부분을 파일 이름으로 채웁니다. 물론 여러분의 시스템(Windows) 에서는 조금 다르게 보일 수 있습니다.

package.loaded 는 테이블 로써 이미 로딩되어 있는 모듈의 이름을 저장하고 있으며 수정 가능합니다.

package.seeall 은 특별한 함수로써, 전역 환경에서 모듈을 사용할 수 있게 도와줍니다.

트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://aronze.egloos.com/tb/1416070 [도움말]

덧글

덧글 입력 영역