Files
Decodal/doc/manual/souce/language/modules-and-imports.md
T

89 lines
2.6 KiB
Markdown

# モジュールと 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 の読み込みまたは変換に失敗する。
- 評価対象の依存関係が循環する。