Crabtime - มาใช้ Comptime ของ Zig ใน Rust กัน
(crates.io)- แมโครที่ประเมินลอจิก 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]
- สามารถนิยาม function-like macro ได้ด้วย
- ฟังก์ชันที่นิยามแมโครจะถูกแทรกเข้าไปในฟังก์ชัน
mainของโปรเจกต์ Rust ชั่วคราว - หลังคอมไพล์เสร็จ โค้ดที่สร้างขึ้นจะถูกส่งกลับผ่าน
stdout
1 ความคิดเห็น
ความคิดเห็นบน Hacker News**
proc_macroต้องมี crate แยกต่างหากนั้นไม่สะดวก และ Crabtime ก็ดูเหมือนจะช่วยแก้ปัญหานี้ได้comptimeของ Zig ตรงที่มันคล้าย เวอร์ชันขยายของความสามารถในการประเมินผลตอนคอมไพล์แบบธรรมดา มากกว่าRustDocเพื่อดึงข้อมูล typecomptimeที่แท้จริงcomptimeของ Zig ไม่ใช่ syntax macro จึงเข้าใจและดีบักได้ง่ายกว่าcomptimeอย่างเดียวก็แทนที่ฟีเจอร์ภาษาอื่นได้อีกมาก ทำให้ตัวภาษาง่ายขึ้นcomptimeเข้าไปในภาษาที่ซับซ้อนอยู่แล้ว ทำให้ได้ประโยชน์ด้านความเรียบง่ายแบบ Zig ได้ยากsynทำให้ มีสิ่งที่ต้องเรียนรู้เยอะpaste!{}มาเทียบกับcrabtime::output!{}ก็มองว่าอย่างหลังตรงไปตรงมามากกว่าforของ Rust ได้ตรง ๆ แทนรูปแบบ macro ที่ซับซ้อนmacro_rulesอย่างเดียวมีข้อจำกัด จนสุดท้ายต้องเขียนโค้ดทั้งหมดเองproc_macroแต่โดยมากก็ต้องเพิ่ม dependency อย่างsyn,quote,proc_macro2จึงรู้สึกไม่ค่อยพอใจ