앞서 일반 for문을 알아 보았다면, 일반 for문에서 보유한 3개의 변수 중 첫번째 함수 변수가 반복자 생성 함수(클로저)에서 뽑아낸 반복자와 틀리다는 것을 알 수 있을 것이다. 루아에선 for문의 함수 변를 "무상태 반복자 : Stateless Iterators" 라 부른다. 이 무상태 반복자는 클로저에서 처럼 반복자 내부 모두 처리하는 것은 아닌, 외부의 인자로 내부의 연산을 수행하는 함수를 가리킨다. 좋은 점은 for 문이 사라지면, 자동으로 stack에서 이 외부 변수를 사라지게 됨으로 최적화가 되어 지는 것으로 보여 진다(.. 물론 추측이다.) 일반 for문의 함수 변수에 이 무상태 반복자 함수를 할당하는게 더 좋다고 하니까, 이 규칙만 알고 넘어가자. 총평 .. 개념 이해..
Lua 검색 결과
이번 항목은 반복자에 대한 개념을 이해해야 지만 가능하다. C++ 에선 각 컨테이너에 대한 iterator 를 제공해 주고 있기 때문에, 그냥 사용만 하면 되지만, 루아에선 이런 iterator 가 없기 때문에 반복자를 직접 구현해야 한다. 루아에선 단 하나의 자료구조인 table만 제공해 주고, 유저가 직접 다른 자료구조를 구현해야 되기 때문에, 반복자를 확실히 짚고 넘어가야 할 것 같다. 우선 table을 훑으며, 다음 요소를 가리키게 할려면, 우선 반복자가 테이블의 어디에 위치해 있는가? 를 저장할 변수 1개와, 어떤 값인가? 를 저장할 변수 1개가 있어야 된다. 무론 변수가 있어야 한다는 것은 표현하기 위한 언어일 뿐, 논리적 변수(구조상 변수가 없어도 변수가 있는것 처럼 하게 하는 가상의 변수)..
이 함수 꼬리 호출은, 지금까지 내가 해봤던 언어(라고 해봤자 C와 C++, PHP 밖에 없다)에서는 들어보지 못한 개념이다. (책에선 자동 꼬리 호출 이라하고 직역하면, 적절한 꼬리 호출 이라 하지만, 함수에 관련된 것이라 함수라고 하는게 더 좋을것 같기도 하다.) 함수 꼬리 호출은 무엇 인가? 함수A의 호출 후 함수A 내부에서 다른 함수B를 호출 하게 될 경우, A는 B의 꼬리이며, A는 꼬리 호출 된다고 할 수 있고, A는 B의 꼬리라고 할 수 있다. 즉 A는 B의 꼬리 함수이며, B는 꼬리 함수A의 호출 함수라 부를 수 있다. 이것이 왜 중요한가? 루아에선 이 함수 꼬리 호출이 특별한 조건이 만족하면, 스택 버퍼를 더 늘리지 않으면서 꼬리 함수를 잘라버려 주기 때문에 중요하다. 다시 말하면 함수 ..
루아에서 함수가 변수이며, 기술적으론 클로저임을 알았다면, 이번에는 이것이 기반이 되어야지만 이해 할 수 있는 "비전역 함수"라는 개념을 이해 해야 한다. 난 여기서 약간 어리 둥절했다. 왜냐하면 지역 함수면 지역 함수지 비전역 함수는 또 무슨 말이지? 라는 궁금증이 생겼기 때문이다. 곰곰히 생각해 보면, 함수가 변수라는 사실이, 지역 변수가 있다면, 당연히 지역 함수라 불리우는게 맞겠지만, 아마도 기술을 표현하는 단어가 지역 함수라는 개념보다 비전역 함수라는 개념이 더 와 닫기 때문이 아닐까 한다. C에서 함수는 전역(물론 지역으로 구현(함수 포인터로)할 순 있지만 지원하지 않는다.)이고, C++ 에선 지역 함수는 단지 멤버 함수만으로 국한 되었기 때문에, 이런 개념들과 햇갈릴꺼 같아 비전역이라는 단어..
루아의 함수가 변수와 동등한 권한이기에, 테이블에 담거나 이리저리 관리 할 수 있다는 것을 알았다. 이번에는 클로저라는 개념을 이해야지만 한다. 생소한 "클로저" 라고 들려도별거 없다. C++ 에 아주 유사한 개념이 있기 때문이다. 루아의 함수가 변수로 취급된다면, 함수 내에 변수를 정의 할수 있을것 같은데, 정말 할 수 있는가? 다른 언어를 우선 생각해 본다면, C++ 이나 C 에선 nested function 을 지원하지 않고, C++ 에선 nested class 와 local class 를 지원한다. 이것으로 nested function 을 구현 할 수는 있다. 자바에선 nested function 을 지원 하는 것으로 알고 있으나, 직접 보지는 못했다.(모든게 객채이니 당연 할 듯) 이처럼 함수에..
루아의 함수 개념을 이해하기 위해서 각 항목별로 정리를 했었다. 그 항목별로 읽다가 한개씩 한개씩 중요한 문장이 나오는데, 이번 항목에서는 "루아의 매개변수 전달 방식은 위치를 기반하여 행해진다." 가 중요하다고 생각한다. 루아의 함수시스템을 이해하는데, 위치를 기반으로 행해진다는 것은 C와 C++ 과는 전혀 다른 체계를 따른다는것과 같다. 아마도 동적 타입 때문에 위치로 밖에 할 수 없으니 당연할 지도 모르겠다. 이런 위치기반 인수 전달 방식의 루아 함수에서 "이름"으로 인수를 전달 할 수도 있는데, 그 이야기를 지금부터 하려고 한다. 루아의 table 이라는 자료구조를 이해했다면 다음의 table이 무엇을 나타내는지 쉽게 알 수 있을 것이다. table = { hangle_start = "ganada..
최근댓글