Guidedog マニュアル 0.2.0
言語
このページの内容
Guidedog / ドキュメント 0.2.0

アルゴリズムより先に不変条件

役に立つ不変条件は、実行中に保たれることと、終了後に呼び出し側が頼れることを示す。ループを書く前にそれを書く。

先行順走査の部分木区間

木を先行順で出力すると仮定する。各ノードは子より先に出力され、部分木は連続する。\(e_i\) をノード \(i\) と全ての子孫の直後の添字とする。

(3)\[\operatorname{subtree}(i) = [i,e_i), \qquad i < e_i \le N.\]

命題。 添字を \(e_i\) に進めれば、部分木を飛ばせる。

証明。 連続性により全ての子孫は \(e_i\) より前にある。排他的な終端の定義により、以後のノードは \(e_i\) 以降にある。そこへ進めば部分木だけを飛ばせる。レンダラーが頼る前に、バリデーターが仮定を検査する。

文書ノード0は見出しと段落を含み、その段落はテキストノードを含む。
図 5 親の区間は子の区間を包含します。

全体走査は各ノードを一度訪れ、走査コストは \(O(N)\)。部分木のスキップは添字の更新一回で済むが、ペイロード処理には相応のコストがある。定数時間のスキップを定数時間の描画と混同しない。

出力の前に計測する

レンダラーはまずバイト数 \(m\) を測る。呼び出し側の出力容量を \(c\) とする。

\[m \le c \quad \Longrightarrow \quad \text{出力を開始できる}.\]

測定と出力の走査は同じ規則を使う。成功時は正確に \(m\) バイトを書く。失敗時に有効な部分成果物は返さない。公開はホストが担うため、不完全なバイト列が以前の出力を置き換えることはない。

キャッシュの有効性

キャッシュキーは結果を変え得る全データを含める。ソースだけでは足りない。インクルード、テンプレート、設定、参照検索、リソース、アダプターの版も出力に影響する。記録した依存関係が一致するときだけ再利用できる。キーが一致しても出力がなければ無効。

テストではコア境界に失敗するアロケーターを置き、出力内容を比較する。インポートも監査する。割り当て数だけを数えて結果を見なければ、拒否で文書の一部を黙って捨てる不具合を見逃し得る。