Skip to content

ファイル分割

Snowman-s edited this page Apr 10, 2024 · 5 revisions

ファイル分割 / モジュールシステム

ファイルが肥大化すると、すべてを記述するのが大変になります。このような時、ブロックの一部を別ファイルに定義して読みだすことができます。 このような時、includeを使います。例えば、以下のファイル2つを同ディレクトリに用意し、modules_main.trを実行すると18を出力します。

(modules_mainの変数aがmodules_subによって破壊されていないことに注意して下さい。このように公開する/しないものを調整できます。)

  • modules_main.tr
┌───────────────────────────────────┐
│              seq                  │
└───┬───────┬────────────────┬──────┘
┌───┴──┐┌───┴───┐         ┌──┴──┐
│defset││include│         │print│
└┬────┬┘└───┬───┘         └──┬──┘
┌┴──┐┌┴┐┌───┴────────────┐┌──┴──────┐
│"a"││9││"modules_sub.tr"││two times│
└───┘└─┘└────────────────┘└──┬──────┘
                          ┌──┴──┐
                          │  a  │
                          └─────┘
  • modules_sub.tr
┌──────────────────────────────────┐
│              seq                 │
└───┬───────┬──────────────────┬───┘
┌───┴──┐┌───┴──────────────┐┌──┴───┐
│defset││      defproc     ││export│
└┬────┬┘└───┬──────────┬───┘└──┬───┘
┌┴──┐┌┴┐┌───┴───────┐┌─•───┐┌──┴────────┐
│"a"││0││"two times"││  *  ││"two times"│
└───┘└─┘└───────────┘└┬──┬─┘└───────────┘
                     ┌┴┐┌┴─┐
                     │2││$0│
                     └─┘└──┘

includeは、現在のソースファイルからの読み込むファイルの相対パス を受け取り、そのファイルのブロックを「置き換えたかのように」実行します。
上記の例だと、modules_main.tr の ブロックincludemodules_sub.tr の ブロックseq に置き換えられ、"two times"が定義されるということになります。

  • modules_sub.tr からさらにincludeしたい場合、modules_sub.tr からの相対パスを記述します。
  • includeexec と違って引数を $0, $1, ... にセット しませんinclude はファイルの相対パスをただ一つ受け取ります。

再エクスポート

reexport は与えられたブロックを実行し、現在のスコープに存在する変数やプロシージャ(つまり、引数ブロックからエクスポートされたもの)を1つ上及び2つ上のスコープに定義します。includeと組み合わせることが想定されており、モジュールシステムにとって有用となります。