aiscript
aiscript copied to clipboard
スコープがTemporal window
Temporal windowというのは、見えているスコープの中で直近にdefineされた変数を指す方式のこと。 ref. https://zenn.dev/qnighy/articles/f3d2d7adc75948
現状のインタプリタはTemporal windowであり、これは実行時に識別子がどの変数を指すかが変わってしまう。 具体的には以下のようなコードで、関数を呼び出すタイミングによって参照する変数が変わる。
let hoge = 0
eval {
@f() { hoge }
<: f() // 0
let hoge = 1
<: f() // 1
}
https://aiscript-dev.github.io/ja/playground.html#N4Igxg9gJgpiBcIA2MAuACAFhA5jdAvOgAwA6AdjAG4CGS6wF66AAgGYAUAlA1rvgF8m6ADzx0nHgHopJYSgzY8hdAEZhYid3Qy1FASAFA
関数が定義された時点で参照する変数を決定するTemporal Dead ZoneかLexical Windowにするべきなのでは
Temporal Dead Zone
- 一回目の呼び出しの時点でeval内の変数を参照しようとして参照エラーを出す。
- JavaScriptと同じ。
Lexical Window
- 二回目の呼び出しでも外側の変数を参照する。
- 関数が定義された時点で宣言されていない変数には触れない。
できればLexical Windowにしたい 私自身関数内で外部変数を参照する使い方をよくするので
Lexical Windowで実装してみます。
:: A {
let x = "outer"
:: A {
@f() { A:x }
let x = "inner"
}
}
<: A:A:f() // "inner"
これも"outer"が出力されるようにしたほうがいいのかな?
よくわからない。