Decodal/doc/manual/souce/language/materialization-and-errors.md
2026-06-16 00:45:10 +09:00

2.1 KiB

materialize とエラー

通常の評価では、制約や default を含む中間値が残ることがある。 外部へデータとして出力する段階では、materialize を行う。

materialize の責務

materialize は以下を行う。

  • 必要なフィールドを評価する。
  • 明示値がないフィールドに default を適用する。
  • 採用された値が制約を満たすか検証する。
  • 未解決の制約だけが残っているフィールドをエラーにする。
  • 未適用の関数など、データとして出力できない値をエラーにする。

MyConfig = {
    host = String;
    port = Int default 8080;
};

MyConfig を materialize すると、host は具体値も default もないためエラーになる。 port8080 が採用される。

Config = MyConfig & {
    host = "localhost";
};

Config を materialize すると以下になる。

{
    host = "localhost";
    port = 8080;
}

default の適用

default は materialize 時にのみ fallback として採用される。

constraint = Int
value      = none
default    = 8080

この cell を materialize すると、8080 が採用され、Int を満たすか検証される。

明示値がある場合、default は採用しない。

constraint = Int
value      = 9000
default    = 8080

この cell の最終値は 9000 である。

エラー分類

代表的なエラー:

  • 構文エラー
  • 未定義識別子
  • 型不一致
  • 制約違反
  • & の conflict
  • default の conflict
  • 循環依存
  • import 失敗
  • match の非網羅による失敗
  • materialize 不能な値の出力

match の失敗

match に fallback 分岐がなく、どの分岐にも一致しなかった場合はエラーになる。

match value {
    >= 10: "large";
}

value10 未満であれば失敗する。

try / catch

try / catch は将来的な候補である。 組み込み向けの小さな核では必須ではない。

失敗は主に以下から発生する。

  • assert 相当の制約検証。
  • & による合成。
  • import。
  • materialize。