-
Notifications
You must be signed in to change notification settings - Fork 85
v0.1.z でのパッケージシステムの処理に関する設計
- 文書ファイルを除くSATySFiコードの書かれたファイルをソースファイルと呼ぶ.
- 各ソースファイルは単一のモジュールの束縛
module … [:> sig … end] = struct … end
からなっており,これによって束縛されているモジュールをファイルモジュールと呼ぶ. - パッケージ中のソースファイルのうち1つだけがパッケージ外部からも見えるモジュールを定義している特別なものとし,このファイルモジュールをメインモジュールと呼ぶ.
- 簡単のため,各パッケージは1つのバージョンが固定されていると仮定する.
- これはいわゆるlockファイルから得る.lockファイルの書き出しはSatyrographosが行なうと責務の分離としてよいかもしれない.
- モジュール名とそのシグネチャを紐づけた
$\{X_1 ↦ ξ_1, …, X_n ↦ ξ_n\}$ を大域型環境と呼ぶ.
同一パッケージ内の別ファイルへの依存:
use 〈ファイルモジュール名〉
別パッケージへの依存:
use package 〈メインモジュール名〉
文書ファイルから相対ファイルへの依存:
use 〈ファイルモジュール名〉 of 〈拡張子を除く相対パス〉
文書ファイル sample.saty
は以下のような形で記述されている:
use package StdJa
use Introduction of `introduction`
StdJa.Report.document (|
title = {サンプル},
author = {gfn},
|) '<
+p{これはサンプル文書です.}
#Introduction.text;
>
use package StdJa
は StdJa
をメインモジュールとする std_ja
パッケージを読み込む.バージョンはいわゆるlockファイル sample.satysfi-lock
に書き出されているとする.このlockファイルはSATySFi自身が生成してもよいし,Satyrographosなどの外部ツールが生成してもよい.いずれとしても,エンドユーザは制約だけを書き,何らかの方法で制約を解消したlockファイルをつくる.
use Introduction of `introduction`
は,この文書ファイルから見て ./introduction.satyh
に置いてあるファイルを読み込む.テキストモードの場合は拡張子が変わる.
簡単のため,以下の説明では文書は .saty
形式,出力はPDFとする.Markdown入力やテキスト出力モードでも大きくは変わらない.
- lockファイルから,バージョンの固定された各パッケージ
$P_1, \ldots, P_m$ に関する情報を読み込む. - 文書ファイルから
use … of …
で依存しているファイル群を辿り,これらを1つのパッケージ$P_{\mathrm{doc}}$ をなすファイル群とみなす. - 1で得られたパッケージ群を,依存関係をもとにトポロジカルソートし,
$P_{I_1}, \ldots, P_{I_m}$ という列にする. - 3で得られた順で各パッケージ
$P_{I_i}$ に対し以下の「パッケージごとの処理」を行ない,メインモジュール$X_{I_i}$ のシグネチャ$ξ_{I_i}$ とコンパイル結果の束縛列$d_{I_i}$ を得る. -
$P_{\mathrm{doc}}$ についても同様に行なう.コンパイル結果は束縛列$d$ だけではなく文書本体に対応する式$e$ も得られる. -
$d_{I_1} \cdots d_{I_n} d$ を評価した後,式$e$ を評価し,得られた文書をPDFに出力する.
- コンフィグファイルをもとにソースファイル群を列挙し,メインモジュール
$X$ も同定しておく. - メインモジュールを含む各ソースファイルをパースする.
-
use …
の依存関係に基づいてトポロジカルソートして$F_1, \ldots, F_n$ とする. - 3で得られた順番で各
$F_i$ を型検査する.このとき,use package …
とuse …
に基づいて一部のモジュールのみを型環境に入れてASTを走査する.- 依存する各パッケージのメインモジュールは既に検査を終えておりシグネチャが得られている.
- メインモジュール
$X$ のシグネチャ$ξ$ およびコンパイル結果の束縛列$d$ が得られたら,$(X, ξ, d)$ を戻り値として返す.- 典型的には最後の
$F_n$ がメインモジュールを束縛しているソースファイルである. - なお,
$X$ に対するユーザによるシグネチャ註釈$S$ があるなら,$ξ$ が$S$ の部分型であるかをここで検査する.$S$ は他パッケージには依存してよいが,パッケージ内の別ファイルで定義された型などに依存していてはならない.
- 典型的には最後の
- 文書ファイルを
Parser
によりパースし,そのファイルASTを$F_{\mathrm{doc}}$ とする. - lockファイルを
LockConfig
によりデコードし,$L$ とする. -
$F_{\mathrm{doc}}$ をOpenFileDependencyResolver
に渡し,ソートされたファイルAST列$F_1, …, F_n$ を得る. -
$L$ をClosedLockDependencyResolver
に渡し,依存関係に関してトポロジカルソートされたパッケージ列$P_{I_1}, \ldots, P_{I_m}$ を得る. - 各
$P_{I_i}$ に対して4で得られた順番にPackageChecker
を呼び出してコンパイル結果$d_{I_i}$ およびシグネチャ$ξ_{I_i}$ を得る.順次$X_{I_i} ↦ ξ_{I_i}$ を大域型環境に追加して畳み込む. -
PackageChecker
と同様の方法で$F_1, …, F_n$ をそれぞれ順にModuleTypechecker
で型検査し,大域型環境を拡張しながら$d$ を得る. -
$F_{\mathrm{doc}}$ をTypechecker
で型検査し,コンパイル結果$e$ を得る. - 束縛列
$d_{I_1} \cdots d_{I_n} d$ を評価し,その後$e$ を評価し,得られたドキュメント値$v$ をPDFに書き出す.
上記「全体処理」の2をやる.すなわち,文書ファイルASTを受け取り,関連するファイルを列挙してそれらの間の use … of …
の依存関係に基づいてトポロジカルソートを行ない,ファイルAST列を返す.
2022年10月23日現在の dev-0-1-0
にある実装の FileDependencyResolver
とおおよそ同じ.
バージョンの固定されたパッケージの集合を受け取り,それぞれを PackageReader
で読み出して,それらの間の依存関係をもとにトポロジカルソートして返す.
上記「パッケージごとの処理」の1と2をやる.すなわち,コンフィグファイルを読んで各ソースファイルを Parser
によりパースしてファイルAST集合にし,メインモジュールがどれであるかなどの情報とともに返す.この形式がパッケージ情報
- 大域型環境
$G_0$ とパッケージ情報$P$ を受け取る. -
$P$ のソースファイル集合に対し,ClosedFileDependencyResolver
を用いて,ソートされたファイルAST列$F_1, \ldots, F_n$ を得る. - 2で得られた順番に,各
$F_i$ をModuleTypechecker
で型検査する.型環境の初期値は$G_{i - 1}$ とuse …
の指定からつくる.各ファイルのシグネチャとして$ξ_i$ が得られたら,それを大域型環境に加えて$G_i := G_{i - 1} ∪ \{X_i ↦ ξ_i\}$ とする. - メインモジュールのコンパイル結果である
$d$ とシグネチャ$ξ$ を返す.- シグネチャ註釈
$S$ がある場合は,$G_0$ ($G_n$ などではないことに注意)を用いて内部表現のシグネチャ$ξ'$ にelaborateし,$ξ <: ξ'$ かどうかを検査する.
- シグネチャ註釈
上記「パッケージごとの処理」の3をやる.すなわち,ソースファイルのパスの集合 use …
の依存関係に基づいてトポロジカルソートし,ファイルAST列を返す.
- トップページ
- The SATySFibook Web公開版 第1版
- Wiki
- 目的別パッケージ一覧
- コマンドライン書式
- SATySFiコマンド一覧
- Satyrographos(パッケージマネージャ)
- 新しい言語機能の紹介
- 言語機能の構想