array_utils 設計

array_utils は、src/array_utils.mbt にある Array[T] 向けの小さな汎用ヘルパーをまとめたものです。このページでは、その背後にある選択と、保守者が安定に保つべき挙動を説明します。

luna-generic に由来する制約

各関数は必要な最も弱い制約だけを要求します。reverse と reverse_inplace は制約なし、find と一様性の判定は Eq、arr_max と arr_min は Compare を要求します。arr_sum と zero_arr は luna-generic の AddMonoid、つまり zero() と + だけを要求するので、数値に限らず加法モノイドを持つすべての型で使えます。arr_abs_sum は符号反転のために Num を、符号の判定のために Compare を要求します。

このパッケージは luna-generic を別名 lg でインポートしており、src/alias.mbt によってパッケージ内では AddMonoid と Num を接頭辞なしで使えます。公開シグネチャではこれらは @luna-generic.AddMonoid と @luna-generic.Num と表記されます。

メソッドではなく関数

MoonBit では、コアライブラリに属する Array にパッケージがメソッドを定義することはできないため、ヘルパーはパッケージレベルの関数になっています。

空配列

起点となる要素を必要とする関数は arr[0] を読むため、空配列では panic します。arr_max、arr_min、same、map_same がこれにあたり、Option は返しません。その他の関数は空配列に対する自然な答えを持ち、それを返します。総和は zero()、same_to と map_same_to は true、find は None、reverse は空配列です。関数を追加するときはこの区別を保つか、例外を文書化すること。

メモリ確保

reverse、zero_arr、map_same、map_same_to は新しい配列を確保します。reverse_inplace は引数を書き換え、その他の関数は読み取るだけです。

保守メモ

  • 関数を追加・削除したとき、あるいは制約や境界的な場合の挙動が変わったときは、このページと API リファレンス を更新し、moon info で src/pkg.generated.mbti を再生成する。
  • ソース中の reverse_inplace のドキュメントコメントには、空配列で panic すると書かれています。実際には panic しません。ループが実行されず、配列はそのまま残ります。