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

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.dcdlmain.dcdl を import するが、参照する schemaresult に依存しないため評価できる。 評価中の同じ field へ再び到達した場合は循環依存の diagnostic になる。

import の失敗

次の状態は import failure になる。

  • ホストが specifier を解決できない。
  • resource を読み込めない。
  • DCDL source の構文解析に失敗する。
  • 必要な import 先の値を評価できない。
  • structured value の読み込みまたは変換に失敗する。
  • 評価対象の依存関係が循環する。