[Rust] Procedural ๋งคํฌ๋ก
๋ฌ์คํธ๋ println! ๊ฐ์ ๋จ์ํ ๋งคํฌ๋ก ํจ์ ์ธ์๋, ์ฝ๋์ ๊ฐ์ญํ๊ณ ์ง์ ํ์ฅํ ์ ์๋ ์์ ๋ก์ด ๋งคํฌ๋ก ํ์์ ์ง์ํ๋ค.
๋จผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ค.
proc..๋งคํฌ๋ก๋ ๋ฌด์กฐ๊ฑด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์์ผ๋ก๋ง ๋น๋๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํฐ๋ฏธ๋์์ cargo new ๋ช
๋ น์ด๋ก ์์ฑํ ๊ฒฝ์ฐ, --bin ํ๋๊ทธ ๋์ --lib๋ฅผ ์ค๋ค.
๊ทธ๋ผ ๋ญ ์ด๋ ๊ฒ ๋์ด์์ ๊ฒ์ด๋ค.
๋งคํฌ๋ก์ ์ฌ์ฉ์ ์ํด ์ค์ ํ์ผ์์ proc-macro ๊ฐ์ true๋ก ์ค์ ํด์ค๋ค.

proc_crate๋ฅผ extern crateํ๋ฉด ์ด์ procedural ๋งคํฌ๋ก์ ์ฌ์ฉ์ด ๊ฐ๋ฅํด์ง๋ค.
ํ๋ฒ ํจ์๋ฅผ ๋ง๋๋ ๋งคํฌ๋ก๋ฅผ ๋ง๋ค์ด๋ณด๊ฒ ๋ค.
ํจ์ํ(Function like) ๋งคํฌ๋ก
proc ๋งคํฌ๋ก๋ ํจ์์ ํ์์ผ๋ก ๊ตฌํ๋ ์ ์๋๋ฐ, ํจ์ ์์๋ค #[proc_macro] ๋งคํฌ๋ก๋ฅผ ๋ถ์ฌ์ฃผ๊ณ ์ธ์ํ์
๊ณผ ๋ฐํํ์
์ ์ ๋ถ TokenStream์ด๋ผ๋ ํ์
์ผ๋ก ๋ง์ถฐ์ค๋ค.
์ฝ๋๋ฅผ ๋ฐ๊ณ ์ฝ๋๋ฅผ ๋ฐฉ์ถํ๋ค๋ ์๋ฏธ๋ค. TokenStream์ ์์ค์ฝ๋๋ฅผ ๋ํ๋ด๋ ํ์
์ด๋ค.
๊ทธ๋ผ
์ด๋ฐ์์ผ๋ก ์ง๋ณผ ์ ์๋ค.
์ ๋งคํฌ๋ก๊ฐ ์คํ๋๋ฉด ๊ทธ ์คํ๋ ์์น์์ ๋ฐ๋ก ์ ๋ฐํํ ํ
์คํธ๊ฐ ์๋ฆฌ๋ฅผ ์ฐจ์งํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ ๋น๋ํ๊ณ , ํ ์คํธ๋ฅผ ํด๋ณด๊ฒ ๋ค.
๋น๋๊ฐ ์ด๋ ๊ฒ ์ ๋๋ค๋ฉด, ์ด ํ๋ก์ ํธ ํด๋์ ๊ฒฝ๋ก๋ฅผ ๋ณต์ฌํด๋๊ณ , ๋ฐ๋ก ํ
์คํธ์ฉ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๊ฑฐ๋ ์ฐ๋ค.
์๊น ๊ทธ ํด๋๋ฅผ ์์กด์ฑ์ผ๋ก ์ถ๊ฐํด์ฃผ๊ณ
์ด๋ ๊ฒ ์ง์ ๋๋ฆฌ๋ฉด, ์ ๋๋ค.
์ธ์๋ฅผ ์ ๋ฌํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค! ์๊น ๋งคํฌ๋ก ์ ์์ item ์ธ์๊ฐ ๊ทธ๊ฑธ ๋ฐ์์ค๋ ๋ ์์ด๋ค.
ํฐ๋ฏธ๋์ ๋ด์ฉ์ ์ถ๋ ฅํ๋๋ก ๋ฐ๊ฟ์ฃผ๊ณ
๋๋ฆฌ๋ฉด
์ ๋๋ค.
์ด์ธ์๋ ๋ช๊ฐ์ง ํ์์ด ๋ ์๋ค.
์์ฑ(attribute) ๋งคํฌ๋ก
์ด๊ฑด ํจ์ ๋ฑ์ ์ ์ ์์ ๋ถ์ฌ์ ํด๋น ์ ์๋ฅผ ์์ ํ ์ ์๋ ๋งคํฌ๋ก๋ค.
๋, ์์ฑ์ ์ธ์๋ฅผ ์ ๋ฌํ ์๋ ์๋ค.
์ด๋ฐ์์ผ๋ก ์ ์ํ๊ณ

