레이블이 Lua인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Lua인 게시물을 표시합니다. 모든 게시물 표시

intellij 에 lua 개발 환경 설정

# 기존에는 lua 를 sublime text 에서 개발했는데, intellij 로 변경하여 개발하게 됨.
# intellij 의 lua 플러그인 설치하자.
# 참고로 intellij 에서는 lua 파일을 오픈시 자동으로 상단에 플러그인 설치 링크가 표시된다.
Preferences -> Plugins -> lua 검색 -> install

여기까지 하면 syntax highlight 및 기본 문법은 체크가 가능하다.
파일선택 후 run 으로 문제 없이 실행되어야 하는데 다음과 같은 에러가 발생한다.

"Error running xxx.lua: Executable is not specified"

우선 lua 가 없다면 설치하자.

# 맥에서 설치(리눅스는 종류에 따라 apt-get 또는 yum 이용하자)
brew install lua

# run 설정하기
Run 메뉴 -> Edit Configurations -> Lua Script -> + 로 추가
Script name 에 스크립트 파일 명시
Use Module SDK 체크 해제후 lua 실파일 경로 명시 : /usr/local/bin/lua
Working directory 에 lua 파일 위치 명시
설정완료 후 Apply

SublimeText 3 Lua 개발 환경 셋팅하기

SublimeText 3 는 기본적으로 C++, Erlang, java, Python, Ruby 빌드환경을 제공한다.
Lua 빌드의 경우  Lua Dev 패키지를 설치하면 사용할 수 있다.

Ctrl + Shift + P -> install package -> Lua Dev 설치

Build System : Automatic 으로 설정되어 있다면
Lua 코드에서 F7 or Ctrl+B 으로 빌드할 수 있다.


Lua 테이블 추가 및 액세스 방법

-- lua test by ysoftman
-- 테이블(key, value) 테스트
function table_test()
local tb1 = {}
local tb2 = {}


