4.4 KiB
Introduction
このマニュアルは、Decodal の目的、設計方針、言語仕様をまとめる。
Decodal は Deferred Constraint Data Language、略称 DCDL のプロジェクト名である。
ファイル拡張子は .dcdl とする。
Decodal は、設定値・スキーマ・制約・派生設定を同じ式体系で扱い、組み込み環境でも実装しやすい小さな言語核を提供することを目指す。
目的
一般的な設定ファイルでは、値の記述、スキーマ定義、デフォルト値、派生設定、バリデーションが別々の仕組みとして扱われやすい。 この言語では、それらを単一の式体系に寄せる。
例えば、以下のように制約と値を同じ構文で合成できる。
Port = Int & >= 1 & <= 65535;
NarrowedPort = Port & > 443;
MyConfig = {
host = String;
port = NarrowedPort default 8080;
};
Config = MyConfig & {
host = "127.0.0.1";
port = 8000;
};
MyConfig は設定の形と制約を表し、Config はそこへ具体値を合成した設定を表す。
具体値は対応する制約を満たす必要がある。
設計目標
- データ記述とスキーマ記述を同じ構文で表現できる。
- 制約を
&で合成し、値が制約を満たすか検証できる。 - 設定値やスキーマを
//で構造的に patch できる。 defaultにより、最終評価時の fallback 値を定義できる。- フィールド単位の遅延評価により、未使用値の評価を避ける。
- import 循環があっても、必要なフィールド依存が循環していなければ評価できる。
- 処理系を組み込み向けに小さく保てるよう、意味論を明示的かつ決定的にする。
非目標
初期仕様では以下を必須にしない。
- 高度な型推論。
- match の完全な網羅性検査。
- 到達不能分岐の静的検査。
- 任意の関数呼び出し結果のグローバル memoize。
- 正規表現エンジンの必須搭載。
- 汎用
try / catchの core 搭載。 - 完全なプログラミング言語としての汎用性。
中心概念
この言語の中心概念は以下である。
- 値と制約を同じ式として扱う。
&で制約を保った合成を行う。//で右辺優先の構造的 patch を行う。defaultは制約ではなく、最終評価時の fallback として扱う。- フィールド単位で遅延評価する。
- import 循環は、実際に必要なフィールド依存が循環しない限り許容する。
組み込み向けの方針
この言語は、汎用プログラミング言語を目指すものではない。 主対象は、設定、スキーマ、制約、派生データの記述である。
そのため、言語核は「値・制約・構造の合成」と「遅延評価」に寄せる。 便利な機能であっても、実装サイズ・評価モデル・エラー決定性を大きく複雑にするものは optional feature または将来拡張として扱う。
ドキュメント構成
言語仕様の解説は Language Specification にまとめる。
language/ 配下には、構文、値、式、制約、演算子、評価意味論など、言語仕様そのものの説明だけを置く。
処理系の設計は Implementation Design にまとめる。 ここでは、AST interpreter、runtime value、thunk、合成処理、materialize、diagnostic の扱いを説明する。
主な章は以下である。
- Value:
String、Int、Float、Boolなどの値・プリミティブ制約。 - Expression: literal、object、array、function、let、match、import などの式。
- Constraints and Defaults: 制約と
defaultの意味。 - Composition Operators:
&と//の意味。 - Evaluation Semantics: 遅延評価、thunk、循環検出。
- Materialization and Errors: 最終評価とエラー分類。
- Runtime Model: concrete value と abstract value の内部表現。
- Thunk and Lazy Evaluation: 遅延計算と循環検出の処理系モデル。
未確定事項は Open Issues に集約する。