Refocus manual on public language usage

This commit is contained in:
2026-08-14 08:17:25 +09:00
parent e0a9a8efb7
commit e0970acdcc
41 changed files with 611 additions and 1982 deletions
+29 -69
View File
@@ -1,94 +1,54 @@
# Introduction
このマニュアルは、Decodal の目的、設計方針、言語仕様をまとめる。
Decodal は **Deferred Constraint Data Language**、略称 **DCDL** のプロジェクト名である
ファイル拡張子は `.dcdl` とする。
Decodal は **Deferred Constraint Data Language**、略称 **DCDL** である。
ファイル拡張子には `.dcdl` を使う
Decodal は、設定値・スキーマ・制約・派生設定を同じ式体系で扱い、組み込み環境でも実装しやすい小さな言語核を提供することを目指す
Decodal は、設定値・スキーマ・制約・派生設定を同じ式体系で記述し、検証済みの構造化データを得るための言語である
## 目的
一般的な設定ファイルでは、値の記述、スキーマ定義、デフォルト値、派生設定、バリデーションが別々の仕組みとして扱われやすい。
この言語では、それらを単一の式体系に寄せる
例えば、以下のように制約と値を同じ構文で合成できる。
一般的な設定システムでは、値、スキーマ、デフォルト値、派生設定、バリデーションが別々の仕組みになりやすい。
Decodal では、それらを合成可能な式として扱う
```dcdl
Port = Int & >= 1 & <= 65535;
NarrowedPort = Port & > 443;
MyConfig = {
Service = {
host = String;
port = NarrowedPort default 8080;
port = Port default 8080;
};
Config = MyConfig & {
Config = {
host = "127.0.0.1";
port = 8000;
};
} as Service;
```
`MyConfig` は設定の形と制約を表し、`Config` はそこへ具体値を合成した設定を表す。
具体値は対応する制約を満たす必要がある。
## 設計目標
- データ記述とスキーマ記述を同じ構文で表現できる。
- 制約を `&` で合成し、値が制約を満たすか検証できる。
- 設定値やスキーマを `//` で構造的に patch できる。
- `default` により、最終評価時の fallback 値を定義できる。
- フィールド単位の遅延評価により、未使用値の評価を避ける。
- import 循環があっても、必要なフィールド依存が循環していなければ評価できる。
- 処理系を組み込み向けに小さく保てるよう、意味論を明示的かつ決定的にする。
## 非目標
初期仕様では以下を必須にしない。
- 高度な型推論。
- match の完全な網羅性検査。
- 到達不能分岐の静的検査。
- 任意の関数呼び出し結果のグローバル memoize。
- 正規表現エンジンの必須搭載。
- 汎用 `try / catch` の core 搭載。
- 完全なプログラミング言語としての汎用性。
`Service` は許容する値の範囲を表す。
`Config` の各値は `Service` によって検証され、`Service` にだけ存在する範囲は抽象的なまま結果へ残る。
materialize 時には明示値が優先され、値がない範囲には `default` が使われる。
## 中心概念
この言語の中心概念は以下である。
- 値と制約は同じ式として参照・合成できる。
- `&` は両辺の制約を保つ対称な合成を行う。
- `as` は左辺が右辺より具体的で狭いことを検証しながら合成する。
- `//` は右辺優先の構造的な patch を行う。
- `default` は制約ではなく、materialize 時にだけ選ばれる fallback である。
- object field、関数引数、import は必要になった時点で評価される。
- `Unknown` は任意の具体値を受け入れる最上位 range だが、抽象的なまま materialize はできない。
- 値と制約を同じ式として扱う。
- `&` で制約を保った合成を行う。
- `//` で右辺優先の構造的 patch を行う。
- `default` は制約ではなく、最終評価時の fallback として扱う。
- フィールド単位で遅延評価する。
- import 循環は、実際に必要なフィールド依存が循環しない限り許容する。
## 適用範囲
## 組み込み向けの方針
Decodal は、設定、スキーマ、制約、派生データの記述に特化している。
汎用的な状態変更、時刻・乱数・ネットワークアクセス、例外を値として捕捉する `try / catch` は言語機能に含まれない。
filesystem や外部形式の読み込みはホストが提供し、Decodal の評価は同じ source・import 結果・global bindings に対して決定的に動作する。
この言語は、汎用プログラミング言語を目指すものではない
主対象は、設定、スキーマ、制約、派生データの記述である
正規表現制約は利用する runtime の `regex` feature に依存する
高度な型推論、match の網羅性検査、到達不能分岐の静的検査は提供しない
そのため、言語核は「値・制約・構造の合成」と「遅延評価」に寄せる。
便利な機能であっても、実装サイズ・評価モデル・エラー決定性を大きく複雑にするものは optional feature または将来拡張として扱う。
## 次に読む章
## ドキュメント構成
言語仕様の解説は [Language Specification](./language/index.md) にまとめる
`language/` 配下には、構文、値、式、制約、演算子、評価意味論など、言語仕様そのものの説明だけを置く。
処理系の設計は [Implementation Design](./design/index.md) にまとめる。
ここでは、AST interpreter、runtime value、thunk、合成処理、materialize、diagnostic の扱いを説明する。
主な章は以下である。
- [Value](./language/value/index.md): `String``Int``Float``Bool` などの値・プリミティブ制約。
- [Expression](./language/expression/index.md): literal、object、array、function、let、match、import などの式。
- [Constraints and Defaults](./language/constraints-and-defaults.md): 制約と `default` の意味。
- [Composition Operators](./language/operators.md): `&``//` の意味。
- [Evaluation Semantics](./language/evaluation.md): 遅延評価、thunk、循環検出。
- [Materialization and Errors](./language/materialization-and-errors.md): 最終評価とエラー分類。
- [Runtime Model](./design/runtime-model.md): concrete value と abstract value の内部表現。
- [Thunk and Lazy Evaluation](./design/thunk-and-lazy-evaluation.md): 遅延計算と循環検出の処理系モデル。
未確定事項は [Open Issues](./open-issues.md) に集約する。
- [Language Specification](./language/index.md): 構文、値、式、制約、評価、materialization。
- [Embedding](./embedding.md): Rust・JavaScript からの実行、host environment、structured import、language service。
- [Packages and Integrations](./components.md): 用途ごとに選ぶ crate と JavaScript package