Add unknown ranges and open object values

This commit is contained in:
2026-08-14 08:00:22 +09:00
parent 8c50dd202d
commit 848c7f169f
53 changed files with 9047 additions and 6572 deletions
+11 -3
View File
@@ -14,9 +14,9 @@ RuntimeValue =
`Concrete` は明示的な値である。
`Abstract` は、まだ具体値に確定していない制約付きの値である。
Decodal は `unknown``any``null` のような「存在するが意味が未確定な値」を runtime value として持たない
識別子や field が解決できない場合は、その場で diagnostic になる。
未解決値を後続の演算へ流して推論することはしない
Decodal は `Unknown` を、すべてのDecodal値を包含する最上位の abstract range として持
これは存在する具体値の型情報を消す `Any` ではない。具体値を `Unknown` に対して検証した場合は具体値を保持し、`Unknown` のままmaterializeしようとした場合は diagnostic になる。
識別子や field が解決できない状態とは区別し、それらは従来どおりその場で diagnostic になる
## ConcreteValue
@@ -37,10 +37,15 @@ object は concrete structure として扱う。
```text
ObjectValue:
fields: Map<Symbol, ObjectField>
rest: Option<ObjectRest>
ObjectField:
value: ThunkId
span: Span
ObjectRest:
value: ThunkId
span: Span
```
例えば以下の schema object は、object 自体は concrete だが、field の値は abstract value になる。
@@ -122,6 +127,7 @@ constraint は concrete value とは別の型として扱う。
```text
Constraint =
Unknown
Type(PrimitiveType)
ArrayItems(ThunkId)
MapValues(ThunkId)
@@ -137,6 +143,8 @@ Constraint =
`MapValues` は object の key 集合を制限せず、すべての field value へ適用する schema thunk を表す。
連想配列は materialize 後も `Data::Object` になり、別の data variant は持たない。
`ObjectValue.rest` は名前付きfieldを持つobjectの残余field rangeを表す。rest自体はfieldを生成せず、materializeは実在するfieldだけを出力する。
初期実装では、object の形は主に `Concrete(Object)` の field に `Abstract` を置くことで表現する。
object 全体にかかる constraint は必要になった時点で追加する。