매크로
매크로 |-선언적 매크로 | |-프로시져 매크로 |- 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 ============================================
파라미터 타입
item
: an Item
block
: a BlockExpression
stmt
: a Statement without the trailing semicolon (except for item statements that require semicolons)
pat
: a Pattern
expr
: an Expression
ty
: a Type
ident
: an IDENTIFIER_OR_KEYWORD
path
: a TypePath style path
meta
: an Attr, the contents of an attribute
lifetime
: a LIFETIME_TOKEN
vis
: a possibly empty Visibility qualifier
literal
: matches ``LiteralExpression
프로시져 매크로
<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)
모든
참고 자료
- 예제 파일 링크
댓글