アーキテクチャ
このガイドは、リポジトリの構成と各部分の関係を説明する。設計判断の理由は core 設計ページ にある。
ソースの構成
モジュール Luna-Flow/arithmetic は src/ に一つのパッケージを持つ。
| ファイル | 内容 |
|---|---|
elementary.mbt | 非検査トレイト:Sqrt、Cbrt、Radical、Exponential、Logarithmic、Power、Trigonometric、InverseTrigonometric、Hyperbolic、InverseHyperbolic、Constants |
checked.mbt | FpClass、RoundingMode、ArithmeticContext、エラーと証明の型、検査付きトレイト、包含区間の関係トレイト |
contextual.mbt | ArithmeticDiagnostics、ArithmeticOutcome、コンテキスト付きトレイト |
impl_double.mbt, impl_float.mbt | Double と Float の非検査・検査付きインスタンス |
impl_contextual.mbt | Double と Float のコンテキスト付きインスタンス |
impl_signed_ints.mbt, impl_unsigned_ints.mbt, impl_bigint.mbt | 整数型の Power |
extends.mbt | 明示的なメソッド昇格(pub extend ... with Eq::{equal})と非推奨の暗黙形式 |
pkg.generated.mbti | 生成された公開インターフェース。何が公開かを決める根拠 |
テストはソースの隣にある。trait_test.mbt と contextual_test.mbt はパッケージを @arithmetic として呼ぶブラックボックステストであり、certification_error_wbtest.mbt はホワイトボックステストである。
依存関係
| 依存先 | 用途 |
|---|---|
Kaida-Amethyst/math (@km) | Float と Double の初等関数 |
moonbitlang/core/math | @math.PI |
moonbitlang/core/debug | 非推奨の Debug::to_repr 昇格 |
Luna-Flow/luna-generic(@lf_alg、テストのみ) | インスタンスが代数トレイトとともに動くことの確認 |
公開 API は luna-generic に言及しない。二つのパッケージは境界(bound)の中で組み合わせられるが、実行時にはどちらも他方に依存しない。
境界モデル
| 境界 | 戻り値 | 意味 |
|---|---|---|
| 非検査トレイト | Self | バックエンド自身の振る舞い(NaN、ラップアラウンド、中断を含む) |
| 検査付きトレイト | Result[T, ArithmeticError] | 拒否された演算はエラー値になる |
| コンテキスト付きトレイト | Result[ArithmeticOutcome[T], ArithmeticError] | 明示的なコンテキスト。成功時に診断 |
| 包含区間の関係 | Bool | 包含、あるいは確定的または可能的な関係 |
各層は上位トレイトでつながらない独立したトレイトなので、型はその任意の部分集合を実装できる。
エラー、診断、証明
エラーは、演算が受け入れられる結果を生まなかったことを意味する。診断は注目すべき条件(丸め、オーバーフロー、アンダーフロー、クランプ)を伴う成功した結果を記述し、論理和で合成される。証明の失敗はエラーの一種で、その詳細は証明付き評価の段階、理由、目標精度と作業精度、精度向上の回数を記録する。パッケージは再試行の方針を課さない。
コンテキストと状態
ArithmeticContext、ArithmeticDiagnostics、ArithmeticOutcome、CertificationFailureDetail は読み取り専用フィールドを持つ不変の値である。コンテキストは引数であり、診断は戻り値の一部であり、証明の証拠はエラーとともに運ばれる。グローバルな丸めモードも、ステータスレジスタも、可変の証明状態もないので、同じ呼び出しはどのターゲットでも同じ結果を与える。
提供されるインスタンス
Float と Double は、すべての非検査トレイト、検査付きの平方根・除算・比較・整数べき乗、そしてコンテキスト付きの四則演算・絶対値・平方根・指数関数・整数の埋め込み・隣接値・形式の問い合わせを実装する。コンテキスト付きインスタンスはコンテキストを無視し、丸めを報告するのは Float の整数埋め込みだけである。ConstantsContextual、HyperbolicContextual、ParseChecked、包含区間の関係は実装しない。整数型と BigInt は Power だけを実装する。完全な表は API ページ にある。
公開面とメソッド昇格
MoonBit 0.10 以降、トレイトの実装はトレイトのメソッドを型のメソッドに変えなくなった。extends.mbt はどれを昇格するかを明示する。すべての公開型で equal を昇格するので、x.equal(y) と T::equal は引き続き使える。以前の暗黙の not_equal と to_repr メソッドは、互換性のために非推奨かつ非表示の昇格として残している。moon info は pkg.generated.mbti を再生成する。公開面の変更ごとにその差分を確認すること。