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