C99向けの代数的データ型の導入
(github.com/Hirrolot)Datatype99
安全で直感的な代数的データ型を提供するライブラリで、網羅的パターンマッチングとコンパイル時の堅牢性機能を提供する。純粋なC99で実装されており、外部ツールは不要。
主な特徴
- 型安全性: 不適切な型のバリアント、不完全なパターンマッチング、無効なフィールドアクセスなどがコンパイル時に検出される。
- 移植性: 標準に準拠したC99コンパイラがあればよい。標準ライブラリやコンパイラ/プラットフォーム固有機能、VLAなどは不要。
- 予測可能性: 公式なコード生成セマンティクスが定義されており、生成されるデータレイアウトが常に同一であることを保証する。
- 理解しやすいエラー: 誤ったコードに対して堅牢。
- 実運用で検証済み: OpenIPCでIPカメラ向けリアルタイムストリーミングソフトウェアの開発に使用されている。RTSP 1.0実装と約5万行の非公開コードなどが含まれる。
インストール
- Datatype99は1つのヘッダーファイル
datatype99.hと、1つの依存関係である Metalang99 から構成される。 - CMakeを使うなら、
FetchContentを通じて取得することが推奨される。 - 必要であればプリコンパイル済みヘッダーを使用できる。コンパイル時間を短縮できる。
使い方
- Datatype99はタグ付き共用体に対する単なるシンタックスシュガーであり、より安全で簡潔。
- 二分木の例:
- Cで直接実装するには構造体、共用体、列挙型などを使う必要がある
- Datatype99では単に
datatypeマクロを呼び出すだけで定義できる - パターンマッチングを使って木の合計を求めるのも簡単
- コンパイル時安全性: 誤ったバリアントのバインディングにアクセスするとコンパイルエラーが発生
- 柔軟性: バインディングはポインタ型なので変更可能で、デリファレンスして値を取得できる
- バリアントコンストラクタ関数が自動生成される
- パターンマッチングについての簡単な説明:
- デフォルトケースのマッチングには
otherwiseを使う - バインディングの無視には
_を使う of,ifLetではトップレベルのbreak/continueは使用禁止。gotoラベルを使う。
- デフォルトケースのマッチングには
構文とセマンティクス
- EBNFによる構文定義とセマンティクスの説明が提供される。
- ライブラリヘッダーではマクロの postfix バージョンの使用が推奨される。
ユニット型
UnitT99とunit_v99で提供される。
GN⁺の意見
- Datatype99を使えば、Cでも代数的データ型を安全かつ手軽に使えるため、大きな利点がありそう。
- ただしC++で使う場合は、テンプレートや
constexprなど言語自体の機能と重複する部分がありそう。Cに比べると利点は小さくなるかもしれない。 - コンパイル時に安全性を保証できるのは大きな利点だが、動的にデータ型が変わる場合には活用しにくそう。静的型付けの限界。
- 小規模プロジェクトなら直接実装してもよいが、コードベースが大きくなるとDatatype99のようなライブラリを活用することで、生産性と安定性の面で役立ちそう。
- 類似の機能を提供するライブラリとしては、LibADT、Kitsune、P99 などがある。
まだコメントはありません。