본문 바로가기

책 정리/Programming in Lua

(19)
루아(Lua), 일반 for 문 개념 잡기 ( 일반 for 문의 문법 : The Semantics of the Generic for ) 편 이 포스트를 만든 목적 루아 일반 for 문이 맨날 헷갈려서 정리하려고 이 포스트의 준비물 firefox 4 b7 eclipse 3.6.1 + vrapper lua 5.1.4 참조 링크 http://www.lua.org/pil/7.2.html 내용 일반 루아 for 문이란 무엇인가? 루아 for 문에 in 키워드가 들어간 for 문이다. :) tb = {13, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1} for k, v in pairs(tb) do print(k, v) end php 의 foreach, C#의 foreach, c++ boost의 BOOST_FOREACH 와 비슷한 기능을 한다. 어떻게 이해 해야 하는가? 루아 일반 for 문은 다음과 같다, for in do en..
루아(Lua) 8.2, C 패키지 ( C Packages ) 음 제목을 좀 바꾸었다. 제목 만드는것이 매우 힘들기 때문이다 : ) 그건 그렇다고 하고, 여기서 말하고자 하는 것은 "루아에서 C코드로 만든 라이브러리를 끌어올 수 있다." 이다. 일반적으로 루아에선 ANSI C에서 구현할 수 없는 기능을 포함하지 않지만, 이렇게 동적으로 라이브러리를 끌어 올 수 있는 것에는 예외를 두고 있다. 루아는 이 기능을 특정 플랫폼에서만 지원을 하고 있는데, 윈도우, 맥 OS X, 리눅스 FreeBSD, 솔라시스 및 UNIX 가 있다. 현재 자신의 플랫폼에서 라이브러리를 끌어올수 있는지 체크하는 방법은, 다음과 같이 하고, 그 결과를 보면 된다. print( package.loadlib("a","b") ) 를 실행 했을 때, "존재하지 않는 파일" 이라고 오류가 뜨면, 기능을..
루아(lua), 8.1 컴파일, 실행 및 오류 검사(Compilation, Execution, and Errors) : 컴파일 8장부터는 컴파일과 실행 및 오류 검사에 대한 이야기를 하고 있다. 이번 8.1 에선 컴파일에 대한 이야기를 하고 있는데, 루아는 인터프리터 언어로써, 실행 중에 코드를 컴파일 할 수 있는 기능을 제공해 주고 있다고 한다. 파일을 컴 파일 할 때는 두개의 명령어가 있는데, 하나는 dofile, 다른 하나는 loadfile 이다. dofile과 달리 loadfile은 오류를 일으켜도 정지하지 않고, 오류 코드를 반환해 준다. 파일을 컴파일 하는 두 컴파일 함수는 무엇이 다를까? dofile의 경우, 호출 한 번에 파일 내부의 모든 실행을 한번 실행해 준다. 간단한 작업을 한번만 처리 하고자 할 때는 dofile이 유용하다고 한다. loadfile의 경우, 호출 한번에 파일 내부의 모든 실행을 .. 하지 않..
루아(Lua) 7.5 : 일반 for 문 개념 잡기 ( 진짜 반복자 : True Iterators ) 편 음.. 진짜 반복자라는 말이나. 클로저라는 말이나. 어찌 보면 다 함수들인데 이런 말들이 섞이면서 매우 햇갈리게 된다. 그 이유는 루아가 버전을 올리면서, 생겨난 일이지 아닐까 싶다. 일반 for문의 원리는 아직 변하지 않으므로, 이번 장은 패스 한다. 이번 항목의 마지막 결론을 인용하자면, 루아의 Old 버전에서 사용 한 방법이고, 대부분의 경우 이 방법은 쓰이지 않을 것이라고 한다. 관련 링크 : http://www.lua.org/pil/7.5.html 총평 생각 없이 책 보기 시작한지 어느덧..
루아(Lua) 7.4, 일반 for문 보충 개념 잡기 ( 복잡한 상태를 가진 반복자 함수 : Iterators with Complex State ) 편 이번 항목은 일반적인 반복자 형태가 아닌, 좀 복잡한 형태로 반복을 해야 할 경우에, 클로저를 사용하는게 더 좋다는 이야기를 하고 있다. 클로저란? C++ 과 비교하자면, 함수 오브젝트를 들수 있겠다. 다른 방법으론 table을 이용한 복잡한 반복자를 구현 할 수 있겠으나, 책에선 성능상의 이유로 클로저가 더 좋다고 이야기 한다. 클로저는 테이블 생성하는것보다 부하가 적으며, 테이블 필드 접근보다 더 빠르기 때문이라고 한다. 관련 링크 : http://www.lua.org/pil/7.4.html 총평 !? 요즘 들어 생각을 안하고 책을 보는거 같다..
루아(Lua), 일반 for문 보충 개념 잡기 ( 무상태 반복자 : Stateless Iterators ) 편 앞서 일반 for문을 알아 보았다면, 일반 for문에서 보유한 3개의 변수 중 첫번째 함수 변수가 반복자 생성 함수(클로저)에서 뽑아낸 반복자와 틀리다는 것을 알 수 있을 것이다. 루아에선 for문의 함수 변를 "무상태 반복자 : Stateless Iterators" 라 부른다. 이 무상태 반복자는 클로저에서 처럼 반복자 내부 모두 처리하는 것은 아닌, 외부의 인자로 내부의 연산을 수행하는 함수를 가리킨다. 좋은 점은 for 문이 사라지면, 자동으로 stack에서 이 외부 변수를 사라지게 됨으로 최적화가 되어 지는 것으로 보여 진다(.. 물론 추측이다.) 일반 for문의 함수 변수에 이 무상태 반복자 함수를 할당하는게 더 좋다고 하니까, 이 규칙만 알고 넘어가자. 총평 .. 개념 이해..
루아(Lua), 반복자와 일반 for문 ( 반복자와 클로저 : Iterators and the Generic for ) 편 이번 항목은 반복자에 대한 개념을 이해해야 지만 가능하다. C++ 에선 각 컨테이너에 대한 iterator 를 제공해 주고 있기 때문에, 그냥 사용만 하면 되지만, 루아에선 이런 iterator 가 없기 때문에 반복자를 직접 구현해야 한다. 루아에선 단 하나의 자료구조인 table만 제공해 주고, 유저가 직접 다른 자료구조를 구현해야 되기 때문에, 반복자를 확실히 짚고 넘어가야 할 것 같다. 우선 table을 훑으며, 다음 요소를 가리키게 할려면, 우선 반복자가 테이블의 어디에 위치해 있는가? 를 저장할 변수 1개와, 어떤 값인가? 를 저장할 변수 1개가 있어야 된다. 무론 변수가 있어야 한다는 것은 표현하기 위한 언어일 뿐, 논리적 변수(구조상 변수가 없어도 변수가 있는것 처럼 하게 하는 가상의 변수)..
루아(Lua), 함수 양념 고급 활용 하기 ( 함수 꼬리 호출 : Proper Tail Calls ) 편 이 함수 꼬리 호출은, 지금까지 내가 해봤던 언어(라고 해봤자 C와 C++, PHP 밖에 없다)에서는 들어보지 못한 개념이다. (책에선 자동 꼬리 호출 이라하고 직역하면, 적절한 꼬리 호출 이라 하지만, 함수에 관련된 것이라 함수라고 하는게 더 좋을것 같기도 하다.) 함수 꼬리 호출은 무엇 인가? 함수A의 호출 후 함수A 내부에서 다른 함수B를 호출 하게 될 경우, A는 B의 꼬리이며, A는 꼬리 호출 된다고 할 수 있고, A는 B의 꼬리라고 할 수 있다. 즉 A는 B의 꼬리 함수이며, B는 꼬리 함수A의 호출 함수라 부를 수 있다. 이것이 왜 중요한가? 루아에선 이 함수 꼬리 호출이 특별한 조건이 만족하면, 스택 버퍼를 더 늘리지 않으면서 꼬리 함수를 잘라버려 주기 때문에 중요하다. 다시 말하면 함수 ..