C…더 이상 이 주제로 글을 쓰고 있지만 아마도, 그리고 기원하건데 마지막 글일 듯.
지역 변수의 스코프 문제
지역 변수의 선언이 유효한 범위(local variable scope) 가 굉장히 괴악하다. 다음은 너무나도 적절한 mtasc.com에서 제시하는 예제.
function f() { var x = 1; if( true ) { var x = "hello"; // ... } trace(x+1); }
trace 의 결과가 ((trace는 Debugger를 통해서만 출력이 이루어지는 함수)) 좀 충격적이다. 일반적인 프로그래밍 언어 ((C나 C++, Java, C# 같은 스코프 룰이 있는 대부분의 언어)) 에 익숙한 사람이라면 출력되는 결과를 “2” 라고 생각할 것이다.
하지만 결과는 hello1 …
생각없이 짜다 또 한 방 먹었고 Orz
문자열의 길이
문자열의 길이는 보통 두 가지 의미를 갖는다.
- (의미 단위인) 글자 단위의 길이
- (저수준 단위인) 메모리 상의 bytes 길이
저수준 메모리 접근이 가능하거나, 해당 추상화가 존재하는 어느 정도 성숙된 언어들 — 예를 들어 C 와 그 자손들 혹은 최근의 일부 VM 언어들(C#/Java), 혹은 python이나 PHP 같은 언어들 — 에서는 저 두 가지를 구하는 방법이 모두 존재한다.
하지만 기대를 저버리지 않고 ActionScript 에는 메모리 상의 bytes길이를 인코딩에 맞게 구하는 방법이 없다. 정말 소켓 연결해서 쓰기가 !@#$%^&* 스럽다.
UTF-8 문자의 bytes 길이 경계에 해당하는 0x7F, 0x07FF 랑 비교해서 1~3 byte(s) 로 쪼개지게해서 일일이 길이를 구하고 직렬화하게 수정해야했다 Orz ((어차피 이 녀석도 BMP에 있는 유니코드 밖에 지원 안하는 걸로 보인다. 유니코드 표현 형식이 ‘\unnnn’ (nnnn = 숫자) 형태인데, 네 자리만 된다면 딱 BMP만 표현되지…))
꺄아아아아아아아아아악
호러(…)
문자열이 메모리에 utf-8 형식으로 올라가는데 byte 길이를 구할 방법이 없다는 뜻인건가… 그것 참 문자열의 세부 구현에 전혀 신경 쓰지 않아도 될 좋은 추상화로구나 ;; (반어법임.)
고어핀드 / 여름을 위한 납량특집
수원 / 뭐 네트웍에 대한 고려가 거의 없다고 봐야죠 -_-;;
scope는 진짜 호러군요[…]
상식[?]을 벗어나는군요 -_-
이런저런 것 때문에 사실상 하위호환성이 없는 ActionScript 3.0 / Flex 3.0이 나오는듯…