Flash ActionScript 사용기 – 두번째 삽질

아무리 현재 구현인 Flash 9 / ActionScript 3.0이 아니라지만 (Flash 8/ActionScript 2.0임) 이렇게 쓰기 괴로운 스크립트 언어는 처음이다. Python 을 처음 접했을 때 느꼈던 편안한 프로그래밍 같은 거랑은 거리가 멀다.

Class 는 무조건 별도의 파일로

.fla 에서 class 키워드를 썼더니 — 밑에서 언급하는 문제를 검사하려고 — class는 외부에 선언해라! 라는 오류 메시지만…

Class 는 하나의 파일에 1개만

x.as 에는 class x만 선언할 수 있다. (이름이 맞지 않으면 그것도 오류) 그리고 x.as에 class a를 선언하면 안된다는 오류를 볼 수 있다.

Sibling member function을 함수 포인터를 통해 호출할 때 비정상 동작

이거 덕분에 2시간 날렸다.

this pointer(?)의 scope는 함수 포인터를 통해 멤버 함수가 호출된 순간(…)까지만 유지된다. 예를 들어서

class A {
    private var n:Number = 1
    private var f:Array = [ f0, f1, f2 ]

    public function f0():Boolean { return true }
    public function f1():Boolean { return this.n == 1 }
    public function f2():Boolean { return f1() }

    public function f3():Boolean { return this.f[0]() }
    public function f4():Boolean { return this.f[1]() }
    public function f5():Boolean { return this.f[2]() }
}

가 있다고 치자. A의 instance를 만들고 f0~f5 까지 호출하면 어떤 결과가 나올까? 나는 true가 나올 거라고 생각했지… 그러나 ActionScript 는 기대를 저버리지 않고 다음과 같은 결과를 내놓는다.

true
true
true
true
false
undefined

…처음 4개는 결과가 제대로(혹은 예상대로?) 나왔다. 그렇지만 f4를 호출했을 때 this 포인터가 함수 안까지 전달이 되지 않아서? 해석이 되지 않아서? 여튼 this 포인터를 f1/f2이 제대로 받아들일 수 없는 형태로 함수가 호출되고, false, undefined가 나온다. f3의 결과가 제대로 나온 것은 아마 f0가 this를 참조하지 않아서라고밖엔;

이런 형태의 코드를 짜고 있었는데 this가 참조되지 않을꺼라곤 상상도 못했는데, 여튼 그런결과를 내서 저런 류의 함수에 첫번째 인자로 this 에 해당하는 값이 언제나 전달되게 수정했다. 일종의 on–the–fly로 만들어내는 다형성이 필요했는데 좋은 방법을 못 찾았다.