# モジュールと import `import` はホストが解決した DCDL module または structured value を返す。 ## 構文 ```dcdl 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 として参照できる。 ```dcdl 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 として扱える。 ```dcdl 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](../embedding.md#imports) を参照する。 ## 循環 import module 間に循環参照があっても、実際に評価される field の依存関係が循環していなければ成功する。 ```dcdl # main.dcdl schema = { name = String; }; result = (import "./func.dcdl")(schema); ``` ```dcdl # 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 の読み込みまたは変換に失敗する。 - 評価対象の依存関係が循環する。