์ด๋ ๊ฒ ์ฌ์ฉํ๋ค๋ฉด,

์ attribute๋ผ๋ ์ธ์๋ก๋ "์ผ์์
"์ด๋ผ๋ ํ
์คํธ๊ฐ,
item์๋ ์ ํจ์ ์ ์ ์ ์ฒด๊ฐ ๋ค์ด๊ฐ๋ค.
์ด๋ ๊ฒ ๋ง์ด๋ค.
์ฌ๊ธฐ์ ๊ทธ๋ฅ ๋ด์ฉ๋ฌผ์ ๋ณด๊ธฐ๋ง ํ์ง๋ง, TokenStream ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ๋ฐํํ๋ค๋ฉด ๊ทธ๊ฒ ๊ธฐ์กด์ ํจ์ ์ ์๋ฅผ ๋์ฒดํ๋ค.
ํ์(derive) ๋งคํฌ๋ก
์ด๊ฑด ๊ตฌ์กฐ์ฒด ์์ ๋ถ์ฌ์ ํธ๋ ์ ๋ฑ์ ์๋์ผ๋ก ๊ตฌํํ๊ฒ๋ ํด์ค ๋ ์์ฃผ ์ฌ์ฉ๋๋ค.
proc_macro_derive๋ผ๋ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํด ๊ตฌํ๋๋๋ฐ, ํํ๋ ์๋์ ๊ฐ๋ค.
์ด ์ธ์๋ก ๋ค์ด์ค๋ ํ
์คํธ๊ฐ ์ฐ๋ฆฌ๊ฐ ์ ์ํ ๋งคํฌ๋ก์ ์ด๋ฆ์ด ๋๋ค. ์ฌ๊ธฐ์ Boom์ด ์ด ๋งคํฌ๋ก์ ์ด๋ฆ์ธ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ๋งคํฌ๋ก์์ ๋ฐํํ TokenStream ์ฝ๋๋ ์ ์ญ ๊ณต๊ฐ์ ๋ค์ด๊ฐ๋ค.
๋ฐ๋ผ์ ์ ์ฝ๋๋ ๊ทธ๋ฅ ์ ์ญ ํจ์ boom ํ๋๋ง ๋ฐฉ์ถํ๋ ๊ฒ์ด๋ค...
์ผ๋จ ๊ฐ๊ฒฐํจ์ ์ํด์ ๋์ถฉ ์จ์ ๊ทธ๋ฐ๋ฐ, ์ง์ง ํ์์ ๊ตฌํํ๊ณ ์ถ๋ค๋ฉด item์ผ๋ก ๋ค์ด์จ ๊ตฌ์กฐ์ฒด ์ด๋ฆ์ ์ป์ด์, impl ๊ตฌ๋ฌธ์ ์์ฑํด์ฃผ๋ฉด ๋๋ค.
์ฌํผ ์ ๊ฑธ ๋๋ฆฌ๋ฉด
์ด๋ ๊ฒ ์ ๋์๊ฐ๋ค.
์ฐธ์กฐ
https://doc.rust-lang.org/proc_macro/
https://doc.rust-lang.org/reference/procedural-macros.html