6 điểm bởi xguru 2025-03-26 | 1 bình luận | Chia sẻ qua WhatsApp
  • Macro đánh giá logic Rust nội tuyến ở thời điểm biên dịch để tạo và chèn thêm mã mới
  • Cung cấp độ linh hoạt và hiệu năng cao hơn procedural macro, đồng thời dễ đọc và dễ viết hơn macro_rules
  • Hỗ trợ cả input/output bằng Token Stream/Macro Fragments/mã Rust
  • hỗ trợ IDE, định dạng mã, cho phép định nghĩa nội tuyến và có độ dễ đọc cao
  • One-shot eval: có thể xử lý đơn giản các phép tính phức tạp ở thời điểm biên dịch
    const MY_NUM: usize = crabtime::eval! {
        (std::f32::consts::PI.sqrt() * 10.0).round() as usize
    };
    
  • Macro dạng hàm (Function-like Macros)
    • Có thể định nghĩa macro dạng hàm bằng #[crabtime::function]
    • Hàm đã định nghĩa sẽ được chuyển thành macro và chạy ở thời điểm build
    • Có thể export macro bằng thuộc tính chuẩn #[macro_export]
  • Hàm được định nghĩa bằng macro sẽ được chèn vào hàm main của một dự án Rust tạm thời
  • Mã được tạo sau khi biên dịch sẽ được trả về qua stdout

1 bình luận

 
GN⁺ 2025-03-26

Bình luận trên Hacker News**

  • weinzierl
    • Khen logo của Crabtime, và đánh giá cao nỗ lực giúp việc tạo macro Rust trở nên dễ dàng hơn
    • Cảm thấy bất tiện vì proc_macro cần một crate riêng, và Crabtime có vẻ như giải quyết được điều này
    • Tuy nhiên, Crabtime dường như khác với comptime của Zig, mà giống phiên bản mở rộng của tính năng đánh giá tại thời điểm biên dịch đơn thuần hơn
    • Khác biệt lớn giữa Zig và Rust là khả năng truy cập thông tin kiểu; Zig làm được còn Rust thì không
    • Trong Rust, người ta đang dùng các cách vòng như parse RustDoc để lấy thông tin kiểu
    • Có vẻ Crabtime không cung cấp tính năng reflection kiểu, và thiếu tính năng này thì khó có thể xem là một triển khai comptime thực sự
    • pron
      • comptime của Zig không phải là macro cú pháp, nên dễ hiểu và dễ debug hơn
      • Nó hoạt động như các hàm chạy ở runtime, và cùng với reflection mạnh mẽ, vận hành như một ngôn ngữ có kiểu từng phần
      • Chỉ riêng tính năng comptime đã có thể thay thế nhiều tính năng ngôn ngữ khác, khiến bản thân ngôn ngữ trở nên đơn giản hơn
      • Zig giữ được sự đơn giản ở mức C nhưng vẫn cung cấp khả năng biểu đạt ở mức C++
      • Việc thêm comptime vào một ngôn ngữ phức tạp sẽ khó đạt được lợi ích về tính đơn giản như Zig
  • pjmlp
    • Đánh giá tích cực sự phát triển của metaprogramming trong C++
    • Bắt đầu từ kiểu hack template của C++98, và đến C++23 đã phát triển tới mức thực dụng
    • Nếu sau này có thêm reflection tại thời điểm biên dịch thì triển vọng còn tốt hơn nữa
    • Trong Rust, mỗi macro lại có cú pháp khác nhau, hoặc phải phụ thuộc vào các crate bên ngoài như syn, nên có rất nhiều thứ phải học
  • nindalf
    • Đã viết lại đoạn mã sinh benchmark vốn được viết bằng macro khai báo sang Crabtime và có trải nghiệm rất hài lòng
    • Khi dùng Crabtime, phần lớn mã có thể được viết theo kiểu Rust thông thường nên tính dễ đọc và khả năng tùy biến được cải thiện
    • Trước đây phải truyền tên module mỗi lần, nhưng giờ có thể đọc file từ đĩa và xử lý
    • Khi so sánh cách dùng paste!{} với crabtime::output!{}, đánh giá cái sau trực quan hơn nhiều
    • Cú pháp vòng lặp cũng có thể dùng nguyên bản for của Rust thay vì các pattern macro phức tạp
    • Nhờ Crabtime mà cảm thấy tự tin hơn nhiều về metaprogramming trong Rust
    • Bản cũ được công bố vài tuần trước, còn bản mới được công bố hai ngày trước, nên số người dùng vẫn chưa nhiều
    • Trước đây ngay cả bản thân cũng không thật sự hiểu rõ macro mình từng viết, nhưng với Crabtime thì có thể viết và bảo trì rõ ràng hơn
  • orman784
    • Nhắc rằng trong những tình huống cần viết macro phức tạp, chỉ macro_rules thôi là thấy có giới hạn nên đã trực tiếp tự viết toàn bộ mã
    • Muốn tránh dùng proc_macro, nhưng thường vẫn phải thêm các dependency như syn, quote, proc_macro2, nên thấy không hài lòng
    • Muốn thử kiểm tra xem Crabtime có thể giải quyết việc này không
    • Chưa kiểm tra xem sẽ phải thêm bao nhiêu dependency, nhưng nếu có thể thì muốn giảm chúng xuống càng nhiều càng tốt