6 puntos por xguru 2025-03-26 | 1 comentarios | Compartir por WhatsApp
  • Macro que evalúa lógica Rust inline en tiempo de compilación para generar y agregar código nuevo
  • Ofrece más flexibilidad y rendimiento que las macros procedurales, y al mismo tiempo es más fácil y natural de leer y escribir que macro_rules
  • Soporta tanto entrada como salida con Token Stream / Macro Fragments / código Rust
  • Soporte de IDE, formato de código, posibilidad de definirlo inline y excelente legibilidad
  • One-shot eval: permite manejar fácilmente operaciones complejas en tiempo de compilación
    const MY_NUM: usize = crabtime::eval! {  
        (std::f32::consts::PI.sqrt() * 10.0).round() as usize  
    };  
    
  • Macros de tipo función (Function-like Macros)
    • Se pueden definir con #[crabtime::function]
    • La función definida se convierte en macro y se ejecuta en tiempo de build
    • Se puede exportar la macro usando el atributo estándar #[macro_export]
  • La función donde se define la macro se inserta en la función main de un proyecto Rust temporal
  • Después de compilar, el código generado se devuelve a través de stdout

1 comentarios

 
GN⁺ 2025-03-26

Comentarios en Hacker News**

  • weinzierl
    • Elogia el logo de Crabtime y el intento de facilitar la creación de macros en Rust
    • Le resultaba incómodo que proc_macro requiriera un crate separado, y Crabtime parece resolver eso
    • Aun así, a diferencia de comptime de Zig, Crabtime parece más bien una versión ampliada de la evaluación en tiempo de compilación
    • La gran diferencia entre Zig y Rust es el acceso a la información de tipos: Zig lo permite, Rust no
    • En Rust se están usando rodeos como parsear RustDoc para obtener información de tipos
    • Crabtime no parece ofrecer capacidades de reflexión de tipos, y sin eso es difícil verlo como una implementación real de comptime
    • pron
      • El comptime de Zig es más fácil de entender y depurar porque no es una macro sintáctica
      • Funciona como una función que se ejecuta en runtime y, junto con una reflexión potente, actúa como un lenguaje parcialmente tipado
      • Con la sola función de comptime puede reemplazar muchas otras características del lenguaje, lo que hace que el lenguaje en sí sea más simple
      • Zig mantiene la simplicidad de C mientras ofrece una expresividad al nivel de C++
      • Agregar comptime a un lenguaje complejo dificulta obtener las ventajas de simplicidad que sí tiene Zig
  • pjmlp
    • Evalúa positivamente la evolución de la metaprogramación en C++
    • Empezó con hacks de templates en C++98 y en C++23 ha llegado a un nivel práctico
    • Espera que mejore aún más cuando se introduzca la reflexión en tiempo de compilación
    • En Rust, cada macro tiene una sintaxis distinta o depende de crates externos como syn, así que hay mucho que aprender
  • nindalf
    • Reescribió con Crabtime código de generación de benchmarks que había hecho con macros declarativas y quedó satisfecho con la experiencia
    • Al usar Crabtime pudo escribir la mayor parte del código como Rust normal, lo que mejoró la legibilidad y la personalización
    • Antes tenía que pasar el nombre del módulo cada vez, pero ahora puede leer y procesar archivos desde el disco
    • Al comparar paste!{} con crabtime::output!{}, considera que este último es mucho más intuitivo
    • También puede usar la sintaxis de for de Rust tal cual, en lugar de patrones de macros complejos para los bucles
    • Gracias a Crabtime, ahora se siente con más confianza respecto a la metaprogramación en Rust
    • La versión anterior se anunció hace unas semanas y la nueva hace dos días, así que todavía no hay muchos usuarios
    • Antes ni él mismo entendía bien las macros que había escrito, pero con Crabtime pudo escribirlas y mantenerlas con claridad
  • orman784
    • Menciona que, al necesitar escribir macros complejas, sintió los límites de macro_rules y terminó escribiendo todo el código directamente
    • Preferiría evitar proc_macro, pero normalmente hay que agregar dependencias como syn, quote y proc_macro2, lo que no le convence
    • Le gustaría probar si Crabtime puede resolver eso
    • Aún no ha revisado cuántas dependencias adicionales implica, pero si es posible quiere reducirlas