6 คะแนน โดย xguru 2025-03-26 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • แมโครที่ประเมินลอจิก Rust แบบอินไลน์ในช่วงคอมไพล์ เพื่อสร้างโค้ดใหม่และเพิ่มเข้าไป
  • ให้ทั้งความยืดหยุ่นและประสิทธิภาพมากกว่า procedural macro ขณะเดียวกันก็อ่านและเขียนได้ง่ายและเป็นธรรมชาติมากกว่า macro_rules
  • รองรับทั้ง Input/Output ด้วย Token Stream / Macro Fragments / โค้ด Rust
  • รองรับ IDE, การจัดรูปแบบโค้ด, สามารถนิยามแบบอินไลน์ได้ และมีความอ่านง่ายสูง
  • one-shot eval: จัดการงานคำนวณช่วงคอมไพล์ที่ซับซ้อนได้อย่างง่ายดาย
    const MY_NUM: usize = crabtime::eval! {  
        (std::f32::consts::PI.sqrt() * 10.0).round() as usize  
    };  
    
  • Function-like Macros
    • สามารถนิยาม function-like macro ได้ด้วย #[crabtime::function]
    • ฟังก์ชันที่นิยามไว้จะถูกแปลงเป็นแมโครและรันในช่วง build
    • สามารถ export แมโครได้ด้วยแอตทริบิวต์มาตรฐาน #[macro_export]
  • ฟังก์ชันที่นิยามแมโครจะถูกแทรกเข้าไปในฟังก์ชัน main ของโปรเจกต์ Rust ชั่วคราว
  • หลังคอมไพล์เสร็จ โค้ดที่สร้างขึ้นจะถูกส่งกลับผ่าน stdout

1 ความคิดเห็น

 
GN⁺ 2025-03-26

ความคิดเห็นบน Hacker News**

  • weinzierl
    • ชื่นชมโลโก้ของ Crabtime และความพยายามที่จะทำให้การสร้าง Rust macro ง่ายขึ้น
    • ก่อนหน้านี้รู้สึกว่าการที่ proc_macro ต้องมี crate แยกต่างหากนั้นไม่สะดวก และ Crabtime ก็ดูเหมือนจะช่วยแก้ปัญหานี้ได้
    • แต่ Crabtime ดูแตกต่างจาก comptime ของ Zig ตรงที่มันคล้าย เวอร์ชันขยายของความสามารถในการประเมินผลตอนคอมไพล์แบบธรรมดา มากกว่า
    • ความต่างใหญ่ระหว่าง Zig กับ Rust คือ การเข้าถึงข้อมูล type โดย Zig ทำได้ แต่ Rust ทำไม่ได้
    • ใน Rust มีการใช้วิธีอ้อมอย่างการ parse RustDoc เพื่อดึงข้อมูล type
    • Crabtime ดูเหมือนจะยังไม่มีความสามารถด้าน type reflection และถ้าไม่มีฟีเจอร์นี้ก็คงยากจะมองว่าเป็น comptime ที่แท้จริง
    • pron
      • comptime ของ Zig ไม่ใช่ syntax macro จึงเข้าใจและดีบักได้ง่ายกว่า
      • มันทำงานเหมือนฟังก์ชันที่รันตอน runtime และเมื่อรวมกับ reflection ที่ทรงพลัง ก็ทำให้ภาษาทำงานคล้ายภาษาที่มี type แบบบางส่วน
      • แค่ความสามารถ comptime อย่างเดียวก็แทนที่ฟีเจอร์ภาษาอื่นได้อีกมาก ทำให้ตัวภาษาง่ายขึ้น
      • Zig รักษาความเรียบง่ายระดับ C ไว้ได้ พร้อมให้ความสามารถในการแสดงออกระดับ C++
      • การเพิ่ม comptime เข้าไปในภาษาที่ซับซ้อนอยู่แล้ว ทำให้ได้ประโยชน์ด้านความเรียบง่ายแบบ Zig ได้ยาก
  • pjmlp
    • มองพัฒนาการของ metaprogramming ใน C++ ในแง่บวก
    • เริ่มจากการ hack template ใน C++98 และใน C++23 ก็พัฒนามาถึงระดับที่ใช้งานได้จริง
    • หากในอนาคตมี compile-time reflection ก็มีแนวโน้มว่าจะดีขึ้นไปอีก
    • ฝั่ง Rust นั้นแต่ละ macro มี syntax ต่างกัน หรือไม่ก็ต้องพึ่ง crate ภายนอกอย่าง syn ทำให้ มีสิ่งที่ต้องเรียนรู้เยอะ
  • nindalf
    • ลองเขียนโค้ดสร้าง benchmark ที่เดิมทำด้วย declarative macro ใหม่ด้วย Crabtime และรู้สึกว่าประสบการณ์น่าพอใจ
    • เมื่อใช้ Crabtime ก็สามารถเขียนโค้ดส่วนใหญ่ให้เป็นสไตล์ Rust ปกติได้ จึง ช่วยให้อ่านง่ายและปรับแต่งได้ดีขึ้น
    • เมื่อก่อนต้องส่งชื่อโมดูลเข้าไปทุกครั้ง แต่ตอนนี้สามารถอ่านไฟล์จากดิสก์แล้วประมวลผลได้
    • เมื่อนำการใช้ paste!{} มาเทียบกับ crabtime::output!{} ก็มองว่าอย่างหลังตรงไปตรงมามากกว่า
    • แม้แต่ syntax ของลูปก็ยังใช้ for ของ Rust ได้ตรง ๆ แทนรูปแบบ macro ที่ซับซ้อน
    • Crabtime ทำให้เขา มั่นใจใน metaprogramming ของ Rust มากขึ้น
    • เวอร์ชันก่อนหน้าถูกเปิดตัวเมื่อไม่กี่สัปดาห์ก่อน และเวอร์ชันใหม่เพิ่งเปิดตัวเมื่อสองวันก่อน จึงยังมีผู้ใช้ไม่มาก
    • ก่อนหน้านี้แม้แต่ macro ที่ตัวเองเขียนก็ยังเข้าใจไม่หมด แต่พอใช้ Crabtime ก็เขียนและดูแลรักษาได้ชัดเจนขึ้น
  • orman784
    • เล่าว่าในสถานการณ์ที่ต้องเขียน macro ซับซ้อน รู้สึกว่า macro_rules อย่างเดียวมีข้อจำกัด จนสุดท้ายต้องเขียนโค้ดทั้งหมดเอง
    • ไม่อยากใช้ proc_macro แต่โดยมากก็ต้องเพิ่ม dependency อย่าง syn, quote, proc_macro2 จึงรู้สึกไม่ค่อยพอใจ
    • อยากลองทดสอบดูว่า Crabtime จะช่วยแก้ปัญหานี้ได้หรือไม่
    • ยังไม่ได้ตรวจสอบว่าจะต้องเพิ่ม dependency มากแค่ไหน แต่ถ้าเป็นไปได้ก็อยากลดให้เหลือน้อยที่สุด