コントリビューション

このガイドは luna-poly の開発における規約をまとめたものです。Luna Flow 組織全体の規則もあわせて適用されます。

プルリクエストの前に

リポジトリで次を実行してください(./ready_to_pr.sh は moon fmt、moon check、moon test、moon info を実行します)。

moon fmt
moon check --target all
moon test
moon info

すべての pkg.generated.mbti の差分を確認してください。これは公開 API の根拠であり、そこに変化があれば、ドキュメントと変更履歴に反映すべき API の変更です。

コードスタイル

  • moon fmt で整形し、トップレベル項目は ///| で区切ります。
  • 束縛、関数、ファイル、フォルダには snake_case を、型とトレイトには PascalCase を使います。ファイルは utils.mbt ではなく、実装内容に応じた名前(sparse_polynomial.mbt)にします。
  • 明示的なメソッド昇格(pub extend T with Trait::{...})は extends.mbt に置きます。演算子、equal、compare、hash、正規の to_string を昇格し、その他のトレイトメソッドはトレイト経由でのみ使えるようにします。互換性のための昇格には #deprecated と #doc(hidden) を付けます。
  • ブラックボックステストでは、テスト対象パッケージの名前を修飾してください(@immut.DensePolynomial)。ホワイトボックステスト(*_wbtest.mbt)では修飾なしで使えます。

ライブラリの規約

  • 正規形。 すべての公開演算は正規形の値を返します。末尾を削った密なベクトル、厳密に降順で統合済みの項配列、零を含まない疎なマップです。新しい演算は返る前に不変条件を回復しなければなりません。
  • 最小限の制約。 各関数は実際に使う luna-generic の能力だけを要求します。
  • チェック付き版。 部分的な演算には、中断(abort)する形と、契約違反で None を返す *_checked 形があります。中断メッセージは違反した契約を示します。
  • 2 つの層。 演算はまず immut に追加し、同じ名前と引数順のミュータブル版を追加します。インプレースの格納に実際の利点がない限り immut に委譲し、src/consistency に検査を追加してください。意図した差異はすべて mutable の設計 に記録します。
  • 変更は名前で示す。 レシーバを変更してよいのはセッター、clear、add_term_inplace、*_inplace メソッドだけです。

ドキュメント

マニュアルは Luna Flow のドキュメント標準に従います。英語のページは doc/manual にあり(パッケージごとに api/、design/、tutorial/ のページを 1 つずつ、パッケージパスに基づいて命名)、中国語と日本語の翻訳は doc/locale の gettext カタログです。英語ページを編集したら lunadoc update を実行し、新規またはファジーなメッセージを翻訳してください。実行可能な moonbit ブロックはすべて現在のコードに対してコンパイルできなければならず、意図的な断片には moonbit nocheck を付けます。

コミット

英語の Conventional Commits(<type>(<scope>): <subject>)を使い、スコープにはパッケージを指定し(fix(immut/context): ...)、1 コミットに 1 つの論理的変更とします。メンテナでない場合は、依存関係や moon.mod のバージョンを変更する前に相談してください。