2017년 1월 15일 일요일

Lua 입문 ( C언어 비교 ) (2)

지난글에 이어서 작성하였습니다.

Lua 변수 scope (변수 존재 범위)

로컬 변수는 local을 붙여줍니다. 안 붙어있으면 정의된 이후로 모두 사용이 가능합니다.
C
#include <stdio.h>

int main(void) {
 int a = 0;
 {
     a = 50;
     int a = 100;
     printf("%d\n",a);
 }
 printf("%d\n",a);
 return 0;
}
Lua
a = 0
do
    a = 50
    local a=100
    print (a)
end

print (a)
결과
100
50

Lua function

function의 시작은 function 이름 그리고 마지막에 end로 끝납니다. 만약 중간에 리턴값이 있으면 return 을 사용해도 됩니다.
예를 보시죠
C
#include <stdio.h>

int sumfunc(int param1,int param2)
{
    return (param1+param2);
}
int main(void) {
 printf("%d\n",sumfunc(1,2));
 return 0;
}
Lua
function sumfunc(param1,param2)
    return (param1+param2)
end

print (sumfunc(1,2))
결과
3

function 정의는 사용전에 앞쪽에서 이루어져야 합니다. 위의 예에서 sumfunc가 아래쪽에 위치한다면 오류가 발생합니다.
Lua의 다른 언어와 다른점은 변수를 여러개가 리턴이 가능합니다.
Lua 변수 여러개 리턴
function sumfunc(param1,param2)
    return (param1+param2),param1,param2
end

sum,p1,p2=sumfunc(1,2)
print (sum,p1,p2)
결과
3 1 2

Lua table

Lua언어에는 배열이 존재하지 않습니다. 그러면 비슷하게 처리할수 있는 뭔가가 있을겁니다. 그것이 table입니다. 일단 예제를 보시죠
C
#include <stdio.h>

int data[]={3,2,1};
int main(void) {
    int i;
 for(i=0;i<3;i++){
     printf("%d\n",data[i]);
 }
 return 0;
}
Lua
data={3,2,1}

for i=1,3,1 do
    print (data[i])
end
---------------------
data={[0]=3,2,1}

for i=0,2,1 do
    print (data[i])
end
결과
3
2
1
결과는 모두 동일 하지만 Lua는 index가 1부터 시작합니다. 그래서 index를 0부터 시작하게 하려면 [0]=3 과 같은 처리가 필요합니다.
사실 table의 진정한 의미는 map과 비슷합니다. 즉 index가 key가 되고 들어있는 값은 value라고 생각하면 됩니다.
Lua
data={["a"]=3,2,1}

print (data["a"])
결과
3
위의 예제에서 data={["a"]=3,["b"]=2,["b"]=1} 이 되지는 않습니다. data={["a"]=3,[1]=2,[2]=1} 이와 같이 됩니다.
index가 숫자가 아닌경우가 있다면 전체를 순회할만한 방법이 있어야 합니다. 모든 tree를 순회하기 방법이 ipairs랑 pairs 두가지 방법이 있습니다. ipairs를 이용하면 index가 숫자인 부분만 사용합니다.
Lua
data={["a"]=3,2,[5]=1,0}

print ("ipairs")
for i,v in ipairs(data) do 
    print (i,v)
end

print ("pairs")
for k,v in pairs(data) do 
    print (k,v)
end
결과
ipairs
1 2
2 0
pairs
1 2
2 0
a 3
5 1

Lua table or string 길이 구하기 rawlen, #

사용시 주의할점이 있습니다. table에서는 숫자 index의 연속적인 앞쪽 구간만 나오게 됩니다.
Lua
data={3,2,0}
print (rawlen(data))
print (#data)

data={["a"]=3,2,[5]=1,0}
print (rawlen(data))
print (#data)

data="stringdata"
print (rawlen(data))
print (#data)
결과
3
3
2
2
10
10


Lua print시 개행 관련

lua print는 항상 개행이 포함됩니다. 간혹 개행을 원치않을 경우가 있습니다.
이때 사용하는게 io.write 혹은 .. 을 사용하게 됩니다.
Lua
data1=2
data2=3
print(data1..data2)
io.write(data1)
io.write(data2)
io.write("\n")
print("end")
결과
23
23
end


Lua string 조작

관련해서 몇개의 함수의 예제를 만들었습니다.
string.byte: string 특정 위치의 값을 숫자 형태로 읽어옵니다.
string.char:숫자를 문자 형태로 바꿉니다.
string.find:string에서 특수한 문자를 찾을 때 사용합니다. 이때 사용하는 정규 식은 다음 링크를 참고하시기 바랍니다. http://www.lua.org/manual/5.3/manual.html#6.4.1
string.sub:string에서 일부를 떼어내어 sub string으로 만듭니다.
Lua
--string.byte
print("string.byte example")
data="101ABCDE"
data1=string.byte(data,4)
data2=string.byte(data,4,5)
data3,data4 = string.byte(data,4,5)
print(type(data1),data1)
print(type(data2),data2)
print(type(data3),data3)
print(type(data4),data4)

-----------------------------------
--string.char
print("string.char example")
data1=string.char(65,66,67)
print(type(data1),data1)

-----------------------------------
--string.find
--http://www.lua.org/manual/5.3/manual.html#6.4.1
print("string.find example")
data="101ABCDEABCDE"
a,b=string.find(data,"ABC",1)
print(type(a),a)
print(type(b),b)
a,b=string.find(data,"ABC",b)
print(type(a),a)
print(type(b),b)

-----------------------------------
--string.sub (s, i [, j])
print("string.sub example")
data="101ABCDEABCDE"
a,b=string.find(data,"ABC",1)
data1=string.sub(data,a,b)
print(type(data1),data1)
결과
string.byte example
number 65
number 65
number 65
number 66
string.char example
string ABC
string.find example
number 4
number 6
number 9
number 11
string.sub example
string ABC


Lua print시 포맷팅

string 함수를 이용하며 기본적으로는 C 언어와 비슷합니다.
Lua
data=string.format("%f %d %i %s %% %c",10.0,10,10,"Str",65)
print(data)
print(string.format("%f %d %i %s %% %c",10.0,10,10,"Str",65))
결과
10.000000 10 10 Str % A
10.000000 10 10 Str % A



Lua comment 주석

두가지가 있습니다. line comment는 -- 두개입니다. 또하나는 block comment 입니다.
--[[ 로 시작하며 ]]-- 로 끝납니다. block comment는 중첩이 가능합니다.

Lua
--comment
--[[
print(10)
--]]
print("end")
결과
end

Lua string to value, value to string

tonumber , tostring 함수를 이용합니다. tonumber 뒤쪽에 진법인자를 사용하지 않으면 10진수로 변환이 됩니다.
Lua
data="101"
print(type(data),data)
data = tonumber (data)
print(type(data),data)
data = tonumber (data,"2")
print(type(data),data)
data = tostring(data)
print(type(data),data)
결과
string 101
number 101
number 5
string 5




이전에 쓴글
Lua 입문 ( C언어 비교 ) (1)
http://swlock.blogspot.com/2017/01/lua-c-1.html



댓글 없음:

댓글 쓰기