Crabtime - ZigのComptimeをRustで使おう
(crates.io)- コンパイル時にインラインRustロジックを評価し、新しいコードを生成して追加してくれるマクロ
- Proceduralマクロよりも高い柔軟性と性能を提供しつつ、
macro_rulesより読み書きしやすく自然 - Token Stream / Macro Fragments / Rustコードで入出力の両方をサポート
- IDEサポート、コードフォーマット、インライン定義が可能で、可読性に優れる
- ワンショットeval: 複雑なコンパイル時計算を簡単に処理可能
const MY_NUM: usize = crabtime::eval! { (std::f32::consts::PI.sqrt() * 10.0).round() as usize }; - 関数形式マクロ (Function-like Macros)
#[crabtime::function]で関数形式マクロを定義可能- 定義された関数はマクロに変換され、ビルド時に実行される
- 標準の
#[macro_export]属性を使ってマクロをエクスポート可能
- マクロとして定義された関数は、一時的なRustプロジェクトの
main関数に挿入される - コンパイル後に生成されたコードは
stdoutを通じて返される
1件のコメント
Hacker Newsのコメント**
proc_macroで別クレートが必要な点は不便だったが、Crabtimeはこれを解決するように見えるcomptimeとは異なり、単純なコンパイル時評価機能の拡張版のように見えるRustDocのパースのような回り道の方法が使われているcomptime実装とは言いがたいcomptimeは構文マクロではないため、より理解しやすくデバッグもしやすいcomptimeという単一の機能だけで他の多くの言語機能を置き換えられるため、言語自体が単純になるcomptimeを追加しても、Zigのような単純さの利点を得るのは難しいsynのような外部クレートに依存したりするため、学ぶべきことが多いpaste!{}とcrabtime::output!{}の使い勝手を比較すると、後者のほうがはるかに直感的だと評価for構文をそのまま使えるmacro_rulesだけでは限界を感じ、コード全体を直接書いたと述べているproc_macroの使用は避けたいが、たいていsyn、quote、proc_macro2のような依存関係を追加しなければならず不満