Decodal
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
|
||||
制約は、値が満たすべき条件を表す。
|
||||
|
||||
```n
|
||||
```dcdl
|
||||
Int
|
||||
String
|
||||
>= 1
|
||||
@@ -16,7 +16,7 @@ String
|
||||
|
||||
制約は `&` により合成できる。
|
||||
|
||||
```n
|
||||
```dcdl
|
||||
Port = Int & >= 1 & <= 65535;
|
||||
NarrowedPort = Port & > 443;
|
||||
```
|
||||
@@ -29,7 +29,7 @@ A & B = A と B の両方を満たす値または制約
|
||||
|
||||
矛盾する制約はエラーになる。
|
||||
|
||||
```n
|
||||
```dcdl
|
||||
Int & String # エラー
|
||||
>= 10 & <= 5 # エラーになりうる
|
||||
```
|
||||
@@ -38,7 +38,7 @@ Int & String # エラー
|
||||
|
||||
最小の組み込み制約は以下である。
|
||||
|
||||
```n
|
||||
```dcdl
|
||||
String
|
||||
Int
|
||||
Float
|
||||
@@ -47,7 +47,7 @@ Bool
|
||||
|
||||
追加の述語制約はライブラリまたは組み込みとして提供できる。
|
||||
|
||||
```n
|
||||
```dcdl
|
||||
IPv4Address
|
||||
```
|
||||
|
||||
@@ -55,14 +55,14 @@ IPv4Address
|
||||
|
||||
正規表現リテラルは文字列制約として使える候補である。
|
||||
|
||||
```n
|
||||
```dcdl
|
||||
Host = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
|
||||
```
|
||||
|
||||
ただし、組み込み向け実装では正規表現エンジンを optional feature にできる。
|
||||
軽量実装では代表的な制約を組み込み述語として提供してもよい。
|
||||
|
||||
```n
|
||||
```dcdl
|
||||
Host = IPv4Address;
|
||||
```
|
||||
|
||||
@@ -71,21 +71,22 @@ Host = IPv4Address;
|
||||
`default` は制約ではない。
|
||||
`default` は、最終評価時に明示値が存在しない場合だけ使われる fallback 値である。
|
||||
|
||||
```n
|
||||
```dcdl
|
||||
port = NarrowedPort default 8080;
|
||||
```
|
||||
|
||||
これは概念的には以下を表す。
|
||||
|
||||
```text
|
||||
constraint = NarrowedPort
|
||||
value = none
|
||||
default = 8080
|
||||
Abstract {
|
||||
constraints: [NarrowedPort]
|
||||
default: 8080
|
||||
}
|
||||
```
|
||||
|
||||
明示値が合成された場合、`default` は採用されない。
|
||||
|
||||
```n
|
||||
```dcdl
|
||||
MyConfig = {
|
||||
port = NarrowedPort default 8080;
|
||||
};
|
||||
@@ -102,26 +103,31 @@ Config = MyConfig & {
|
||||
採用された default 値は、同じフィールドに定義された制約を満たす必要がある。
|
||||
|
||||
```text
|
||||
constraint = NarrowedPort
|
||||
value = none
|
||||
default = 8080
|
||||
Abstract {
|
||||
constraints: [NarrowedPort]
|
||||
default: 8080
|
||||
}
|
||||
|
||||
finalize => 8080 が NarrowedPort を満たせば成功
|
||||
```
|
||||
|
||||
## default の内部表現
|
||||
|
||||
`default` は fallback thunk として保持できる。
|
||||
`default` は abstract value に付随する fallback thunk として保持できる。
|
||||
これにより、default 値自体も必要になるまで評価しない。
|
||||
|
||||
```text
|
||||
Cell {
|
||||
constraint: ConstraintSet
|
||||
value: Option<Value>
|
||||
default: Option<Thunk>
|
||||
}
|
||||
RuntimeValue =
|
||||
Concrete(ConcreteValue)
|
||||
Abstract {
|
||||
constraints: Vec<Constraint>
|
||||
default: Option<Thunk>
|
||||
}
|
||||
```
|
||||
|
||||
明示値は `Concrete` として表現し、`default` を保持しない。
|
||||
`Abstract & Concrete` が成功した場合、制約検証後に `Concrete` になり、default は消える。
|
||||
|
||||
## default の合成
|
||||
|
||||
同じフィールドに複数の `default` が合成された場合の詳細規則は未確定である。
|
||||
|
||||
Reference in New Issue
Block a user