6 Punkte von xguru 2025-03-26 | 1 Kommentare | Auf WhatsApp teilen
  • Ein Makro, das zur Compile-Zeit inline Rust-Logik auswertet und neuen Code erzeugt und hinzufügt
  • Bietet mehr Flexibilität und Performance als prozedurale Makros und ist zugleich leichter und natürlicher zu lesen und zu schreiben als macro_rules
  • Unterstützt Ein- und Ausgabe sowohl als Token Stream/Macro Fragments als auch als Rust-Code
  • IDE-Unterstützung, Code-Formatierung, inline definierbar und sehr gut lesbar
  • One-shot-Eval: Komplexe Compile-Time-Berechnungen lassen sich einfach verarbeiten
    const MY_NUM: usize = crabtime::eval! {  
        (std::f32::consts::PI.sqrt() * 10.0).round() as usize  
    };  
    
  • Funktionsartige Makros (Function-like Macros)
    • Mit #[crabtime::function] lassen sich funktionsartige Makros definieren
    • Die definierte Funktion wird in ein Makro umgewandelt und beim Build ausgeführt
    • Mit dem standardmäßigen Attribut #[macro_export] lässt sich das Makro exportieren
  • Die für das Makro definierte Funktion wird in die main-Funktion eines temporären Rust-Projekts eingefügt
  • Der nach dem Kompilieren erzeugte Code wird über stdout zurückgegeben

1 Kommentare

 
GN⁺ 2025-03-26

Hacker-News-Kommentare**

  • weinzierl
    • Lobt das Logo von Crabtime sowie den Versuch, Rust-Makros einfacher zu machen
    • Dass proc_macro ein separates Crate benötigt, war unpraktisch; Crabtime scheint das zu lösen
    • Allerdings wirkt Crabtime im Unterschied zu Zigs comptime eher wie eine erweiterte Form einfacher Compile-Time-Auswertung
    • Der große Unterschied zwischen Zig und Rust ist der Zugriff auf Typinformationen: In Zig ist er möglich, in Rust nicht
    • In Rust werden Umwege wie das Parsen von RustDoc verwendet, um an Typinformationen zu kommen
    • Crabtime scheint keine Typ-Reflection bereitzustellen; ohne diese Funktion ist es schwer, es als echte comptime-Implementierung zu sehen
    • pron
      • Zigs comptime ist kein Syntax-Makro, daher leichter zu verstehen und zu debuggen
      • Es funktioniert wie eine zur Laufzeit ausgeführte Funktion und verhält sich mit starker Reflection und teilweise typisierten Eigenschaften fast wie eine eigene Sprache
      • Allein die comptime-Funktion kann viele andere Sprachfeatures ersetzen, wodurch die Sprache selbst einfacher wird
      • Zig bewahrt die Einfachheit von C und bietet zugleich Ausdrucksstärke auf dem Niveau von C++
      • comptime zu einer komplexen Sprache hinzuzufügen, bringt kaum die Vorteile an Einfachheit, die Zig bietet
  • pjmlp
    • Bewertet die Entwicklung des Metaprogrammierens in C++ positiv
    • Es begann mit Template-Hacks in C++98 und hat sich bis C++23 zu einem praktischen Niveau entwickelt
    • Mit künftiger Compile-Time-Reflection dürfte es noch besser werden
    • In Rust hat jedes Makro eine andere Syntax oder man ist auf externe Crates wie syn angewiesen, daher gibt es viel zu lernen
  • nindalf
    • Hat Code zur Benchmark-Erzeugung, der zuvor mit deklarativen Makros geschrieben war, mit Crabtime neu umgesetzt und dabei gute Erfahrungen gemacht
    • Mit Crabtime kann der meiste Code wie normales Rust geschrieben werden, wodurch sich Lesbarkeit und Anpassbarkeit verbessern
    • Früher musste der Modulname jedes Mal übergeben werden, jetzt können Dateien direkt von der Festplatte gelesen und verarbeitet werden
    • Beim Vergleich von paste!{} und crabtime::output!{} wird Letzteres als deutlich intuitiver bewertet
    • Auch die Schleifensyntax kann statt komplizierter Makromuster direkt die Rust-for-Syntax verwenden
    • Dank Crabtime hat die Person mehr Selbstvertrauen in Rust-Metaprogrammierung gewonnen
    • Die frühere Version wurde vor einigen Wochen veröffentlicht, die neue vor zwei Tagen, daher gibt es noch nicht viele Nutzer
    • Frühere selbst geschriebene Makros wurden kaum noch verstanden, mit Crabtime ließen sie sich dagegen klar schreiben und pflegen
  • orman784
    • Erwähnt, dass bei Situationen mit Bedarf an komplexen Makros macro_rules allein an Grenzen stößt, weshalb der gesamte Code direkt geschrieben wurde
    • Die Nutzung von proc_macro möchte man vermeiden, ist aber meist gezwungen, Abhängigkeiten wie syn, quote und proc_macro2 hinzuzufügen, was unbefriedigend ist
    • Möchte testen, ob Crabtime dieses Problem lösen kann
    • Wie viele zusätzliche Abhängigkeiten nötig sind, wurde noch nicht geprüft, aber wenn möglich möchte man sie reduzieren