レキシカルスコープの実装が難しい

AVM2でレキシカルスコープを実現したいけれども、中々難しい。そもそもの原因は、ActionScript3の元となっているECMAScript3にレキシカルスコープが存在しないことにある。
とりあえず現状をまとめてみる。

  • 各クラス・インスタンス・関数などは、Traitと呼ばれる追加属性を持てる
  • 命令用のスタックとは別にスコープ専用のスタックがある
  • スコープ専用スタックにはオブジェクトを積む。このオブジェクトに変数と値の対応を格納する
  • オブジェクトにはプロパティを持ち、文字列と値の対応も格納できる。でも、効率が悪そうだから使いたくない
  • オブジェクトにはプロパティとは別にslotというものがある。slotは整数でアクセスでき、値を格納できる。AS3をコンパイルするとこれを使って変数を格納していた
  • slotはtraitで指定しないと作られない。しかもslotごとに指定が必要
  • もしかして、スコープごとに別のクラスを作らないとダメなんじゃね?