Rust 매크로

Rust 매크로

날짜
생성자
ShalomShalom
카테고리
rust
작성일
2023년 05월 15일
태그
rust
이전 블로그

매크로

매크로 |-선언적 매크로 | |-프로시져 매크로 |- functional 매크로 |- derive 매크로 |- Attribute 매크로

선언적 매크로 (Declarative Macro)

  • 타입 또는 변수 등등을 패턴으로 입력받아 동작하는 매크로이다.
  • ignis-app의 helper에 정의 되어 있는 매크로형식
  • #[macro_export] 를 통해 해당 Crate가 사용될때 같이 사용 될수 있다.
  • 매크로 이름!(패턴) {(패턴)=> 코드} 형식으로 만든다.
  • 예시
#[macro_export] macro_rules! vec { ( $( $x:expr ),* ) => { // *는 반복한다고 볼수 있다. { let mut temp_vec = Vec::new(); $( temp_vec.push($x); )* temp_vec } }; }
  • 오버로딩과 같이 동일한 이름의 다른 파라미터를 받는 함수 매크로도 만들 수 있다.
  • 길게는 Abstract Syntax Tree 짧게는 AST라고 한다.
    • 매크로의 파라미터의 형태에 따라 매크로의 동작 내용이 달라진다.
#[macro_export] macro_rules! overload { ($n1:expr) => { println!("{}",$n1) }; ($n1:expr,$n2:expr) => { println!("{}, {}",$n1,$n2) }; } fn main() { overload!(10); overload!(5,5) } ============================================ 10 5, 5 ============================================

파라미터 타입

  • stmt: a Statement without the trailing semicolon (except for item statements that require semicolons)
  • tt: a TokenTree (a single token or tokens in matching delimiters ()[], or {})
  • meta: an Attr, the contents of an attribute

프로시져 매크로

<aside> 💡 선언적 매크로는 코드를 패턴과 매치시키고 다른 코드로 대체하는 반면, 절차적 매크로는 어떤 러스트 코드를 입력 받고, 코드를 연산하여 러스트 코드를 생성합니다. 이 내용이 작성된 시점엔 derive 어노테이션에 특정 트레잇 이름을 지정하여, 타입에 해당 트레잇을 구현하도록 하는 데에만 절차적 매크로를 정의할 수 있습니다.
</aside>
  • lib 프로젝트에서 Cargo.toml 파일을 proc_macro = true 로 편집하여 매크로를 만들수 있다.
  • TokenStream은 위의 AST 자료 구조를 대체하는 자료형이라 생각하시면 됩니다.
  • 프로시져 매크로는 다음의 형태를 가지고 있다.
use proc_macro; #[매크로와 유관한 특성] pub fn 매크로이름(input: TokenStream) -> TokenStream { // snip }

함수형 매크로(Function like macros)

함수를 만들어 주는 매크로라고 이해하면 됩니다.

lib.rs

/* src/lib.rs */ use proc_macro::TokenStream; #[proc_macro] pub fn make_answer(_: TokenStream) -> TokenStream { "fn answer(a:u32) -> u32 {a}" //answer()를 &str형태로 정의후 반환 .parse().unwrap() }

main.rs

extern crate hello_macro; use hello_macro::make_answer; make_answer!(); // make_answer로 answer()를 만듬 /* fn answer */ fn main() { println!("{}", answer(3)); } ======================= 3 =======================

파생 매크로(Derive macros)

derive를 통해 구조체의 trait을 열거하는 매크로이다.
각각 trait default 값을 사용한다.

속성 매크로(Attribute macros)

모든

참고 자료

댓글

guest