6 ポイント 投稿者 xguru 2025-03-26 | 1件のコメント | WhatsAppで共有
  • コンパイル時にインライン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件のコメント

 
GN⁺ 2025-03-26

Hacker Newsのコメント**

  • weinzierl
    • Crabtimeのロゴを称賛、Rustマクロを簡単に作る試み
    • proc_macroで別クレートが必要な点は不便だったが、Crabtimeはこれを解決するように見える
    • ただしCrabtimeはZigのcomptimeとは異なり、単純なコンパイル時評価機能の拡張版のように見える
    • ZigとRustの大きな違いは型情報にアクセスできるかどうかで、Zigでは可能だがRustでは不可能
    • Rustでは型情報を得るためにRustDocのパースのような回り道の方法が使われている
    • Crabtimeは型リフレクション機能を提供していないようで、この機能なしでは真のcomptime実装とは言いがたい
    • pron
      • Zigのcomptime構文マクロではないため、より理解しやすくデバッグもしやすい
      • まるでランタイムで実行される関数のように動作し、強力なリフレクションとともに部分的に型付けされた言語のように機能する
      • comptimeという単一の機能だけで他の多くの言語機能を置き換えられるため、言語自体が単純になる
      • ZigはCレベルの単純さを保ちながら、C++レベルの表現力を提供する
      • 複雑な言語にcomptimeを追加しても、Zigのような単純さの利点を得るのは難しい
  • pjmlp
    • C++のメタプログラミングの発展を肯定的に評価
    • C++98のテンプレートハックから始まり、C++23では実用的なレベルまで発展した
    • 今後コンパイル時リフレクションが導入されれば、さらに良くなる見込み
    • Rustはマクロごとに構文が異なったり、synのような外部クレートに依存したりするため、学ぶべきことが多い
  • nindalf
    • 宣言的マクロで書いていたベンチマーク生成コードをCrabtimeで書き直し、満足のいく体験だった
    • Crabtimeを使うとほとんどのコードをRustのように書けるため、可読性とカスタマイズ性が向上する
    • 以前はモジュール名を毎回渡す必要があったが、今ではディスクからファイルを読み取って処理できる
    • paste!{}crabtime::output!{}の使い勝手を比較すると、後者のほうがはるかに直感的だと評価
    • ループ構文も複雑なマクロパターンの代わりにRustのfor構文をそのまま使える
    • CrabtimeのおかげでRustメタプログラミングに対してより自信を持てるようになった
    • 以前のバージョンは数週間前に、新しいバージョンは2日前に公開されたばかりで、ユーザー数は多くない
    • 以前に書いたマクロは自分でもよく理解できていなかったが、Crabtimeでは明確に書いて保守できた
  • orman784
    • 複雑なマクロを書く必要がある場面で、macro_rulesだけでは限界を感じ、コード全体を直接書いたと述べている
    • proc_macroの使用は避けたいが、たいていsynquoteproc_macro2のような依存関係を追加しなければならず不満
    • Crabtimeがこれを解決してくれるのか試してみたい
    • 依存関係がどれほど増えるかはまだ確認していないが、できれば減らしたい