Files
Decodal/doc/manual/souce/language/evaluation.md
T

1.4 KiB

遅延評価

Decodal は値を必要になった時点で評価する。

遅延評価される値

次の値は参照または materialize されるまで評価されない。

  • module の root と top-level field
  • object field
  • let binding
  • function argument
  • default expression
  • 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、Unknowndefault、function などの abstract value が残り得る。 外部へ concrete data として取り出すときに materialize を行う。

この分離により、schema を値として合成し、必要な field だけを評価し、default の選択を出力時まで遅らせられる。 詳細は materialize とエラー を参照する。