1.4 KiB
1.4 KiB
遅延評価
Decodal は値を必要になった時点で評価する。
遅延評価される値
次の値は参照または materialize されるまで評価されない。
- module の root と top-level field
- object field
letbinding- function argument
defaultexpression- import 先の値
同じ binding を複数回参照した場合、その評価結果は再利用される。 このため、未参照の field や function argument にある失敗は、値が必要になるまで発生しない。
let
safe = 42;
unused = missing_name;
in
safe
この式は unused を参照しないため 42 になる。
循環検出
評価中の値が自身へ再び依存した場合は cycle diagnostic になる。
{
a = b + 1;
b = a + 1;
}
module や import の参照関係自体が循環していても、実際に評価される field の依存関係が循環していなければ評価できる。
評価と materialize
通常の評価結果には、constraint、Unknown、default、function などの abstract value が残り得る。
外部へ concrete data として取り出すときに materialize を行う。
この分離により、schema を値として合成し、必要な field だけを評価し、default の選択を出力時まで遅らせられる。
詳細は materialize とエラー を参照する。