# materialize とエラー 通常の評価では、制約や default を含む中間値が残ることがある。 外部へデータとして出力する段階では、materialize を行う。 ## materialize の責務 materialize は以下を行う。 - 必要なフィールドを評価する。 - 明示値がないフィールドに default を適用する。 - 採用された値が制約を満たすか検証する。 - 未解決の制約だけが残っているフィールドをエラーにする。 - 未適用の関数など、データとして出力できない値をエラーにする。 ## 例 ```n MyConfig = { host = String; port = Int default 8080; }; ``` `MyConfig` を materialize すると、`host` は具体値も default もないためエラーになる。 `port` は `8080` が採用される。 ```n Config = MyConfig & { host = "localhost"; }; ``` `Config` を materialize すると以下になる。 ```n { host = "localhost"; port = 8080; } ``` ## default の適用 `default` は materialize 時にのみ fallback として採用される。 ```text constraint = Int value = none default = 8080 ``` この cell を materialize すると、`8080` が採用され、`Int` を満たすか検証される。 明示値がある場合、default は採用しない。 ```text constraint = Int value = 9000 default = 8080 ``` この cell の最終値は `9000` である。 ## エラー分類 代表的なエラー: - 構文エラー - 未定義識別子 - 型不一致 - 制約違反 - `&` の conflict - `default` の conflict - 循環依存 - import 失敗 - match の非網羅による失敗 - materialize 不能な値の出力 ## match の失敗 `match` に fallback 分岐がなく、どの分岐にも一致しなかった場合はエラーになる。 ```n match value { >= 10: "large"; } ``` `value` が `10` 未満であれば失敗する。 ## try / catch `try / catch` は将来的な候補である。 組み込み向けの小さな核では必須ではない。 失敗は主に以下から発生する。 - assert 相当の制約検証。 - `&` による合成。 - import。 - materialize。