Crabtime - Zig의 Comptime을 Rust에서 사용합시다
(crates.io)- 컴파일 타임에 인라인 Rust 로직을 평가하여 새로운 코드를 생성하여 추가해주는 매크로
- Procedural 매크로보다 더 많은 유연성과 성능을 제공하는 동시에 macro_rules보다 읽고 쓰기가 더 쉽고 자연스러움
- Token Stream/Macro Fragments/Rust 코드로 Input/Output 모두 지원
- IDE 지원, 코드 포맷팅, 인라인 정의 가능하며 가독성이 뛰어남
- 원샷-eval : 복잡한 컴파일 타임 연산을 간단하게 처리 가능
const MY_NUM: usize = crabtime::eval! { (std::f32::consts::PI.sqrt() * 10.0).round() as usize };
- 함수형 매크로 (Function-like Macros)
-
#[crabtime::function]
으로 함수형 매크로 정의 가능 - 정의된 함수는 매크로로 변환되어 빌드 시점에 실행됨
- 표준
#[macro_export]
속성을 사용해 매크로 내보내기 가능
-
- 매크로 정의된 함수는 임시 Rust 프로젝트의
main
함수로 삽입됨 - 컴파일 후 생성된 코드를
stdout
을 통해 반환
해커뉴스 댓글들**
-
weinzierl
- Crabtime의 로고를 칭찬함, Rust 매크로를 쉽게 만드는 시도
-
proc_macro
가 별도 크레이트가 필요한 점이 불편했는데, Crabtime이 이를 해결하는 것처럼 보임 - 다만 Crabtime은 Zig의
comptime
과는 다르게, 단순한 컴파일 타임 평가 기능의 확장판처럼 보임 - Zig와 Rust의 큰 차이는 타입 정보 접근 가능 여부로, Zig는 가능하지만 Rust는 불가능함
- Rust에서는 타입 정보를 얻기 위해
RustDoc
파싱 같은 우회 방법을 사용하고 있음 - Crabtime이 타입 리플렉션 기능을 제공하지 않는 것으로 보이며, 이 기능 없이는 진정한
comptime
구현이라 보기 어려움 -
pron
- Zig의
comptime
은 문법 매크로가 아니기 때문에 더 쉽게 이해하고 디버깅할 수 있음 - 마치 런타임에 실행되는 함수처럼 동작하며, 강력한 리플렉션과 함께 부분적으로 타입을 가진 언어처럼 작동함
-
comptime
기능 하나만으로 다른 많은 언어 기능을 대체할 수 있어서, 언어 자체가 단순해짐 - Zig는 C 수준의 단순성을 유지하면서도 C++ 수준의 표현력을 제공함
- 복잡한 언어에
comptime
을 추가하는 것은 Zig처럼 단순함의 이점을 얻기 어려움
- Zig의
-
pjmlp
- C++의 메타프로그래밍 발전을 긍정적으로 평가함
- C++98의 템플릿 해킹에서 시작해 C++23에서는 실용적인 수준으로 발전함
- 향후 컴파일 타임 리플렉션이 도입되면 더 나아질 전망임
- Rust는 매크로마다 문법이 다르거나,
syn
같은 외부 크레이트에 의존해야 해서 배워야 할 게 많음
-
nindalf
- 선언적 매크로로 작성했던 벤치마크 생성 코드를 Crabtime으로 재작성하여 만족스러운 경험을 함
- Crabtime을 사용하면서 대부분의 코드를 Rust처럼 작성할 수 있어서 가독성과 커스터마이징이 향상됨
- 예전에는 모듈명을 매번 전달해야 했지만, 이제는 디스크에서 파일을 읽어 처리할 수 있음
-
paste!{}
와crabtime::output!{}
의 사용 비교에서 후자가 훨씬 직관적이라고 평가함 - 반복문 문법도 복잡한 매크로 패턴 대신 Rust의
for
문법을 그대로 사용 가능함 - Crabtime 덕분에 Rust 메타프로그래밍에 대해 더 자신감을 갖게 됨
- 이전 버전은 몇 주 전에, 새로운 버전은 이틀 전에 발표되어 사용자 수는 많지 않음
- 이전에 작성한 매크로를 자신도 잘 이해 못했으나, Crabtime으로는 명확하게 작성하고 유지할 수 있었음
-
orman784
- 복잡한 매크로 작성이 필요한 상황에서
macro_rules
만으로는 한계를 느껴 전체 코드를 직접 작성했다고 언급 -
proc_macro
사용은 피하고 싶지만, 대개syn
,quote
,proc_macro2
같은 의존성을 추가해야 해서 불만족 - Crabtime이 이를 해결해줄 수 있을지 테스트해보고 싶음
- 의존성 추가가 얼마나 될지는 아직 확인하지 않았지만, 가능하면 줄이고 싶음
- 복잡한 매크로 작성이 필요한 상황에서