49 lines
1.4 KiB
Markdown
49 lines
1.4 KiB
Markdown
# 遅延評価
|
|
|
|
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) を参照する。
|