local temp = {
a = 1,
b = "str1"
}
-- 테이블 추가하기
-- table.insert 사용한 경우 테이블은 배열형태로 액세스
-- 테이블의 개수가 늘어남
table.insert(tb1, temp)
print ("#tb1 ", #tb1)
print ("tb1[" .. #tb1 .. "].a = ", tb1[#tb1].a)
print ("tb1[" .. #tb1 .. "].b = ", tb1[#tb1].b)
table.insert(tb1, temp)
print ("#tb1 ", #tb1)
print ("tb1[" .. #tb1 .. "].a = ", tb1[#tb1].a)
print ("tb1[" .. #tb1 .. "].b = ", tb1[#tb1].b)



-- 테이블 내용 변경(테이블 추가 아님)
tb2.temp2 = {
aa = 2,
bb = "str2"
}
tb2.temp3 = {
aa = 3,
bb = "str3"
}
print ("#tb2 ", #tb2)

-- 액세스 방법1
print ("tb2.temp2.aa = ", tb2.temp2.aa)
print ("tb2.temp2.bb = ", tb2.temp2.bb)
print ("tb2.temp3.aa = ", tb2.temp3.aa)
print ("tb2.temp3.bb = ", tb2.temp3.bb)
-- 액세스 방법2
print ("tb2['temp2'].aa = ", tb2['temp2'].aa)
print ("tb2['temp2'].bb = ", tb2['temp2'].bb)
print ("tb2['temp3'].aa = ", tb2['temp3'].aa)
print ("tb2['temp3'].bb = ", tb2['temp3'].bb)



end

function key_value()

local temp = {
aa = {},
bb = { val1 = 1, val2 = 2, val3 = 3 },
cc = { val1 = 4, val2 = 5 },
dd = { val1 = 6, val2 = 7, val3 = 8, val4 = 9 }
}

local mydata = {
cnt = 999,
desc = "test table"
}
-- 테이블 insert 를 이용해서 추가
table.insert(mydata, temp)

-- 테이블 안의 테이블 액세스
for k1, v1 in pairs(mydata) do
print ("".. k1, v1)

if type(v1) == "table" then
for k2, v2 in pairs(v1) do
print ("\t".. k2, v2)

if type(v2) == "table" then
for k3, v3 in pairs(v2) do
print ("\t\t".. k3, v3)
end
end
end
end
end

end


table_test()
key_value()

Lua 몇번째 주(week) 인지 파악하기

-- lua test by ysoftman
-- 주간 번호 테스트
function main()

local current_time = os.date("%c", os.time())
print("current_time:" .. current_time)

-- os.date() 관련 참고
-- http://lua-users.org/wiki/OsLibraryTutorial (List all params at http://www.cplusplus.com/reference/ctime/strftime/)

-- 현재 요일 파악
-- 0 ~ 6 = Sunday ~ Saturday (참고로 "*t" 사용시 wday = 1 ~ 7 = Sunday ~ Saturday)
local current_week = os.date("%w", os.time())
print("current_week:" .. current_week)

-- 현재 올해 몇번째 주인지 파악(월요일이 일주일의 시작)
local current_week = os.date("%W", os.time())
print("current_week:" .. current_week)

-- 2014년 마지막날이 2014년의 몇번째 주인지 파악
current_week = os.date("%W", os.time({year=2014,month=12,day=31}))
print("current_week:" .. current_week)

-- 2015년 첫날이 2015년의 몇번째 주인지 파악(전년도 마지막 주가 완료되지 않아 2015년 0번째 주로 처리됨)
current_week = os.date("%W", os.time({year=2015,month=1,day=1}))
print("current_week:" .. current_week)

-- 2015년 첫날이 2015년의 몇번째 주인지 파악(전년도 마지막 주가 완료되지 않아 2015년 1번째 주로 처리됨)
current_week = os.date("%W", os.time({year=2015,month=1,day=5}))
print("current_week:" .. current_week)


if tonumber(current_week) == 1 then
print ("aa")
else
print ("bb")
end

end

main()

Lua C 연동하기

///////////////////////////////////////////////////////////
// c_for_lua.cpp
// ysoftman
// Lua <-> C 연동 테스트
#include "iostream"

#ifdef _WIN32
// 루아 설치했으면 include 와 lib 경로 추가(Windows 기준)
// C:\Program Files (x86)\Lua\5.1\include
// C:\Program Files (x86)\Lua\5.1\lib
// lua lib 링크
#pragma comment(lib , "lua5.1.lib")

#elif __APPLE__
// curl -R -O http://www.lua.org/ftp/lua-5.3.3.tar.gz
// tar zxf lua-5.3.3.tar.gz
// cd lua-5.3.3
// make macosx test
// cd ..
// g++ c_for_lua.cpp -L./lua-5.3.3/src -llua
#endif

// lua(C 로 만들어짐) 헤더 include
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}

// 루아에서 호출 할 수 있는 함수(int funcname(lua_State* L) 형식이어야 한다)
int DoSomethingForLua(lua_State *L)
{
std::cout << "DoSomethingForLua() called." << std::endl;

// 루아에서 들어온 인자들 파악
int a = luaL_checkint(L, 1);
int b = luaL_checkint(L, 2);
int c = luaL_checkint(L, 3);

std::cout << "a = " << a << std::endl;
std::cout << "b = " << b << std::endl;
std::cout << "c = " << c << std::endl;

// 루아에 스택에 결과 넣기
lua_pushinteger(L, a+b+c);

// 루아에 리턴 개수 알리기
return 1;
}

int main(int argc, char* argv[])
{
std::cout << "c_for_lua test start..." << std::endl;

// 루아 state 생성
lua_State *L = luaL_newstate();
// 루아 라이브러리 오픈
luaL_openlibs(L);

// 루아에서 C 함수를 호출 할 수 있도록 C 함수 등록
lua_register(L, "DoSomething", DoSomethingForLua);

// 루아 파일 실행
// luaL_dofile 은 luaL_loadfile(루아 로드) 와 lua_pcall(루아 초기화) 를 합친것
luaL_dofile(L, "lua_for_c.lua");


// 루아 스크립트의 myfunc1 함수 가져오기
lua_getglobal(L, "myfunc1");

// 루아 함수에 전달할 파라미터 스택에 넣기
lua_pushboolean(L, true);
lua_pushinteger(L, 99999);
lua_pushnumber(L, 123.456);
lua_pushstring(L, "string");

std::cout << "---------------------------" << std::endl;
std::cout << "C --> Lua" << std::endl;

// 루아 함수 호출
// 파라미터 4개를 전달하고 리턴 1개 받은
lua_call(L, 4, 1);

// 스택(minus indexing)에 쌓인 리턴 결과 파악
std::cout << "result from Lua = " << lua_tonumber(L, -1) << std::endl;
std::cout << "---------------------------" << std::endl;

// pop 을 해주지 않으면 스택이 계속 쌓인다.
// 내부적으로 lua_settop 으로 스택 위치를 설정
lua_pop(L, 1);

// 루아 스크립트의 myfunc2 함수 가져오기
lua_getglobal(L, "myfunc2");

// 루아 함수에 전달할 파라미터 스택에 넣기
lua_pushnumber(L, 5);
lua_pushnumber(L, 5);

std::cout << "---------------------------" << std::endl;
std::cout << "C --> Lua" << std::endl;

// 루아 함수 호출
// 파라미터 2개를 전달하고 리턴 1개 받은
lua_call(L, 2, 1);

// 스택(minus indexing)에 쌓인 리턴 결과 파악
std::cout << "result from Lua = " << lua_tonumber(L, -1) << std::endl;
std::cout << "---------------------------" << std::endl;

// pop 을 해주지 않으면 스택이 계속 쌓인다.
// 내부적으로 lua_settop 으로 스택 위치를 설정
lua_pop(L, 1);

// 루아 state 제거
lua_close(L);

return 0;
}

Lua SciTE 편집툴 한글코드 설정하기

루아를 설치하면 IDE 로 SciTE 를 사용하는데, 한글 타이핑시 깨짐 현상이 발생한다.
한글 한자를 삭제할 때도 2번 백스페이스를 눌러야 한다.(아마 한글 2바이트로 처리되서 그런것 같음).
암튼 이 문제는 SciTE 툴의 코드페이지 설정이 한글로 안되어 있어서 발생한것이다.

메뉴 -> Options -> Open Global Options File
또는
c:\Program Files\Lua\5.1\SciTE\SciTEGlobal.properties
또는
c:\Program Files (x86)\Lua\5.1\SciTE\SciTEGlobal.properties

파일에서 code.page=949 로 설정하면 끝~ㅎ

참고로 SciTEGlobal.properties 파일에서
컬러테마 --> import black
폰트 --> font.base=font:나눔고딕코딩,size:10

이밖에 지원하는 프로그래밍 언어, 메뉴이름, 화면컬러등 다양한 설정이 가능하다.