# Crabtime - Zig의 Comptime을 Rust에서 사용합시다

> Clean Markdown view of GeekNews topic #19967. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=19967](https://news.hada.io/topic?id=19967)
- GeekNews Markdown: [https://news.hada.io/topic/19967.md](https://news.hada.io/topic/19967.md)
- Type: news
- Author: [xguru](https://news.hada.io/@xguru)
- Published: 2025-03-26T09:56:01+09:00
- Updated: 2025-03-26T09:56:01+09:00
- Original source: [crates.io](https://crates.io/crates/crabtime)
- Points: 6
- Comments: 1

## Summary

Crabtime은 컴파일 타임에 인라인 Rust 로직을 평가하여 새로운 코드를 생성하는 매크로로, Procedural 매크로보다 유연성과 성능이 뛰어나며 macro_rules보다 읽고 쓰기 쉽습니다. 이 매크로는 Token Stream, Macro Fragments, Rust 코드로 Input/Output을 모두 지원하며, IDE 지원과 코드 포맷팅 기능을 제공하여 가독성이 우수합니다. 또한, 함수형 매크로를 정의하고 빌드 시점에 실행할 수 있으며, 컴파일 후 생성된 코드는 `stdout`을 통해 반환됩니다.

## Topic Body

- **컴파일 타임**에 인라인 Rust 로직을 평가하여 **새로운 코드를 생성하여 추가**해주는 매크로   
- Procedural 매크로보다 더 많은 유연성과 성능을 제공하는 동시에 macro_rules보다 읽고 쓰기가 더 쉽고 자연스러움   
- Token Stream/Macro Fragments/Rust 코드로 Input/Output 모두 지원   
- **IDE 지원**, **코드 포맷팅**, 인라인 정의 가능하며 가독성이 뛰어남  
- 원샷-eval : 복잡한 컴파일 타임 연산을 간단하게 처리 가능  
  ```rust  
  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`을 통해 반환

## Comments



### Comment 36355

- Author: neo
- Created: 2025-03-26T09:57:01+09:00
- Points: 1

##### [해커뉴스 댓글들](https://news.ycombinator.com/item?id=43415820)**  
- **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처럼 단순함의 이점을 얻기 어려움  
- **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이 이를 해결해줄 수 있을지 **테스트해보고 싶음**  
  - 의존성 추가가 얼마나 될지는 아직 확인하지 않았지만, 가능하면 줄이고 싶음
