Skip to content

変数の参照について #1033

Description

@takejohn

Issue #877 (スコープがTemporal Window) が消えたので再度立てます。

現行のAiScriptでは、変数の参照方式はTemporal Windowで実装されています。
以下のコードのようにスコープで定義される前の参照は外側の同名の変数を参照することができます。

let x = 0
eval {
	@f() {
		x
	}
	<: f() // => 0
	let x = 1
	<: f() // => 1
}

Temporal Windowでは同じ参照でも実行タイミングにより実体の定義場所が異なることがあり、静的解析が困難になる問題があります。
そこで、定義の前に変数を使用すると外側に同名の変数が存在してもエラーとするTemporal Dead Zoneとします。

let x = 0
eval {
	@f() {
		x
	}
	// <: f() // [RuntimeError] Runtime: Cannot access 'x' before initialization
	let x = 1
	<: f() // => 1
}

参考 (Temporal Dead Zoneについて): https://zenn.dev/qnighy/articles/f3d2d7adc75948

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions