1. 예약어들(변수이름으로 사용불가)
and, local, break, nil, do, not, else, or, elseif, repeat, end, return, false, then, for, true, function, until, if, while, in
2. 스타일
- 상수는 대문자와 밑줄만 사용
- 변수는 소문자로 시작
- 전역 변수는 소문자 g로 시작
- 함수는 대문자로 시작
- 주석은 -- 로 시작 해서 그줄의 끝까지
- 묶음 주석은 --[[ ,]]-- 로 묶는다
3. 데이터형
- nil
- boolean
- string
- number (수치는 모두 배정도 부동소수점 값이다, 5.1버전부터 정수형식 추가)
- table
4. 관계 연산자
- == (table == table은 포인터(or 레퍼) 검사하는것과 같다)
- ~=
- <, >
- <=, >=
5. 논리 연산자
- and ( ex> if (a < b) and (b < 20) then ... end )
- or
- not ( ex> print(not (a == b)) )
6. 제어구조
- if ( ex> if 조건 then ... end )
- while 조건 do ... end
- repeat ... until 조건 -> do while 과 같음
- for 조건 do ... end
for indx = 10, 1, -1 do -- 1씩 줄어든다.
for indx = 1, 10 do -- 1에서 10까지 1씩 증가하면서 실행(증가값 없으면 1씩이다.)
- break
7. 함수
- function 함수이름( 인자 ) ... end
- ... (다중 argument다) arg table로 들어간다. arg.n은 갯수, arg[index]로 접근가능
- return 값 으로 반환 할수 있다. 여러 값을 반환 가능 return 값1, 값2, 값3
a, b, c = func() --> 통해서 다중 반환 값을 a, b, c 가 각각 받는다
※ 함수 중간에서 다른 함수를 호출하기 보다는, return 문에서 함수를 호출하면 return 문을 그 함수의 끝으로 보고 그 함수를 스택에서 제거후 즉시 다음 함수로 건너뜀 --> 함수 호출들이 꼬리에 꼬리를 물고 있는 상황이라도 스택이 넘치는 일을 방지 가능
8. 표준 라이브러리
- www.lua.org/manual/5.0/ 에서 열람 가능
- http://www.codenix.com/~tolua/ tolua 자료
- http://www.tecgraf.puc-rio.br/~celes/tolua/
- assert (청크)() -- 컴파일된 루아 스크립트 청크를 하나의 처리 함수처럼 실행 하도록 한다.
- loadstring("루아스크립트 string") -- 루아 스크립트 string으로 부터 청크를 적재, 컴파일
- loadfile("루아스크립트 파일") -- 루아 스크립트 file로 부터 청크를 적재, 컴파일(dofile()을 대신 주로 사용)
- loadstring() 으로만 청크를 실행 가능하다. assert는 에러 발생시 직접 언급하는 오류 메시지 보여줌, loadstring 경우 도움이 되지 않는 오류 메세지 출력
ex) assert(loadstring("print(\"hello\")"))()
ex) loadstring("print(\"hello\")")()
- 수학 함수들
-- math.floor() -- 주어진 수의 소수부를 버리고 정수로 변환
-- math.random() -- 난수 발생 (a, b) 경우 a, b 포함해서 그사이 발생
-- math.randomseed( seed값 ) -- seed 값은 보통 os.date("%d%H%M%S") 사용
-- math.min(), math.max()
- 문자열
-- tonumber(변수) -- 문자열을 수치로 변환, 반대 -- tostring()
-- string.char(n1, n2, ...) -- 주어진 수치 인수들을 ASCII값들로 해석하고 해당하는 문자들로 하나의 문자열을 만들어 돌려줌
-- string.len(myString) -- 문자열 길이를 돌려줌
-- string.sub(myString, start, end) -- 문자열의 한부분을 돌려줌
-- string.format() -- 문자열을 포매팅 하여 만든 문자열을 돌려줌
-- string.find(sourceString, findString) -- sourceString에서 findString 이 처음 나타난 부분의 시작과 끝 위치를 돌려줌, a, b = string.find(sourceString, findString)
- 문자열과 패턴
: filter = "$%d" -- 이것은 $로 시작하고 정수가 붙는 값만 통과 시키는 일종의 틀이다. string.find(string, filter) 이런식으로 사용가능하다
-- string.gsub(sourceString, pattern, replacementString) -- sourceString으로 주어진 문자열에서 pattern으로 지정된 패턴에 부합하는 부분을 replacementString으로 주어진 문자열로 치환한다.
-- string.gfind(srcString, pattern) -- 첫번째 인수로 주어진 문자열에서 두번째 인수로 주어진 패턴을 한번에 하나씩 차례로 찾아나간다.
- 테이블
-- table.getn(myTable) -- 테이블의 요소 갯수를 돌려줌
-- table.sort(myTable) -- 테이블의 요소들을 크기 비교를 통해서 오름차순으로 정렬
: 두번재 인자를 지정해서 크기비교 방식을 바꿀수 있다.
(ex) function Reverse(a, b) ... end -- Reverse 함수는 a, b 두개를 비교 연산 하여 true, false를 리턴하는 함수다.
table.sort(myTable, Reverse)
-- table.insert(myTable, position, value) -- 테이블에 새 요소를 추가
-- table.remove(myTable, position) -- 테이블에서 특정 요소를 제거하고 그 요소를 돌려줌
- 테이블 요소의 참조 표기 가능
ex) myData = {}
myData.name = "kino"
myData.age = 26
myData[1] = 3
myData[2] = 4
-- myData[index] 와 myData.키 를 같이 가질수 있다.
-- 다차원 배열
: myData.name[1] = "a"
myData.name[2] = "b"
-- pairs() -- 테이블의 요소를 한번에 하나씩 접근 할 때 사용(정수 색인 요소들에만 접근 하고 싶을 경우 ipairs())
ex) for index, value in pairs(myTable) do ... end
- 기본적인 입출력
-- myFile = io.open("파일이름", "w") -- "w" 옵은 c와 다른것은 존재 파일 열때 지우고 새로 만드는것이 아니라 열고 쓰기 위치를 파일의 시작으로 설정
-- if myFile ~= nil -- 로 검사후 파일 열거나 오류(nil 리턴) 를 체크하고 파일에 쓰거나 읽는다.
-- myFile:write(string) -- 연 파일에 쓰기
-- io.close(myFile) -- 파일 닫기
9. 루아를 c/c++ 프로그램에 통합
- Lua environment : 루아의 실행에 필요한 모든 자료(컴파일된 함수, 변수, 기타 작업용 메모리) 로 구성
-- 자료는 lua_State 구조체에 저장 (1나에서 여러개 여는것 가능)
-- 루아에게 자료를 보내거나 루아로부터 자료를 받는 수단으로 사용
- Lua Glue
-- C++로 작성된 함수를 루아 스크립트 안에서 호출 가능
- 기본적인 구현
//C로 작성된 루아헤더들을 C++이름 섞기 적용 말라는 표시를 해줘서 인클루드 한다
extern "C" {
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
}
//루아 글루 함수 들을 정의 - 마찬가지로 C++ 이름 섞기방지
extern "C" {
int _Test(lua_State * L) {
}
int _Test2(lua_state * L) {
}
...
}
int main() {
//루아 환경 생성
lua_State * L = luaL_newstate(); //lauxlib.h 필요 - 자동을 alloc 해주는 함수, 직접 함수 정의 가능
luaopen_base(L); //루아 표준 라이브러리를 초기화
//루아글루 등록
lua_register(L, "Test", _Test);
lua_register(L, "Test2", _Test2);
//기타 함수
luaL_loadbuffer(L, const char * buff, int strlen, int);
luaL_loadfile(L, "루아파일이름"); //파일 열기
lual_resume(L, int); //엔진내로 읽어들임
lua_pcall(L, int, int, int);
luaL_checkstring(L, int);
//루아 해제 함수
lua_close(L);
}