6 pontos por xguru 2025-03-26 | 1 comentários | Compartilhar no WhatsApp
  • Macro que avalia lógica Rust inline em tempo de compilação para gerar e adicionar novo código
  • Oferece mais flexibilidade e desempenho do que macros procedurais, ao mesmo tempo em que é mais fácil e natural de ler e escrever do que macro_rules
  • Suporta tanto entrada quanto saída com Token Stream/Macro Fragments/código Rust
  • Suporte a IDE, formatação de código, definição inline e excelente legibilidade
  • One-shot eval: permite lidar facilmente com operações complexas em tempo de compilação
    const MY_NUM: usize = crabtime::eval! {  
        (std::f32::consts::PI.sqrt() * 10.0).round() as usize  
    };  
    
  • Macros no estilo função (Function-like Macros)
    • É possível definir macros no estilo função com #[crabtime::function]
    • A função definida é convertida em macro e executada no momento do build
    • É possível exportar a macro usando o atributo padrão #[macro_export]
  • A função em que a macro é definida é inserida na função main de um projeto Rust temporário
  • Após a compilação, o código gerado é retornado via stdout

1 comentários

 
GN⁺ 2025-03-26

Comentários do Hacker News**

  • weinzierl
    • Elogia o logo do Crabtime e a tentativa de facilitar a criação de macros em Rust
    • Achava incômodo o fato de proc_macro exigir um crate separado, e o Crabtime parece resolver isso
    • No entanto, o Crabtime parece diferente do comptime do Zig, mais como uma versão estendida de avaliação simples em tempo de compilação
    • A grande diferença entre Zig e Rust é a possibilidade de acessar informações de tipo; no Zig isso é possível, no Rust não
    • No Rust, estão sendo usados métodos indiretos, como parsear RustDoc, para obter informações de tipo
    • O Crabtime aparentemente não oferece recursos de reflexão de tipos, e sem isso é difícil considerá-lo uma implementação verdadeira de comptime
    • pron
      • O comptime do Zig é mais fácil de entender e depurar porque não é uma macro sintática
      • Funciona como uma função executada em tempo de execução e, com reflexão poderosa, opera como uma linguagem parcialmente tipada
      • Só o recurso de comptime já pode substituir muitos outros recursos de linguagem, deixando a própria linguagem mais simples
      • O Zig mantém a simplicidade do C, mas oferece expressividade no nível do C++
      • Adicionar comptime a uma linguagem complexa dificulta obter os benefícios de simplicidade que o Zig tem
  • pjmlp
    • Avalia positivamente a evolução da metaprogramação em C++
    • Ela começou com hacks de templates no C++98 e, no C++23, evoluiu para um nível prático
    • A perspectiva é de melhora adicional quando a reflexão em tempo de compilação for introduzida
    • No Rust, cada macro tem uma sintaxe diferente ou depende de crates externos como syn, então há muita coisa para aprender
  • nindalf
    • Reescreveu com Crabtime um código de geração de benchmarks que havia sido feito com macros declarativas e teve uma experiência satisfatória
    • Ao usar Crabtime, foi possível escrever a maior parte do código como Rust normal, o que melhorou a legibilidade e a customização
    • Antes era preciso passar o nome do módulo toda vez, mas agora é possível ler e processar arquivos diretamente do disco
    • Na comparação entre paste!{} e crabtime::output!{}, considera a segunda muito mais intuitiva
    • A sintaxe de repetição também pode usar diretamente o for do Rust, em vez de padrões de macro complexos
    • Graças ao Crabtime, passou a ter mais confiança na metaprogramação em Rust
    • A versão anterior foi anunciada há algumas semanas, e a nova há dois dias, então ainda não há muitos usuários
    • Antes, nem ele entendia muito bem as macros que havia escrito, mas com Crabtime conseguiu escrever algo claro e fácil de manter
  • orman784
    • Menciona que, em situações que exigiam macros complexas, sentiu os limites de macro_rules e acabou escrevendo todo o código manualmente
    • Quer evitar o uso de proc_macro, mas normalmente é preciso adicionar dependências como syn, quote e proc_macro2, o que considera insatisfatório
    • Quer testar se o Crabtime pode resolver isso
    • Ainda não verificou quanto isso adiciona em dependências, mas gostaria de reduzir isso se possível