이번 항목은 반복자에 대한 개념을 이해해야 지만 가능하다. 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 을 지원 하는 것으로 알고 있으나, 직접 보지는 못했다.(모든게 객채이니 당연 할 듯) 이처럼 함수에..
앞에서 기초적인 루아 함수의 개념을 정리했다면, 이번에는 그 양념을 한번 제대로 활용해 보는 것에 중점을 둔 정리를 한다. "루아 함수는 적당한 정적 범위 지정(lexical scoping) 기능을 가진 일등급(first class) 값" 이다. 즉, 문자열이나 수치와 같은 동일한 권한을 가진 변수라는 것이다. 함수를 인수로 넘기거나, 함수를 태이블에 저장하거나 전역 변수에 저장하거나 다 가능하다는 뜻이기도 하다. 책에서는 이를 통해 루아의 막강하고 심플한 모습을 볼 수 있다고 하니까 꼭 짚고 넘어가려고 한다. 루아의 특징을 이용한다면, 당연하겠지만, 함수를 변수에 담아 둘 수가 있다. a = print 라고 하면 a("우하하하") 가 가능하다. 이 특징을 유심히 본다면, function foo( x )..
루아 함수의 그 독틈함은 간혹 C의 함수와 비슷한것이 있는데, 그 중 하나가 바로 가변 개수 인수를 받는 함수 이다. C에서 처럼 특별히 무엇인가 작업을 요하는것은 없고, 아주 간단하게 작성 할 수 있다. 다음 함수를 보자. function add ( ... ) local s = 0 for i, v in ipairs{...} do s = s + v end return s end print( add( 3, 4, 10, 25, 12 ) ) add 함수의 ...
최근댓글