2.6 KiB
モジュールと import
import はホストが解決した DCDL module または structured value を返す。
構文
import "./config.dcdl"
import specifier は string literal である。 specifier が path、URL、resource name のどれを表すかはホストが決める。
モジュール
top-level に field 定義列を書いた module は recursive module scope を作る。 top-level field は同じ module の他の top-level field から identifier として参照できる。
schema = {
name = String;
};
result = schema;
通常の object literal の field は sibling field を identifier として暗黙参照しない。 object 内の値を参照する場合は、外側で束縛された値または明示的な path reference を使う。
module とその field は遅延評価される。 import した module の未参照 field は評価されない。
Host-defined resolution
Decodal は import specifier に対する filesystem や network の規則を定義しない。 ホストが import 元の module と specifier を受け取り、次のどちらかを返す。
- DCDL source
- ホストが構築した structured value
後者を使うと、Markdown、JSON、TOML などをホスト独自の規則で構造化し、通常の Decodal value として扱える。
Post = {
frontmatter = {
title = String;
draft = Bool default false;
};
body = String;
};
post = (import "./hello.md") as Post;
structured value も path reference、composition、constraint validation、materialization では DCDL source 由来の値と同じ規則に従う。 loader API と diagnostic provenance は Embedding を参照する。
循環 import
module 間に循環参照があっても、実際に評価される field の依存関係が循環していなければ成功する。
# main.dcdl
schema = {
name = String;
};
result = (import "./func.dcdl")(schema);
# func.dcdl
(input: (import "./main.dcdl").schema) => input
この例で func.dcdl は main.dcdl を import するが、参照する schema は result に依存しないため評価できる。
評価中の同じ field へ再び到達した場合は循環依存の diagnostic になる。
import の失敗
次の状態は import failure になる。
- ホストが specifier を解決できない。
- resource を読み込めない。
- DCDL source の構文解析に失敗する。
- 必要な import 先の値を評価できない。
- structured value の読み込みまたは変換に失敗する。
- 評価対象の依存関係が循環する。