aiscript icon indicating copy to clipboard operation
aiscript copied to clipboard

スコープがTemporal window

Open uzmoi opened this issue 11 months ago • 1 comments

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

  • 二回目の呼び出しでも外側の変数を参照する。
  • 関数が定義された時点で宣言されていない変数には触れない。

uzmoi avatar Dec 14 '24 02:12 uzmoi

できればLexical Windowにしたい 私自身関数内で外部変数を参照する使い方をよくするので

FineArchs avatar Dec 15 '24 09:12 FineArchs

Lexical Windowで実装してみます。

takejohn avatar Sep 14 '25 06:09 takejohn

:: A {
	let x = "outer"
	:: A {
		@f() { A:x }
		let x = "inner"
	}
}
<: A:A:f() // "inner"

これも"outer"が出力されるようにしたほうがいいのかな? よくわからない。

takejohn avatar Sep 14 '25 13:09 takejohn