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