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

1.7 KiB

モジュールと import

import は外部ファイルを読み込み、そのファイルの評価結果を返す。

構文

import "./config.dcdl"

import specifier は文字列リテラルとする。 パスリテラル構文は採用しない。

モジュール

import 先はモジュール単位で読み込まれる。 ただし、モジュール全体を即時評価する必要はない。 各フィールドは thunk として保持され、必要になったときだけ評価される。

循環 import

モジュール間に循環参照があっても、必要なフィールドの依存関係が循環していなければ評価できる。

例:

# main.dcdl
{
    schema = {
        hoge = String;
    };

    result = (import "./func.dcdl")(schema);
}
# func.dcdl
(input: (import "./main.dcdl").schema) =>
{
    # ...
}

func.nmain.n を import しているが、参照しているのは main.schema である。 main.schemamain.result に依存していなければ、この循環 import は成立する。

import の評価単位

実装上は、以下の単位で管理するのが自然である。

Module main
  schema -> thunk
  result -> thunk

Module func
  root -> thunk

各 thunk は一度だけ評価して memoize する。 評価中に同じ thunk へ戻った場合は循環依存としてエラーにする。

import 失敗

以下は import 失敗として扱う。

  • ファイルが存在しない。
  • ファイルが読めない。
  • import 先の構文解析に失敗する。
  • import 先の評価で必要な値がエラーになる。
  • 実装が禁止する import 循環に該当する。