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

103 lines
2.1 KiB
Markdown

# 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。