萌えハッカーニュースリーダー

2025/10/25 22:29 Writing reliable and maintainable metaprograms in pure C99

出典: https://github.com/hirrolot/metalang99
hakase
博士

ロボ子、今日のニュースはMetalang99じゃ!C99でメタプログラミングするための基盤らしいぞ。

roboko
ロボ子

メタプログラミングですか。C99で、ですか?少し意外な組み合わせですね。

hakase
博士

そうじゃろ?プリプロセッサマクロ上に実装されたFP言語として実現されてるらしいぞ。代数的データ型とかパターンマッチングとか、色々できるみたいじゃ。

roboko
ロボ子

代数的データ型にパターンマッチング…、コンパイル時のエラー報告やデバッグの手段もあるんですね。便利そうです。

hakase
博士

OpenIPCで使われてるDatatype99とかInterface99の依存関係としても使われてるみたいじゃな。メタプログラミングで制御フローとか整数とか扱えるのはすごいぞ。

roboko
ロボ子

型安全で、構文も簡潔、生成されたコードのメモリレイアウトも正確となると、安心して使えそうですね。

hakase
博士

依存関係として使うには、インクルードディレクトリを追加して、GCCなら`-ftrack-macro-expansion=0`、Clangなら`-fmacro-backtrace-limit=1`を指定するみたいじゃ。

roboko
ロボ子

CMakeを使う場合は、`FetchContent`が推奨されているんですね。再帰呼び出しも期待通りに動作する、と。

hakase
博士

構文は普通のプリプロセッサコードとちょっと違うだけみたいじゃな。部分適用で環境をキャプチャできるのも便利じゃ。

roboko
ロボ子

`ML99_abort`と`ML99_fatal`でマクロをデバッグできるんですね。エラー報告もできる、と。

hakase
博士

v0.1.0のリリースに半年、安定化にほぼ1年かかったみたいじゃ。Metalang99は構文変換だけが目的で、CPUバウンドなタスクは対象外らしいぞ。

roboko
ロボ子

診断メッセージを改善するために、`ML99_assertIsTuple`とか`ML99_assertIsNat`を使うんですね。未実装の機能を示すには`ML99_todo`を使う、と。

hakase
博士

再帰マクロ呼び出しを禁止してるから、マクロ展開を遅らせるアドホックな再帰エンジンがあるんじゃと。継続渡しスタイルで式を還元するインタプリタを使うらしいぞ。

roboko
ロボ子

標準ライブラリは、コアメタ言語で実装されたメタ関数のセットなんですね。

hakase
博士

C/C++プリプロセッサは反復に制限があるけど、Metalang99の場合は削減ステップ数で定義されるみたいじゃ。C99/C++11以降をサポートしてて、GCC、Clang、MSVC、TCCで動くことが確認されてるみたいじゃな。

roboko
ロボ子

色々な環境で動作確認されているのは安心ですね。博士、今日のニュースも勉強になりました!

hakase
博士

どういたしましてじゃ!そういえばロボ子、Metalang99でプログラムを書くと、コンパイルエラーが起こりにくいらしいぞ。なぜなら…エラーは全部、私が見つけてあげるからじゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search