rust-lang / rfcs # 1681์ ๋ํ ์ถ์ ๋ฌธ์ ์ ๋๋ค.
cc @alexcrichton
๋ฆฌํธ๋จธ์ค ํ ์คํธ :
ํ๋ชจ:
proc_macro
proc-macro
#[proc_macro_derive(Foo)]
์์ฑproc-macro
์์๋ฅผ -L
๋ฐ #[macro_use]
๋ก๋ก๋ํ์ฌ๋ก๋proc-macro = true
์๋ ค์ง ๋ฒ๊ทธ :
mod foo
ํ ํฐ ์คํธ๋ฆผ ์คํจ-# 36691proc_macro
-# 38749์ ๋ํ ๋ฌธ์๊ฐ ๊ฒ์๋์ง ์์์ต๋๋ค.[X]๋ - ์ปดํ์ผ๋ฌ ๋ฉ์ดํฌ์ ์ ์ํด ์์ฑ ๋ ์์ฑ ์ ์ ํ์ ์ ์๋ '์ด๋ ค์ด ์ํ - https://github.com/rust-lang/rust/issues/35900#issuecomment -245978831
[x]- rustc_macro
์์ ๋ง๋ค๊ธฐ
libsyntax
librustc_macro
๋งํฌ๊ฐ ์์ต๋๋ค. ์ ๋ฐ๋ผ librustc_macro
์์ librustc_driver
rustc_macro
ํ๊ทธ๋ฅผ ํ์ค ํค๋์ ๋ถ์์ rustc_macro
์ ํจ๊ป #![crate_type = "rlib"]
rustc_macro
ํ๊ทธ ๋ง dylib๋ฅผ ์์ฑํ์ง ์์ต๋๋ค.libsyntax
์ TokenStream
๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ์ฌ libsyntax
rustc_macro
API ๊ตฌํTokenStream
lang ํญ๋ชฉ์ผ๋ก rustc_macro
ํ๊ทธ๋ฅผ ์ง์ ํ์ฌ ์ปดํ์ผ๋ฌ๊ฐ ์ธ์ํ๋๋กํฉ๋๋ค.rustc_macro_derive
์์ฑ ์ถ๊ฐfoo(bar)
ํ์์ด ์ ํํ์ง ํ์ธํ๊ณ ๋ค๋ฅธ ์ธ์ / ํ์์ ์์ต๋๋ค.TokenStream
lang ํญ๋ชฉ์ผ๋ก ์๋ช
์ ํ์ธํฉ๋๋ค.rustc_macro_derive
๋ชจ๋ ํจ์ ๊ธฐํธ๋ฅผ ์ฌ์ฉ๋๋ ํ์ ๋ชจ๋์ ํจ๊ป ๋ฉํ ๋ฐ์ดํฐ๋ก ์ธ์ฝ๋ฉํฉ๋๋ค.rustc-macro
์์ ์ ํ ์ถ๊ฐrustc-macro
์์ ๊ฐ dylibs๋ก ์ฐ๊ฒฐ๋ ์ ์๋๋กํฉ๋๋ค.#[rustc_macro_derive]
ํ๊ทธ๊ฐ ์ถ๊ฐ ๋ ํญ๋ชฉ ์ธ์ _reachable_ ํญ๋ชฉ์ด ์๋์ง ํ์ธํฉ๋๋ค.cfg(rustc_macro)
๋ฅผ ๋ถ์์ ํ cfg
์ง์๋ฌธ์ผ๋ก ์ถ๊ฐํ๊ณ rustc-macro
์์ ์ ํ์ ์ค์ ํฉ๋๋ค.rustc-macro
์์๊ฐ libsytnax์ ๋์ ์ผ๋ก ์ฐ๊ฒฐ๋๋์ง ํ์ธํฉ๋๋ค.rustc-macro
์์์ ๋ํ #[macro_use]
์ง์ ์์ฑrustc-macro
์์๋ฅผ ์ฐพ์ต๋๋ค.rustc-macro
์์์ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ์ฌ ๊ธฐํธ / ํ์ ๋ชจ๋ ์์ ๋ํด ์์ ๋ด
๋๋ค.dlopen
dylibrustc-macro
์ ์ ์ฌํ plugin = true
--crate-type=rustc-macro
ํต๊ณผ#[derive]
ํธ๋ ์ด ํธ๋ฅผ ๋ก๋ฉํ๋ ์ฐ๊ธฐ ํ
์คํธ์ํํด์ผ ํ ์์ ์ ๋ํ ์ฒดํฌ๋ฆฌ์คํธ๋ก ๋ฌธ์ ์ค๋ช ์ ์ ๋ฐ์ดํธํ์ต๋๋ค. ์์ ํ์ง๋ ์์ง๋ง 90 % ์ ๋๋ ์ป์ ์์์ ๊ฒ์ ๋๋ค.
์ข์์, ์ค๋ ์ด๊ฒ์ ์ดํด๋ณด๊ณ ์ผ๋ง๋ ๋ฉ๋ฆฌ ์๋์ง ๋ณด๊ฒ ์ต๋๋ค.
cc https://github.com/rust-lang/rust/pull/35957 , ๊ตฌํ
# 35957์์ : librustc_macro ํฌ๋ ์ดํธ์ ์ด๋ฆ์ ์ข ๋ ์๋ ค์ค์ผํฉ๋๋ค. ํนํ, ์ด๊ฒ์ ๋ชจ๋ ๋งคํฌ๋ก ์์ฑ์๋ฅผ์ํ ํ์ ์์๋ฅผ ํฌํจํ๋ ์๋ช
์ด ๊ธด ์์์ด๋ฏ๋ก rustc_macro (์ ์ด๋ ๋ด ๋ง์์๋)๋ก ์ ํํ๋ ๊ฒ์ ์ฝ 1.1 ์์ด๋์ด์ ๋ถ๊ณผํ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ์ด์ ์ ์ด๊ฒ์ ์ํด libmacro๋ฅผ ์ํ์ง๋ง macro
๋ ์์ฝ์ด์ด๊ธฐ ๋๋ฌธ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค (๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ฏธ๋์ ํค์๋๋ก ์ํ ์๋ ์์ต๋๋ค). @cgswords ์ ์ ๋
@nrc : ์ข์, ๋ช ๋ช ์ ๋ํ ๋ด ์ฆ๊ฐ์ ์ธ ์๊ฐ :
extern crate macros;
-์งง๊ณ ๋ฌ์ฝคํ์ง๋ง ๋งคํฌ๋ก๋ฅผ ์์ฑํ๊ธฐ์ํ ์ง์ ์ฝ๋๊ฐ ์๋ ํฌํจ ๋ ๋งคํฌ๋ก๋ก ์ฝ์ ์ ์์ต๋๋ค.extern crate macro_runtime;
-๊นกํต์ ์ ํ ๊ทธ๋๋กextern crate metarust;
-Rust์์ ์๋ํ๊ธฐ ์ํด Rust์ ๋ํด Rust๋ฅผ ์์ฑํ์ธ์.extern crate bikeshed;
-์ ์ฐจ ์ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ๋ฉด ์ํ๋ ์์์ Rust๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค!extern crate macrame;
- "๋งคํฌ๋ก ๋ฉ์ดํฌ [r]"์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ๋ฏธ๋์ "๋ฉ์ง"API๋ฅผ ์ํด ๋จ๊ฒจ ๋๋ ๊ฒ์ด ์ข์ต๋๋ค.@nrc ์ด ์ง๋ฌธ์ ์ค์ํ ์ธก๋ฉด์ libproc_macro
๋ฅผ ์ฌ์ฉํ๋ฉด "์ ์ฐจ ์ ๋งคํฌ๋ก"์ ๋ํด ์ด์ฌํ ๋
ธ๋ ฅํ๊ณ ์์ต๋๋ค. ์ ์ด. ๋๋ ์ฌ๊ธฐ์ ๊ฐํ ์๊ฒฌ์ ๊ฐ์ง๊ณ ์์ง ์์ง๋ง, ์ฐ๋ฆฌ๊ฐ ์ฉ์ด์ ๊ณต๊ฐ์ ๊ณต๊ฐ์ ์ผ๋ก ํ๊ตฌํ๋์ง๋ ํ์คํ์ง ์์ต๋๋ค.
๋ช
ํํ๊ฒ ๋งํ๋ฉด, ์ค๋์ macro_rules
๊ฐ ๋จ์ํ "๋งคํฌ๋ก", ์ฆ "๋งคํฌ๋ก"๊ฐ ์๋ฏธํ๋ ๊ธฐ๋ณธ ๊ฐ์ด์ง๋ง "์ ์ฐจ ์ ๋งคํฌ๋ก"๋ฅผ ํ์ ํด์ผํ๋ค๊ณ ์๊ฐํ์ญ๋๊น? ๊ทธ๊ฒ์ ๋์๊ฒ ๊ฝค ํฉ๋ฆฌ์ ์ธ ๊ณํ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ธ๊ณ์์๋ libproc_macro
์ด libmacros
๋ณด๋ค ๋ซ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค.
์ฌ๊ธฐ์ ๋ด ์๊ฐ์ ๋ชจ๋ ๋งคํฌ๋ก๊ฐ "๋งคํฌ๋ก"์ด๋ฉฐ ๊ตฌํ์ ๋ฐ๋ผ ๊ตฌ๋ถํด์ผ ํ ๋ (์ฌ์ฉ๋ฒ์ ๋ชจ๋ ์ข ๋ฅ์ ๋ํด ์ ํํ ๋์ผํด์ผ ํจ) "ํ๋ก ์์ ๋งคํฌ๋ก"์ "์์ ์ ์ํ ๋งคํฌ๋ก"๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๋๋ค. "๊ตฌ๋ฌธ ํ์ฅ"๊ณผ "์ปดํ์ผ๋ฌ ํ๋ฌ๊ทธ์ธ"์ ์์ ํ ์ ๊ฑฐํ๊ณ ์ถ์ต๋๋ค (๊ทธ๋ฆฌ๊ณ ์ธ์ ๊ฐ๋ ํ์๋ฅผ ์ค์ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฌ์ฉ).
๊ทธ๋ฌ๋ ์, ์ ๋ "์ ์ฐจ ์ ๋งคํฌ๋ก"์ฉ์ด๋ฅผ ๊ฐ๋ ฅํ ๋ฐ๋ฅด๊ณ ์ถ์ต๋๋ค.
@nrc ๋์๊ฒ ์ข์ ์๋ฏธ๊ฐ ์์ต๋๋ค! "์์ ์ ์ํ ๋งคํฌ๋ก"๋ ๋ค์ ๋ค๋ฃจ๊ธฐ ์ด๋ ต์ง๋ง ๋งค์ฐ ์ฐ์์ ์ด๊ณ ์ง๊ด์ ์ธ ์ฉ์ด์ด๊ธฐ๋ํฉ๋๋ค. "์ ์ฐจ ์ ๋งคํฌ๋ก"์ ๋ํ ๋์ ํ ๊ฐ์ง ๊ฑฑ์ ์ "์ ์ฐจ"๊ฐ Rust์์ ์กด์ฌํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ข ๋ ์ง์ ์ ์ผ๋ก ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค. "ํจ์ ๋งคํฌ๋ก"๋ ์ณ์ง ์์ง๋ง ๋ด๊ฐ ์๋ฏธํ๋ ๋ฐ๋ฅผ ์ดํดํ ์ ์์ต๋๊น?
์, ์๋ฒฝํ์ง๋ ์์ง๋ง Rust ์ธ๋ถ์์ ์ ์๋ ค์ง / ์ฌ์ฉ ๋ ์ฉ์ด๋ผ๋ ์ ์ ๊ฐ์ํ ๋ ์ฐ๋ฆฌ ์์ ์ ์ฉ์ด๋ฅผ ๋ง๋๋ ๊ฒ๋ณด๋ค ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค. "ํ๋ก ๊ทธ๋ ๋งคํฑ ๋งคํฌ๋ก"๋ ๊ฐ๋ฅํ์ง๋ง "ํ๋ก ์์ "๋ฅผ ์ ํธํฉ๋๋ค.
"์ ์ฐจ ์ ๋งคํฌ๋ก"์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒ์ ๋ํ Perl์ ์ฉ์ด๋ "์์ค ํํฐ"์ด๋ฉฐ, ์ด๋ ํนํ AST์์ ํ ํฐ์ผ๋ก์ ์ ํ๊ณผ ํจ๊ป ๋งค์ฐ ์ ํฉํ ์ค๋ช ์ ๋๋ค.
์๋ง๋ '๊ตฌ๋ฌธ ๋ณํ๊ธฐ'๋๋ 'ํ๋ก ๊ทธ๋ ๋งคํฑ ๋งคํฌ๋ก'๊ฐ ์ด๋ฆ๋งํผ ์ ์๋ํ ๊น์? ๊ทธ๋ฌ๋ ์ ์ฐจ ์ ๋งคํฌ๋ก์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
"์ ์ฐจ ์ "์ ์ด๋ฏธ ์ฌ๋๋ค์ด ์ด๊ฒ์ ๋ถ๋ฅด๋ ๊ฒ์ด๊ณ , ํนํ "์๋ฅผ ๋ค์ด ๋งคํฌ๋ก"์๋ ๋์กฐ์ ์ผ๋ก ๊ทธ๊ฒ์ด ์๋ฏธํ๋ ๋ฐ๋ฅผ ๋ถ๋ช ํ ์ดํดํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๋ค๋ฅธ ์ด๋ฆ์ ์ฐพ๋ ๊ฒ์ ๋ํด ๊ฑฑ์ ํ์ง ์์ ๊ฒ์ ๋๋ค.
์ ๊ธฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ "์ ์ฐจ ์ ๋งคํฌ๋ก"(๋๋ "์ฌ์ฉ์ ์ง์ ๋งคํฌ๋ก")๋ผ๋ ์ฉ์ด๋ฅผ ์ข์ํฉ๋๋ค. ์ ๋ ํนํ _macro_๋ผ๋ ๋จ์ด๋ฅผ ์ฌ์ฉํ์ฌ "์ผ๋ฐ ๋งคํฌ๋ก"์ ๊ฐ์ ๋ฐฉ์์ผ๋ก (๊ฒฐ๊ตญ ...) ์ฌ์ฉํ ์ ์์์ ๋ถ๋ช ํํฉ๋๋ค. ์ด๋ฌํ ์ด์ ๋ก ์ ๋ "์์ค ํํฐ"๋ฅผ ์ข์ํ์ง ์์ต๋๋ค (๋ํ ํํฐ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ๊ฒ์ด ์๋๋ผ ๋ณํํ์ง ์์ ๊ฒ์ผ๋ก ์์ํ์ง๋ง ์ฉ์ด๊ฐ ๋ ๋ค์ ์ฌ์ฉ๋๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค).
libproc_macro
๋๋ libmacros
๊ด์ฐฎ์ต๋๋ค. ๋๋ ์ฝ๊ฒ ํผํ ์์์ ๋ ์์ ์ด๋ฆ์ _
๋ฅผ ๋ฃ๋ ๊ฒ์ ์ข์ํ์ง ์๊ธฐ ๋๋ฌธ์ ํ์๋ฅผ ์ ํธํฉ๋๋ค. =)
ํ ๊ฐ์ง ์ง๋ฌธ : ๋น์ ์ฐจ์ ๋งคํฌ๋ก์์ ์ฌ์ฉํ ์์๋ "์ง์ ๋ฃจํด"์ ๊ธฐ๋ ํ ์ ์ด ์์ต๋๊น? ๊ทธ๋ฐ ๊ณํ์ ์์ง ๋ชปํฉ๋๋ค.ํ์ง๋ง ๊ทธ๋ ๊ฒํ๋ค๋ฉด ๊ฐ์ ์์์ ๋ฃ์ด์ผํ๋ค๋ฉด libmacros
๊ฐ ๋ ๋์ ์ด๋ฆ์ด ๋ ๊ฒ์
๋๋ค. =)
(์๋ฅผ ๋ค์ด ์ด๋ ฌํ ํ์ฅ RFC์์ @dherman ์ ์๊ฒฌ ์ ๋ํด ์ฝ๊ฐ ์๊ฐํ๊ณ ์์ต๋๋ค.)
@nikomatsakis : ๊ด๋ จ์ด ์์ง๋ง ๋ฏธ๋ฌํ๊ฒ ๋ค๋ฅธ ์ง๋ฌธ์ https://github.com/rust-lang/rfcs/pull/1561#discussion_r60459479- ์ ์ฐจ ์ ๋งคํฌ๋ก์ ๊ตฌํ ํจ์๊ฐ ํธ์ถ ํ ์ ์๊ธฐ๋ฅผ ์ ํ ๊น์? ๋ค๋ฅธ ์ ์ฐจ ์ ๋งคํฌ๋ก์ ๊ตฌํ ๊ธฐ๋ฅ?
๋๋ ํ๋์ ์ปค์คํ ํ์๋ฌผ์ด ๋ค๋ฅธ ๊ฒ์ ํธ์ถํ๋๋ก ํ์ฉํ๊ณ ์ถ์ดํ๋ค๋ ๊ฒ์ ์ฝ๊ฒ ์ ์ ์์ผ๋ฉฐ, ๊ทธ๊ฒ์ ๋ณธ์ง์ ์ผ๋ก ๊ทธ๋ฌํ "์ง์ ๋ฃจํด"์ผ๋ก ์ฌ์ฉ๋ ์์๋ ์ ์ฐจ ์ ๋งคํฌ๋ก ์ ์ ์์ฒด๋ฅผ ๋ง๋ค ๊ฒ์ด๋ค.
ํ์ง๋ง ์, @dherman ์ gensym
์์ ๊ฐ ๊ฝค ๋งค๋ ฅ์ ์ด๋ผ๊ณ โโ์๊ฐํฉ๋๋ค. ๋ฌผ๋ก ์์ ์ง๋ฌธ์ ๋ํ ๋ต์ด "์"์ด๋ฉด gensym์ ๋งคํฌ๋ก (๋งคํฌ๋ก๋ณ๋ก ์ฌ์ฉํ ์ ์์)์ ์ง์ ํจ์ (์ ์ฐจ ์ ๋งคํฌ๋ก์์ ์ฌ์ฉํ ์ ์์)์
๋๋ค.
์ฒดํฌ๋ฆฌ์คํธ์ ๋ชจ๋ "ํ๋ฌผ ํตํฉ"์์๋ฅผ ์ ํํด์ผํ๋ํ๋ฌผ PR https://github.com/rust-lang/cargo/pull/3064 ๊ฐ ์์ต๋๋ค.
ํ๋ฌผ PR์ ๋ํ ์๊ฒฌ์ ๋จ๊ฒผ์ง ๋ง, ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ์ ํ์ _package_๊ฐ ์๋ ๋ค๋ฅธ ์ ํ์ _dependency_๋ฅผ ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฒซ์งธ, ๋๋ ์ด๊ฒ์ด ๋จ์ง ๋ฏธ์ ์ผ๋ก๋ ์ธ์ฒด ์ ์ผ๋ก ๋ ๋ซ๋ค๊ณ ์๊ฐํ์ง๋ง ๊ทธ๊ฒ์ ๋จ์ง ๋ด ์๊ฒฌ์ ๋๋ค. ํ์ง๋ง ๋ ๊ฐ์ง ๊ตฌ์ฒด์ ์ธ ์ด์ ๋ ์์ต๋๋ค.
์ด๊ฒ์ด ๋ณด์ฌ ์ฃผ๋ฏ์ด ๋์ผํ ์์๋ ์ ์ฐจ ์ ๋งคํฌ๋ก์ ๋ค๋ฅธ ์์์ ์ผ๋ฐ dep์ด๊ฑฐ๋ ๋ค๋ฅธ ์์์ macro dep ์ผ ์ ์์ต๋๋ค.
serde๋ ์๋ํฉ๋๊น?
์ https://github.com/serde-rs/serde/releases/tag/v0.8.6
(์ผ๋ถ ๊ฒฝ์ฐ # 36211 ์ปจํ ์ด๋ ์์ฑ ์ ์ธ)
@dtolnay ์ ๋ฐ์ดํธ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
์ด ๋งคํฌ๋ก์ ๋ํ ๋ฌธ์๊ฐ ์์ต๋๊น? ๋๋ ๊ทธ๊ฒ๋ค์ ์ฌ์ฉํ๋ ์ ์ผํ ์๊ฐ serde๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ง์ต๋๊น?
OKํ๋ฌผ์ด ์ฐฉ๋ฅํ์ต๋๋ค. ๊ด์ฐฎ์ง ๋ง ์์ ํ๋๊ธฐ ์ ์ https://github.com/rust-lang/rust/issues/35900#issuecomment -243976887์ ๋ค์ ๋ฐฉ๋ฌธํ๋ ๊ฒ์ด ์ข์ต๋๋ค. [๊ทธ ๊ฐ์น๊ฐ ๋ฌด์์ธ์ง, ๋๋ ์ด๊ฒ์ ์๋ RFC์์ ๊ฐ์ ธ ์ค๋ ค๊ณ ํ์ง๋ง ์์๋ค.]
"์์ ๋งคํฌ๋ก"์ "ํ๋ก ์์ ๋งคํฌ๋ก"๊ฐ ๊ฐ๊ฐ "์ ์ธ ๋งคํฌ๋ก"์ "๋ช
๋ น์ด ๋งคํฌ๋ก"๋ก ๋ ์ ๋ถ๋ฅ ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ ๋๋ฆฌ ์๋ ค์ง ์ ์ธ์ / ๋ช
๋ น ์ ๋ถ๋ฅ์ ์ ์ตํ ์ ์ฌ์ ์ ์ ๊ณตํฉ๋๋ค. ๋ช
๋ นํ์ ์ ์ฐจ์ ์์ ์งํฉ ๋๋ ๋์์ด๋ก ์ทจ๊ธ๋๋ฏ๋ก "์ ์ฐจ ์ ๋งคํฌ๋ก"์ฉ์ด์ ์ต์ํ ์ฌ๋๋ค์ด ์ ํ๋ฅผ ํ ์์์๋งํผ ์ถฉ๋ถํ ๊ฐ๊น์ ์ผํฉ๋๋ค. ๋ํ ๋
น ์์ฒด์์ ์ ์ฐจ / ๊ธฐ๋ฅ / ๋ฐฉ๋ฒ ๊ฐ๋
๊ณผ์ ํผ๋์ ํผํด์ผํฉ๋๋ค.
์ด ์ด๋ฆ ์ง์ ์ฒด๊ณ๋ macro_imp
์์์ ๋ชจ๋์ macro_rules
๋ณ๋ ฌ๋ก ์ ๊ณตํฉ๋๋ค. macro_rules
๋ ๊ฒฐ๊ตญ ๋ ์ผ๋ฐ์ ์ธ macro_dec
์์์ ๋ชจ๋์ด ๋ ์ ์์ต๋๋ค.
@nrc , "์ค์ ํ๋ฌ๊ทธ์ธ"์ ์ธ๊ธ ํ ๋ metacollect ๋ฐ clippy ๊ฐ์ ๊ฒ , rustw , Rust ์ธ์ด ์๋ฒ ๊ฐ์ ๊ฒ ๋๋ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ ๋ฒ์ฃผ๋ฅผ ํฌํจํฉ๋๊น?
๊ทธ๋งํ ๊ฐ์น๊ฐ์๋ ๊ฒ์ "์์ ๋ณ"์ด๋ฆ์ ์ฝ๊ฐ ์ซ์ดํฉ๋๋ค ( $foo
ํจํด์ ์ ๋ง์์ "์์ "๊ฐ ์๋๊ธฐ ๋๋ฌธ์
๋๋ค). ์ ์ธ์ ๋ ๋ช
๋ น ์ ์๋ฆฌ๊ฐ ๋์๊ฒ ๋ ์ข์ต๋๋ค.
์ด๊ฒ์ ๊ฐ์ง๊ณ ๋๋ฉด์ ํ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค. Rust๊ฐ ์ ๊ณตํ๋ ํ์๋ฌผ์ด ๋๋๋ก ์ปดํ์ผ๋ฌ๊ฐ ๋ฌด์ํ ์์๋ ์์ฑ์ ์ถ๊ฐํ๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ์ด ์ปจํ
์คํธ๋ ์ฌ์ฉ์ ์ง์ ํ์์ ํต๊ณผ ํ ๋ ์์ค๋ฉ๋๋ค. ์ฌ์ฉ์ ์ง์ ํ์์ผ๋ก ์ฃผ์ด์ง ์๋ณ ๊ธฐ๋ฅ์ด ์๋ํ์ง ์์ ๊ฒ์ผ๋ก ์์ํ์ง๋ง #[structural_match]
์์ฑ์ด ์ถ๊ฐ๋๋ ๋ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ณต์ ์คํฌ๋ฆฝํธ
( demo_plugin
๋ผ๋ ์์์ ์์)
#![feature(rustc_macro, rustc_macro_lib)]
extern crate rustc_macro;
use rustc_macro::TokenStream;
#[rustc_macro_derive(Foo)]
pub fn derive_foo(input: TokenStream) -> TokenStream {
input
}
(๋ค๋ฅธ ์์์์)
#![feature(rustc_macro)]
#[macro_use] extern crate demo_plugin;
#[derive(PartialEq, Eq, Foo)]
struct Bar {
a: i32,
b: i32,
}
#[derive(Eq)]
ํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ ๋๋ก ์๋ํฉ๋๋ค.
@sgrif ์ ์ ์ ๋ง๋ก ๋๋ฅผ ์๊ธฐ์์ผ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
์ฌ๊ธฐ์ ๋ช ๊ฐ์ง ์ผ์ด ์์ต๋๋ค.
#[derive(PartialEq, Eq)]
๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํ์ผ๋ฌ๋ PartialEq
ํ์์ด ์ค์ ๋ก ํด๋น ๊ณ์ฝ์ ์ดํํ๋ค๋ ๊ฒ์ ์ ์ ์ผ๋ก ์ดํดํ๊ธฐ ๋๋ฌธ์ #[structural_match]
์๋์ผ๋ก ์ถ๊ฐํฉ๋๋ค.#[rustc_copy_clone_marker]
๊ฐ ์ถ๊ฐ ๋ #[derive(Copy, Clone)]
์์๋ ์ ์ฌํ ์์ฑ์ด ๋ฐ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ ํ ์์๋ ๋ช ๊ฐ์ง ์๋ฃจ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
#[derive(Foo, Eq, PartialEq)]
๋๋ ์ด๋ฌํ ์์ฑ์ ๋ฐฉ์ถํ์ง ์๊ฑฐ๋ ๋ค๋ฅธ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ํ์ง๋ง #[derive(Copy, Foo, Clone)]
๋ ์๋ํด์ผํ๋ฏ๋ก (์ ์๋ฅผ ๋ณ๊ฒฝํ ์์๋ ์ฌ์ฉ์ ์ ์ ์ฝ๋๊ฐ ์ค๊ฐ์์ ์คํ ๋จ) ์ ๋ง ๊น๋ค ๋กญ์ต๋๋ค.
๋ด๊ฐ ์ ํธํ๋ ํ๋ ๋ฐฉ์นจ์ ์ฌ์ฉ์ ์ง์ ํ์์ ๊ฐ์งํ๋ฉด ์ด๋ฌํ ์์ฑ์ ๋ด ๋ณด๋ด์ง ์๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ๋ ์ฌ์ํ์ง ์์ ์ ์์ต๋๋ค. ์ง๊ธ์ "์ฌ์ฉ์ ์ง์ ์ฐ์ ๋ฐ ํ์ค ๋ง์ง๋ง"๊ท์น์ผ๋ก ์ถฉ๋ถํ์ง๋ง ์์ ํํ๊ธฐ ์ ์์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฉด์ฑ ์กฐํญ : ์ ๋ ์ปดํ์ผ๋ฌ์ ์ธ๋ถ๋ณด๊ธฐ ๋ง ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ทธ๋์ ์ ๊ฐ ๋ชจ๋ฅด๋ ๊ฒ์ด ๋ง์ด ์์ต๋๋ค. ^^
๊ทธ๋ฌ๋ ๋ด๊ฐ ์ดํดํ๋ ๋ฐ์ ๋ฐ๋ฅด๋ฉด ๋งคํฌ๋ก 1.1 ์ฌ์ฉ์ ์ ์ ํ์์ ํ์ฌ ์ ๊ทผ ๋ฐฉ์์ ์ผ์์ ์ธ ํด๊ฒฐ ๋ฐฉ๋ฒ๊ณผ ๋น์ทํฉ๋๋ค. ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ "์์ฃผ ์ ์"๋ก ๋ฒ์ญ ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฅ๊ธฐ์ ์ผ๋ก (= macros 2.0) ์ฐ๋ฆฌ๋ ๋ ์ด์ ๋ฌธ์์ด ํ์ฑ ์๋ณต์ํ์ง ์์ ๊ฒ์ด๋ฉฐ, ์ด๋ ํ์ฌ ์คํฌ ์ ๋ณด์ ์์ค๋ก ์ด์ด์ง๋๋ค. AST์ ์จ๊ฒจ์ง ์์ฑ์ด ๋งคํฌ๋ก 2.0 ์ธ๊ณ์์ ๊ทธ๋ ๊ฒ ๋์ ๊ฒ์ธ์ง ๊ถ๊ธํฉ๋๋ค. ์ปดํ์ผ๋ฌ์ ๋ํ ๋ ๋ง์ ๋ด๋ถ ์ง์์ ๊ฐ์ง ์ฌ๋์ด ๋งํ ์์์ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ์จ๊ฒจ์ง ์์ฑ์ด ๋ฏธ๋์ ์ธ๊ณ์์ ์ค์ ๋ก ์๋ฏธ๊ฐ ์๋ค๋ฉด, ์ ๋ ๊ด์ต ์ ์ผ๋ก ์ฌ์ฉ์ ์ ์ ํ์์ ์์ ๋ฐฐ์นํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์์ผํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ์ด์จ๋ ๋ชจ๋ ๊ฒ์ ์ด๋ฏธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ค.
@ colin-kiegel ์ฐ๋ฆฌ๊ฐ ์ง๊ธํ๊ณ ์๋ ์ผ์ด ๋ฏธ๋๋ฅผ ๋ณด์ฅํ๋ ๊ฒ์ด ์๋๋ผ๋ ์ ์์ ๋น์ ์ด ์ณ๋ค๊ณ ๋ฏฟ์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
#[derive(Eq, Foo, PartialEq)]
์ค๋์ Eq
๊ตฌํ์ ์ถ๊ฐ ํ ๋ค์ Foo
๋ํ ์ฌ์ฉ์ ์ง์ ์ฝ๋๋ฅผ ์คํ ํ ๋ค์ PartialEq
๊ตฌํ์ ์ถ๊ฐํฉ๋๋ค. ๊ตฌ์กฐ๋ Eq
์์ PartialEq
์ฌ์ด์์ _change_ ํ ์ ์์ผ๋ฏ๋ก #[structural_match]
์ ์ํด ์ถ๊ฐ ๋ Eq
๋ Foo
์คํ ํ ์ค์ ๋ก ์ฌ๋ฐ๋ฅด์ง ์์ ์ ์์ต๋๋ค.
๊ทธ๋ฐ ์๋ฏธ์์ ๋๋ ๊ทธ๋ค์ด ์ด๋ค ๊ฒฝ์ฐ์๋ ๋ฐ๋์ ๋ฏธ๋ ๋ณด์ฅ์ด ์๋๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค!
๋ด ๋๋์ ๊ตฌ์กฐ์ ๋ณํ์ ์์กดํ๋ ๊ด์ต ํ์๋ฌผ์ ์ผ๋ฐ์ ์ผ๋ก ์จ๊ฒจ์ง ์์ฑ๊ณผ๋ ๋ ๋ฆฝ์ ์ผ๋ก ์ ๊ตฌ์ฑ๋์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. v2.0 ์ฌ์ฉ์ ์ ์ ํ์์ด ํญ๋ชฉ์ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๊น? ์๋๋ฉด ์ฅ์์๋ง ์ ํ๋ฉ๋๊น?
์, #[derive]
์ ํฉ๋ฆฌ์ ๊ตฌํ์ด ์๋ ๊ตฌ์กฐ์ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ค๊ณ ์๊ฐํ์ง๋ง ๋ฅ๋ ฅ์ ํญ์ ๊ฑฐ๊ธฐ์์์ ๊ฒ์
๋๋ค (TokenStream-> TokenStream ์ธํฐํ์ด์ค์ ๋ด์ฌ).
๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์๋๋ก ์ถ๋ ฅ ํ ํฐ ์คํธ๋ฆผ์ ๊ตฌ์กฐ ์์ฒด๊ฐ ํฌํจ๋์ง ์๋๋ก ์๊ตฌํ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ ๋ ฅ ๊ตฌ์กฐ์ฒด TokenStream์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ์ ๋์ฌ์ ๋๊น? ํฐ ๋ฌธ์ ๋ ๋น๋๊ฐ ์๋ฃ๋ ํ ํ๋ฌ๊ทธ์ธ์ด ์ฌ์ฉํ๋ ์ธ์๋์ง ์๋ ์์ฑ์ ๋ฌด์ํ๋ ๊ฒ์ ๋๋ค. ์๋ง๋ ๊ฐ # [derive ()]๋ ๊ทธ๋ค์ด ์ดํดํ๋ ์์ฑ์ด ์์ํด์ผํ๋ ์ ๋์ฌ (์ : # [derive (Foo)]์ ์ ๋์ฌ Foo_๊ฐ ์์)๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ๊ฐ ์ฌ์ฉ์ ์ ์ ํ์์ ์ฒ๋ฆฌ ํ ํ ํด๋น ์์ฑ์ ์ ๊ฑฐํฉ๋๊น?
@mystor ์, ๊ทธ ์ ๊ทผ ๋ฐฉ์์ ๋ฌธ์ ๋ ์ธ์ ํ ์์๋ ์์ฑ์ด๋ฏ๋ก ์ ์ฒด ๊ตฌ์กฐ์ฒด๋ฅผ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํน์ ์ ๋์ฌ / ์ ๋ฏธ์ฌ / ๋ฑ๋ก ๋ฑ์ ์์กดํ๋ ๊ฒ๋ณด๋ค ๋ ์ ์ฐํฉ๋๋ค.
v2.0 ์ฌ์ฉ์ ์ ์ ํ์์ด ์ฌ์ฉ์ ์ ์ ์์ฑ์ _used_๋ก ํ์ ํ ์์๋ ๊ฒฝ์ฐ ๋๋จธ์ง ํญ๋ชฉ ํ ํฐ ์คํธ๋ฆผ์ ๋ํ _read-only_ ์ก์ธ์ค๋ก ์ ํ ๋ ์ ์์ต๋๋ค. ์ด๋ ๊ฒํ๋ฉด ์ฌ์ฉ์ ์ง์ ํ์์ ๋ ๋์ ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ์ด IMO๋ฅผ ๋ณด์ฅ ํ ์ ์์ต๋๋ค. v2.0 ๋งคํฌ๋ก๊ฐ ํญ๋ชฉ์ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํด์ผํ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ API๋ฅผ ์ฌ์ฉํด์ผํ์ง๋ง ์ฌ์ฉ์ ์ง์ ํ์์ด ์๋๋๋ค. ์ด๋ ๊ฒํ๋ฉด #[structural_mach]
๋ฌธ์ ์ (์ฌ์ฉ์ ์ ์) ํ์ ์์๊ฐ ๋งคํฌ๋ก 1.1์์๋ง ๋ํ๋ฉ๋๋ค. ๊ทธ๊ฒ ๋ง์ด ๋๊ฒ ์ต๋๊น?
๋ ๋ค๋ฅธ ๋ฌธ์ . ๊ตฌ์กฐ์ฒด์ ๋ ๊ฐ์ ๋ค๋ฅธ ์ฌ์ฉ์ ์ง์ ํ์์ด ์๊ณ ๋ ๋ฒ์งธ๊ฐ ํจ๋ ์ํ ์ธ ๊ฒฝ์ฐ ์ค๋ฅ ๋ฒ์๋ ๋นํฉํ ๊ฒ์ด ์๋๋ผ ์ฒซ ๋ฒ์งธ ๊ฒ์ ๊ฐ๋ฆฌ ํต๋๋ค.
๋ณต์ ์คํฌ๋ฆฝํธ
demo_plugin
๋ผ๋ ์์
#![feature(rustc_macro, rustc_macro_lib)]
extern crate rustc_macro;
use rustc_macro::TokenStream;
#[rustc_macro_derive(Foo)]
pub fn derive_foo(input: TokenStream) -> TokenStream {
input
}
#[rustc_macro_derive(Bar)]
pub fn derive_bar(input: TokenStream) -> TokenStream {
panic!("lolnope");
}
๋ค๋ฅธ ์์์
#![feature(rustc_macro)]
#[macro_use] extern crate demo_plugin;
#[derive(Foo, Bar)]
struct Baz {
a: i32,
b: i32,
}
Bar
๋นํฉํ๋๋ผ๋ ์ค๋ฅ๊ฐ Foo
๊ฐ์กฐ ํ์๋ฉ๋๋ค.
@sgrif ๋ณด๊ณ ์์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ์ด ๋ฌธ์ ์ ๋ํ ์ค๋ช ์ ์ ๋ฐ์ดํธํ์ผ๋ฉฐ ๋งคํฌ๋ก 1.1๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ๋ฏธํด๊ฒฐ ๋ฌธ์ ๋ ์ถ์ ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
ํ , #[structural_eq]
์ ์ฌ์ฉ์ ์ ์ ํ์์ ์ํธ ์์ฉ์ ์ด์ ์ ์๊ฐํ์ง ๋ชปํ๋ ๊ฒ์
๋๋ค. ์คํ๋ ค ๋๋ฅผ ๊ดด๋กญํ๋ค!
์ด ํ ํฐ ์คํธ๋ฆผ์ '์ถ๊ฐ'ํ ์คํธ ๋ฐฉ๋ฒ์ ๊ฐ์ง ๊ฒ์ ... ๊ทธ๊ฒ์ ์คํฌ ์ ๋ณด๋ฅผ ๋ณด์กด ๊ฒ์์ด์ด ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ํ๋ฃจ์ ๋์ ๋ ๋์ ์ธํฐํ์ด์ค๊ฐ ๋ ์ ์์์ ๋์๊ฒ ๋ณด์ธ๋ค?
๋ณด๋ค ์ผ๋ฐ์ ์ธ ์ธํฐํ์ด์ค์ ํ ๊ฐ์ง ์ฅ์ ์ ํจํค์ง๊ฐ ํ๋์ ์์ฑ์ ๊ฐ์ง ์ ์๋๋กํ์ฌ ๋งคํฌ๋ก๊ฐ ์คํ๋ ๋ ์ ๊ฑฐ ๋ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ฌ์ฉ์ ์ง์ ํ์ ๋งคํฌ๋ก๊ฐ ์๋ณธ ํญ๋ชฉ์ ๋ณ๊ฒฝํ๋๋ก ํ์ฉํ๋ ์ ์ผํ ์ค์ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค.
์ธํฐํ์ด์ค ์ง๋ฌธ์ ์ฌ์ฉ์ ์ ์ ํ์์ด '๋ค๋ฅธ ๋งคํฌ๋ก'๊ฐ๋๊ธฐ๋ฅผ ์ํ๋์ง ์ฌ๋ถ์ ๋ฌ๋ ค ์๋ค๊ณ ์๊ฐํฉ๋๋ค.์ด ๊ฒฝ์ฐ ๋ค๋ฅธ ์ ์ฐจ ์ ๋งคํฌ๋ก (์๋ ํญ๋ชฉ์ ์์ ํ๋ ค๋ ๊ฒฝ์ฐ)์ ๋์ผํ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ๋ ๊ฒ์ด ์ค์ํด ๋ณด์ ๋๋ค. ๋๋ ํน์ ์ธํฐํ์ด์ค๊ฐ์๋ ์์ฒด ์ฌ์ผํ๋์ง ์ฌ๋ถ.์ด ๊ฒฝ์ฐ ๋ ์ ํ์ ์ธ (์ถ๊ฐ) ์ธํฐํ์ด์ค๊ฐ ์๋ฏธ๊ฐ ์์ต๋๋ค.
๊ตฌ๋ฌธ ํ์ฅ์ ์ค๋ซ๋์ ์์ ์์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๊ตฌ๋ถ ํด์๊ณ , ๊ด๋ จ๋ ๋ชจ๋ ์ฌ๋๋ค์ด ๊ทธ ๊ตฌ๋ถ์ ์ ๋ง ์ซ์ดํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์ ์ง์ ํ์์ด ์ฝ๊ฐ ํน๋ณํ๊ฒ๋๋ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ๊ฐ๋ ๊ฒ์ ์ฝ๊ฐ ๊บผ๋ฆฝ๋๋ค (์ค๋ช ๋ ๋์์ ๋งค์ฐ ํน๋ณํ ์ฌ์ฉ์ ์ง์ ํ์, ์๋ง๋ ์ ์ธ ํ์ ์ผ ์๋ ์์).
@nrc ์ , ์ฌ์ ํ tokenstream-> tokenstream ์ผ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ์ฒ์๋ถํฐ ์์ํ๋ new
๋ฉ์๋๋ฅผ ๋
ธ์ถํ์ง ์์ต๋๋ค.
์ฌ์ฉ์ ์ ์ ํ์์ด ์ค์ ๋ก ์๋ฏธ๊ฐ ์๋๋ก ํ๋์ ์ฌ์ฉ์ ์ ์ ์์ฑ์ ๊ฐ์ง ์ ์์ด์ผํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ "์ถ๊ฐ"์คํ์ผ๋ก์ด ์์
์ ์ํ ํ ์์๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ ๋ฌผ๋ก ๋
ผ์๋์ด์ผํฉ๋๋ค. ์ ๋ ํ์คํ ์ถ๊ฐ ์คํ์ผ์ ์ ํธํฉ๋๋ค. ์๋ํ๋ฉด ํ์ ๋งคํฌ๋ก๊ฐ ํญ๋ชฉ์ ๋ณ๊ฒฝํ์ง ์๊ณ ๊ตฌ์ฑ ํ ์์๋ ์ธ๊ณ๋ฅผ ์ ํธํ๊ธฐ ๋๋ฌธ์ด๋ฉฐ #[structural_eq]
๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์ด๊ฒ์ ์์ IMO์ ์ ์ ํ ์์
๋๋ค.
์ฌ๋๋ค์ด ๊ทธ ์ด๋ช ์ ์ข์ํ์ง ์์๋ค๋ฉด ์ ๊ทธ๋ฐ์ง ๋ฌผ์ด๋ณด๊ณ ์ถ์ต๋๋ค. ์๋ํ๋ฉด ๋ถ๋ช ํ ์ด์ ์์ด ๊ตฌ๋ถ์ ํ ์ถฉ๋ถํ ์ด์ ๊ฐ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค.
(์ ๊ฐ ์ ์ํ ๊ฒ์ ์ผ์์ ์ธ ํดํน ์ผ ๋ฟ์ด๋ฉฐ ์ฅ๊ธฐ์ ์ธ ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ ๋ฌธ์ ๋ฅผ ์ค์ ๋ก ํด๊ฒฐํ์ง๋ ์์ต๋๋ค.)
๋ด ๋ค์ํ โโ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ํ์ฌ ๋งค๊ฐ ๋ณ์์์ ๊ตฌ์กฐ์ฒด Bar
๋ฅผ ์์ฑํ๋ foo!(Bar, parameters...)
์ ๊ฐ์ ๋งคํฌ๋ก๊ฐ ์์ต๋๋ค.
IRC์ ๋ํ ํ ๋ก ์ค์ #[derive(Foo)] #[params] struct Bar;
๋์ foo!
๋ฅผ ๊ตฌ์กฐ์ฒด์ ๋ณธ๋ฌธ์ ์์ฑํ๋ #[derive(Foo)]
๋ฐ๊พธ๋ ์์ด๋์ด๊ฐ์์์ต๋๋ค.
๋ถ๋ช ํ ๊ฐ๋ ฅํ ์ฃผ์ฅ์ ์๋์ง๋ง ๊ตฌ์กฐ์ฒด๊ฐ ๊ตฌ์ถ๋๊ณ ์๋ค๋ ๊ฒ์ด ์ฌ์ฉ์์๊ฒ ๋ ๋ถ๋ช ํ๊ธฐ ๋๋ฌธ์ ๊ทธ ์์ด๋์ด๊ฐ ์ ๋ง ๋ง์์ ๋ค์์ต๋๋ค.
๋์ ์์ฑ ๋ impl์ #[structural_match]
๋ฅผ ๋ฐฐ์น ํ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
(์ ๋ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํจ)
Serde์ Diesel์ ๋ ๋ค ํ๋์์ ์ฌ์ฉ์ ์ ์ ์์ฑ์ ๋ง์ด ์ฌ์ฉํ๋ฏ๋ก ๋์ฒด๋ฅผ ํ์ฉํ๊ธฐ ์ํด ์ฌ์ฉ์ ์ ์ ํ์์ด ํ์คํ ํ์ํฉ๋๋ค.
๊ทธ๋์ ์ค์ ๋ก ์ ๋ #[structural_match]
๋ฌธ์ ์ ๋ํด ๋๋ฐ๋ก ์๊ฐํ์ง ์์ ์๋ ์์ต๋๋ค. ๊ฒฐ๊ตญ ์ฌ์ฉ์ ์ ์ ํ์์ ๋ฌด์์ ํ ์ ์์ต๋๊น?
#[structural_match]
์์ฑ์ ์๋ชป ์ฝ์
ํ๋ฉด ์์ ์ฑ ๊ฒ์ฌ์ ์คํจํฉ๋๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด ๊ทธ๊ฒ์ ๋ฒ๊ทธ ๊ทธ ์์ฒด๋ก ๋ณด์
๋๋ค! (ํ์ง๋ง์ด ์ฝ๋๊ฐ ์๋ํ๋ ๋ณต์กํ๊ณ ์๋ฑํ ๋ฐฉ์์ ๊ฐ์ํ๋ฉด ๋๋์ง ์์ต๋๋ค.)์์ ๋๊ธ์ ๋ง์ด ์ฐ๊ณ ํฐ ์๋ฆฌ๋ก ์๊ฐํด์ ๋ฏธ์ํ์ง๋ง ๋ ํ๋์ ์ฐ๋ ค๊ฐ ์์ต๋๋ค. ์ฌ์ฉ์ ์ ์ ํ์์ด #[structural_match]
์ฃผ์์ "์์กฐ"ํ ์๋ ์์ง๋ง ( "๋งค์ง ์คํฌ"์์ด ๋๋ ์ ์๊ธฐ ๋๋ฌธ์), ์๋ง๋ ๊ธฐ์กด ์ฃผ์์ ๋ฒ์๋ฅผ ๋ง์น๊ฒ ๋ ๊ฒ์
๋๋ค. ํ์๋ฌผ์ด ์ฌ๋ฐ๋ฅธ ์์๋ก ์ ์ฉ๋๋ ๊ฒ์ ์ํ๊น์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก @ colin-kiegel์ด ๋งํ ๋น ๊ตฌ์ฑ ์ฑ์ ์ธ์คํด์ค์ด์ง๋ง ๋นํ ์ค์ ๊ตฌ์กฐ์ฒด๋ฅผ ์์ ํ๋ ค๋ ์๋๋ ์์ต๋๋ค.
(์ฆ, ์์ ์ ์ธ ๋ฌผ๊ฑด์ ์ฌ์ฉํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ํ๋จํ๊ธฐ ์ํด ์คํฌ์ ์์กดํ๊ธฐ ๋๋ฌธ์ ์คํฌ ์ ๋ณด๋ฅผ ์์ผ๋ฉด ๋ช ๊ฐ์ง ๊น๋ค๋ก์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.)
ํธ์ง : ์ข์, ๋ค์ ์ฝ์ผ๋ฉด @sgrif๊ฐ ์ด๋ฏธ๋ณด๊ณ ํ ๊ฒ์ ๋ค์ ์ฐพ์๋ค๋ ๊ฒ์
๋ํ ๋ถ์์ ํ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ์์ ์ ์ธ ์ฝ๋์ ๋
ธ์ถํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ค์ ์ด์ฒด์ ์
๋๋ค. ์ด์์ ์ผ๋ก ์์ ์ ์ธ ์ฝ๋๋ #[structural_match]
์ฃผ์์ด ์กด์ฌํ๋ค๋ ์ฌ์ค์กฐ์ฐจ ์์ง ๋ชปํฉ๋๋ค.
@nikomatsakis ๊ธ์, ์ด๋ค ์ ์ผ๋ก๋ ๋งคํฌ๋ก๊ฐ ์ฌ์ฉ์ ์ ์ ํ์์ธ์ง ๋๋ ๋ค๋ฅธ ์ข ๋ฅ์ธ์ง์ ๋ฐ๋ผ ๋ค๋ฅธ ์ ์ฝ ์กฐ๊ฑด์ ์ ์ฉํด์ผํฉ๋๋ค. ์ด๋ ํจ์์ ์๊ทธ๋์ฒ์ ๊ด๊ณ์์ด ๋ณ๋์ ์ฒ๋ฆฌ (๋ฐ ๋ค๋ฅธ ์๋ฏธ ์ฒด๊ณ)๋ฅผ ์๋ฏธํฉ๋๋ค.
@ colin-kiegel
์ ๋ ํ์คํ ์ถ๊ฐ ์คํ์ผ์ ์ ํธํฉ๋๋ค. ์๋ํ๋ฉด ํ์ ๋งคํฌ๋ก๊ฐ ํญ๋ชฉ์ ๋ณ๊ฒฝํ์ง ์๊ณ ๊ตฌ์ฑ ํ ์์๋ ์ธ๊ณ๋ฅผ ์ ํธํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ํ # [structural_eq] ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์ด๊ฒ์ ์์ IMO์ ์ ์ ํ ์์ ๋๋ค.
๋ฌผ๋ก ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ์ ์ฉ์ด๋ ๋ค๋ฅด์ง๋ง ๋ณ๊ฒฝ ๋งคํฌ๋ก๋ฅผ ๊ตฌ์ฑ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ปดํ์ผ๋ฌ ๋๋ ๊ด๋ก์ ์ํด ์ํ๋๋ ํ์ ์์ ์ ๋ํ ์ฌ์ ๋ฐ ์ฌํ ์กฐ๊ฑด ์ธํธ๊ฐ ๋ถ๋ช ํ ์์ด์ผํฉ๋๋ค. ๋น ๋์ฐ๋ณ์ด๋ ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ์ ํํ ์์๋ ๋ถ๋ณ์ ์คํํธ๋ผ์์ ๊ทน๋จ์ ์ธ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฉฐ ์ด๋ฏธ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ด ๋ถ๋๋ฝ๊ฒ ๋ ์์๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ ผ์ํ๊ณ ์์์ ์ฃผ๋ชฉํ์ญ์์ค (์ : ์ฌ์ฉ ๋ ์์ฑ ํ์). ์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ๊ฐ์ฅ ๊ฐ๋จํ ์กฐ๊ฑด์ ์ ํธํ๊ณ ์ปดํ์ผ๋ฌ์ ์ํด ์ ์ฉ๋๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ํน๋ณํ custom derive๊ฐ ์ด๋ป๊ฒ ์ทจ๊ธ๋์ด์ผํ๋์ง์ ๋ํ ์ง๋ฌธ์ ๋ค์ ํฌํจ๋ฉ๋๋ค.
์ฌ๋๋ค์ด ๊ทธ ์ด๋ช ์ ์ข์ํ์ง ์์๋ค๋ฉด ์ ๊ทธ๋ฐ์ง ๋ฌผ์ด๋ณด๊ณ ์ถ์ต๋๋ค. ์๋ํ๋ฉด ๋ถ๋ช ํ ์ด์ ์์ด ๊ตฌ๋ถ์ ํ ์ถฉ๋ถํ ์ด์ ๊ฐ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋๋ ๊ทธ ๋น์ ๊ฐํ ๋๊ธฐ๊ฐ ์์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ตฌํํ๊ธฐ ์ฌ์ ๊ณ '์ข์ ์๊ฐ ๊ฐ์๋ค'๊ณ ์๊ฐํฉ๋๋ค. ๊ตฌํ์ ๋ ๋ณต์กํ๊ฒ ๋ง๋ค๊ณ ์ผ๋ฐ์ ์ผ๋ก ๊ด๋ จ์ฑ์ด์๋ ๋งคํฌ๋ก ์์ฑ์์๊ฒ ๊ตฌ๋ณ์ ์ถ๊ฐํ๊ณ ์์ ๋๋ ์ฅ์ ์ฌ๋ถ๋ฅผ ์ ํํด์ผํ๋ฏ๋ก ๋งคํฌ๋ก์ ์ ์ฐ์ฑ์ด ๋จ์ด์ก๊ธฐ ๋๋ฌธ์ ์ซ์ดํ์ต๋๋ค.
์ฌ์ฉ์ ์ง์ ํ์์ ์ฅ๊ธฐ์ ์ธ ๋์์ธ์ ๊ณ ๋ คํ๊ณ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ๊ฐ๊ณ ์๋์ง ํ์ธํ๊ณ ์ถ์ต๋๋ค. 1.1 ์๋ฃจ์ ์ ์ ์ฝ๊ณผ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌํ๋ ค๋ ์๊ตฌ๊ฐ ์ด๊ณณ์ ๋ฌผ์ ์งํํ์ผ๋ก ๋ง๋ค๊ณ ์ฐ๋ฆฌ๋ ๋ ํฐ ๋น์ ์ ๋ณด์ง ๋ชปํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ ์ด๋ค ์ ์ผ๋ก๋ ์ฌ์ฉ์ ์ ์ ์์ฑ์ ์ง์ํ๋ ๊ฒ์ด ์ด๋ ค์ด ์๊ตฌ ์ฌํญ ์ธ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค๋ ์ ์์ @jimmycuadra ์ ๋์ ํฉ๋๋ค. @nikomatsakis ๋ ์ณ์ง ๋ง #[derive(PartialEq, Eq)]
์ ํ์ฌ ์ฒ๋ฆฌ๊ฐ ๋ถ์ฐจ์ ์ด๋ฉฐ ์์ ํํด์๋ ์๋ฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก, @mystor ๋ ์ฌ์ฉ์ ์ง์ ํ์ ๋ชจ๋๊ฐ์ด ๋ง๋ฒ ์์ฑ์ ๋ํด ์์ง ๋งค์ฐ ์ข์ ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์์ผ๋ก ๋ ๋ง์ ๊ฒ์ ์ถ๊ฐํ๊ณ ์ถ์ ๊ฒ์ด๋ฉฐ, ๋งคํฌ๋ก 1.1์ด ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ ๊ฒํ๋ ๊ฒ์ ๋ง๋ ๊ฒ์ ์ํ์ง ์์ต๋๋ค.
๋ํ ์ปค์คํ
ํ์์ ์ฅ๊ธฐ์ ์ธ ๋์์ธ์ ๋ํ @nrc ์ ๊ฐ์ ์ ๋ฐ์ํ์ฌ,์ด ๋ง์ ๋ถ๋ถ์ด #[derive]
์ค์ ๋ก ์๋ํ๋ ๋ฐฉ์์ผ๋ก ๊ท๊ฒฐ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์์์ ์์ฑ์ ์ง์ํ ๋ @nrc ๋ ์์ ์๋ง ์๊ณ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ์๋ ๊ฒ์ ๋ํด ์ข์ ์ ์ด ์๋ค๊ณ ์๊ฐํ์ง๋ง #[derive]
๋ ์ฌ์ฉ์ ์ ์ ํ์์ด ์ ์์ฑ์ ์ ์ํ์ง ์๊ณ ๋์
ํ์ฌ ๊ตฌํ์๋ #[derive]
๋ชจ๋์ ์๊ฒฉํ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ ํ์ฅ์ด ์์ต๋๋ค. ๋ชจ๋ ๋ด๋ถ ํ์ ๋ชจ๋๋ ๋ฃจํ์์ ํ์ฅ๋๋ฉฐ ์ฌ์ฉ์ ์ง์ ํ์ ๋ชจ๋์ ๋๋ฌ ํ ๋๋ง๋ค ๋ค์ ์ง๋ ฌํํ๊ณ ํ์ฅ ํ ๋ค์ 1 ๋จ๊ณ๋ก ๋์๊ฐ๋๋ค. ์ด๋ ์ฐจ๋ก๋ก ์ปดํ์ผ๋ฌ๊ฐ #[derive]
์์ฑ์ ํ๋์ ๋ํด _ ์ฌ๋ฌ ๋ฒ ์คํํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์ ํ ์ ์ _. ๊ทธ๊ฒ์ ํธ์ด ๋ง์ ๊ฒ์ผ๋ก ์ด์ด์ง๋๋ค.
๋ด๊ฐ ๊ฐ์ง ์์๋ ํ ๊ฐ์ง ์ ์์ #[derive]
์ ํ์ฅ ์์๋ฅผ ์กฐ์ ํ๋ ๊ฒ์
๋๋ค.
#[derive(Clone, Foo)]
๊ฐ์๋ ๊ฒฝ์ฐ ๋จผ์ ๊ตฌ์กฐ์ฒด์ #[derive(Clone)]
์ฃผ์์ด์๋ Foo
ํ์ํฉ๋๋ค. #[derive]
์ง์๋๋ฉด ์ฌ์ฉ์ ์ ์ ๋ด์ฅ ํน์ฑ Clone
์ ํ์ํฉ๋๋ค.#[derive_Bar]
์์ฑ์ผ๋ก ํ์ฅ๋ฉ๋๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ธ์ ๊ฐ ์ ๊ฑฐํด์ผํ๋ ํ์ ํธํ์ฑ ํดํน ์ผ ๋ฟ์ด๋ฉฐ ์์ฑ์ ํ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์
๋๋ค.#[derive]
์์ฑ์ ํ์ฅํฉ๋๋ค.์ด๊ฒ์ ๋น์ ์ด ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ,ํ์ง๋ง ๋ค์๋ ๊ฒ์ ๊ธฐ์ต ํ์ฅ์ ์งํํ์ง ์์ ๊ฒ์ ๋๋ผ์ด ํจ๊ณผ๊ฐ #[derive]
. ์ด๊ฒ์ ์ปดํ์ผ๋ฌ์๊ฒ ๊ตฌ์กฐ์ฒด ์ ์์ ๋ํ ์ต๋ํ์ ์ง์์ ์ ๊ณตํ๊ณ ๋ด์ฅ ํน์ฑ์ ํ์ฅ ํ ๋ ์ ํ์ ๊ตฌ์กฐ๊ฐ ์ ๋ ๋ณ๊ฒฝ๋์ง ์๋๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
์ด๋ป๊ฒ ๋ค๋ฆฌ๋์? ์ฌ๊ธฐ์์ ๋ชจ๋ ์ ์ฝ์ด ํด๊ฒฐ๋์๋ค๊ณ ์๊ฐํฉ๋๊น?
@nikomatsakis impl
์ ์์ฑ์ ๋ฐฐ์นํ๋ ์ ๋ต์ด ์๋ ํ ์ง ํ์ ํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ์ฉ์ ์ง์ ํ์ ๋ชจ๋๊ฐ ์ด๋ก ์ ๊ตฌ์กฐ์ ๋ ์ด์์, ์ฌ์ง์ด ํ๋ ์ ํ์ ๋ณ๊ฒฝํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด๊ฒ์ ์ฒ์ ํ์ฅ๋์์ ๋ ์ปดํ์ผ๋ฌ์ ๊ฐ์ ์ ์๋ฐํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
ํ์๋ฌผ์ด ์ฒ๋ฆฌ๋๋ ์์๊ฐ Rust ์ฐธ์กฐ ๋๋ ๊ธฐํ๋ฅผ ํตํด ๊ณต์์ ์ผ๋ก ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ ์ธ ๋ ์ ์ด ์์ต๋๊น? ์ผ๋ฐ์ ์ผ๋ก ์์ฑ์ ์์๊ฐ ์ค์ํฉ๋๊น? ๊ทธ๋ ๊ฒ ๊ตฌํ ๋ ๊ฒ์ ์ฐ์ฐํ ๊ฒ์ฒ๋ผ ๋ค๋ฆฌ๋ฉฐ ๋งคํฌ๋ก ์์ฑ์๋ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ ์์์ ์์กดํด์๋ ์๋ฉ๋๋ค. ์ฌ์ฉ์ ์ง์ ์ฒ๋ฆฌ์ ๋ํ Alex์ ์ ์์ ์ปดํ์ผ๋ฌ์ ์ํด ์ถ๊ฐ ๋ ๋ง๋ฒ ์์ฑ์ ๊ฒฐ์ฝ ๋ณด์ง ๋ชปํ๋๋ก ๋จผ์ ํ์๋ฉ๋๋ค.
์ปค์คํ
ํ์์ด ๊ตฌ์กฐ์ฒด์ ๋ ์ด์์์ ๋ณ๊ฒฝํ ์ ์๋ค๋ ์๊ฐ์ด ๋ง์์ ๋ค์ง ์๋๋ค๋ ์ ์ ๋ง๋ถ์ด๊ณ ์ถ์ต๋๋ค. ๋๋ ์ด๊ฒ์ ์์ ์ ๋ฏผ๊ฐํ ๊ฒ์ ์ฌ์ฉํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด rust-gc
์ฌ์ฉํ๋ #[derive(Trace)]
๊ตฌํ์ ๊ณ ๋ คํ์ญ์์ค.
#[derive(Trace)]
struct Foo {
a: Gc<i32>,
}
๋ค์์ผ๋ก ํ์ฅ :
struct Foo {
a: Gc<i32>,
}
unsafe impl Trace { // NOTE: Strawman impl
unsafe fn trace(&self) { Trace::trace(&self.a) }
}
๊ทธ๋ฌ๋ ๊ตฌ์กฐ์ฒด์ ํ๋ ๋ณ๊ฒฝ์ ํ์ฉํ๋ฉด Evil
์ฌ์ฉ์ ์ง์ ํ์์ ์ ์ ํ ์ ์์ต๋๋ค.
#[derive(Evil)]
struct Foo {
a: Gc<i32>,
}
๋ค์์ผ๋ก ํ์ฅ :
struct Foo {
a: Gc<i32>,
b: Gc<i32>,
}
๊ทธ๊ฒ๋ค์ ๊ฒฐํฉํ๋ฉด :
#[derive(Trace, Evil)]
struct Foo {
a: Gc<i32>,
}
๋ค์์ผ๋ก ํ์ฅ :
struct Foo {
a: Gc<i32>,
b: Gc<i32>,
}
unsafe impl Trace {
unsafe fn trace(&self) { Trace::trace(&self.a) }
}
Trace
์ ๋ถ์ ์ ํ ๊ตฌํ์
๋๋ค. rust-gc
์ ํจ๊ป ์ฌ์ฉํ๋ฉด b
๊ฐ ๋๊ธ ๋ง ์ฐธ์กฐ๊ฐ ๋ ์ ์์ต๋๋ค. ์ด๋ ๋์ฐํ๊ฒ ์์ ํ์ง ์๊ณ ๊ฑด์ ํ์ง ์์ต๋๋ค. ์ด๊ฒ์ Trace
๊ฐ ๋ ์ด์ ์ ํ์์ #[derive]
์๊ฒ ์์ ํ ๊ฒ์ด ์๋๋ผ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ๋งค์ฐ ๋ถํํ ์ผ์
๋๋ค.
๋๋ ๊ฐ์ธ์ ์ผ๋ก ์ ํ๋ํ๋ #[derive]
์ด ๊ตฌ์กฐ์ ๋ ์ด์์ / ๊ตฌ์ฑ์ ์์ ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ฉฐ, ๋ง์ฝ ๊ทธ๋ ๋ค๋ฉด ๋น์ ์ ์ด์ด ์ข์ง ์์ต๋๋ค. ์ฌ์ฉ์ ์ ์ ํ์์ด ์์ฑ์ ์ญ์ ํ๋ ๊ธฐ๋ฅ์ ์ค์ํ๋ฉฐ์ด๋ฅผ ํฌ๊ธฐํ๋ ๊ฒ์ ์์์ด ์๋๋๋ค. ์ถ๊ฐ์ ์ผ๋ก, ์ด๋ค ํํ์ ํ์ดํธ๋ฆฌ์คํธ๋ฅผ ํฌํจํ๊ฑฐ๋ ์ค๋๋ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ๋จ์ํ ์ธํฐํ์ด์ค์ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ ๋ค๋ฅธ ๊ตฌํ๋ค๋ ์์ต๋๋ค.
๋ค์ ๋งํด, #[derive]
๊ตฌ์กฐ๋ฅผ ์์ ํ์ง ์๋ "์์์ฑ"์ด ๋น์ฉ์ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
ํ๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ์ง ์๊ณ ์์ฑ์ ์ญ์ ํ ์์๋ ๋ฐฉ๋ฒ์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค (์ : ๋ค์ ๊ตฌ๋ฌธ ๋ถ์ ๋ ๊ตฌ์กฐ์ฒด์์ ํ๋๊ฐ ์๋ ๊ตฌ์กฐ์ฒด์ ๋์ผํ ์ง ํ์ธํ๊ณ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ค๋ฅ ๋ฐ์) t, ๊ทธ๋ฌ๋ ๋ค๋ฅธ ๊ฒ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ถํํ์ง ์์).
derive๊ฐ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋๋ก ํ์ฉํ๋ ๊ฒ์ ๋ํด ๋์ ๋๋์ด ์์ต๋๋ค. @mystor ์ ์๋ ๋ด๊ฐ ๋์ ์์ค์์ ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ ..์ ๋ํด ์ด์ผ๊ธฐ ํ ๋ ์ผ๋์
๊ฐ๋ฅํ ํ ์ฌ๋๋ค์ด ์ด๊ฒ์ ์ ์ฉ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ก ์ธํด ์๋น์๋ ์ฌ์ฉ์ ์ง์ ํ์ ๊ตฌํ ๋ฐ ์คํ ์์์ ๋ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ถ๋ก ํ๊ฒ๋ฉ๋๋ค.
๋๋ ์ํธ ์์กด์ฑ์์ด '์ด๋ด,์ด๊ฒ ๋ญ์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋ค๋ฅธ ํ๋๋ ์ดํดํ๋ค'๋ผ๊ณ ๋งํ ์ ์์ผ๋ฉด ์ข๊ฒ ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ทธ๊ฒ์ ๋ฐ๊ฐ๋ฝ์ ํต์ฆ์ด ๋ ๊ฒ์ด๊ณ ๋๋ ๊ทธ๊ฒ์ด ์ผ์ด๋ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค.
์ ์ฐจ ์ ๋งคํฌ๋ก๊ฐ ์ ์์ ์ธ ์์ ์ ์ํํ๋ ๊ฒ์ ์ค์ ๋ก ์ ์์ ์ธ ์์ ์ ์ํํ๋ ํฌ๋ ์ดํธ์ ๋ค๋ฅธ ์ ์ ๋๊น? ๋ชจ๋ ์์์๋ ์๋๋ ์์ ์ ์ํํ๋ ์์ ํ์ง ์์ ์ฝ๋๊ฐ์์ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ๋ ์ปค๋ฎค๋ํฐ ํํ, ์์ค ์ง์ ๊ฒ์ฌ ๋ฑ๊ณผ ๊ฐ์ด ์ง์ ์์ฑํ์ง ์์ ์ฝ๋์ ์ ๋ขฐ์ฑ์ ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ์ ํด๋นํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ ํฌ๋ ์ดํธ๊ฐ ์ ์์ ์ธ ์ผ์ํ๋ ค๊ณ ํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์คํ๋ ค ํฌ๋ ์ดํธ๊ฐ "์๋ฆฌ"ํ๊ณ ๊น๋ํ ํธ๋ฆญ์ ์ํํ์ฌ ๊ตฌํ์๋ณด๋ค ํจ์จ์ ์ผ๋ก ๋ง๋ค๊ฑฐ๋ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ฌ์ฉ์ ์ง์ ํ์ ๊ตฌํ์ ๊นจ๋จ๋ฆด ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ผ๋ถ ์ฌ์ฉ์ ์ง์ ํ์ ํญ๋ชฉ์ด ๊ตฌํ์์๋ง ์ฌ์ฉ๋๋ ๊ตฌ์กฐ์ฒด์ ํ๋๋ฅผ ์ถ๊ฐํ๊ธฐ ์์ํ๊ณ Trace์ ๊ฐ์ ๊ฒ์ ๊นจ๋จ๋ ค๋ ๋๋ผ์ง ์์ ๊ฒ์ ๋๋ค.
@mystor ์ด๋ก ์ ์ผ๋ก๋ ๊ด๋ จ์ด์๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฌ์ง๋ง ์ค์ ๋ก Rust์์ ๊ตฌ์กฐ์ ๋ชจ๋ ํ๋๋ฅผ ์ ๊ณตํด์ผํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์ญ์์ค. ์๋ฅผ ๋ค์ด C ++์์๋ณด๋ค ๊ทธ๋ ๊ฒ ์กฐ์ฉํ ์๋ ํ ๊ฐ๋ฅ์ฑ์ด ํจ์ฌ ์ ์ต๋๋ค.
ํํ
๋ด๊ฐ ๊ฐ์ง ์์๋ ํ ๊ฐ์ง ์ ์์
#[derive]
์ ํ์ฅ ์์๋ฅผ ์กฐ์ ํ๋ ๊ฒ์ ๋๋ค.
์ด ์์ด๋์ด๊ฐ ์ข์์. ์๋ง๋ ๋ฌธ์์์ ์ธ๊ธ ํ ๊ฒ์ ๋จ์ํ ํ์ฅ ์์๊ฐ "์ ์๋์ง ์์"์ด๋ผ๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ต๊ทผ์ PartialEq / Eq๋ฅผ ํ์ฅํ๊ณ ์์ง๋ง ๊ทธ๋ ๊ฒํด์ผ ํ ์๊ฒฉํ ์ด์ ๋ ์์ต๋๋ค.
๊ตฌ์กฐ์ฒด ์ ์๋ฅผ ์์ ํ๋ ํ์๋ฌผ์ ๊ดํด์๋ ๋ฏธ๋ฌํ ์๋ฆฌ๊ฐ ๋๋ ๊ฒ์ ๋์ํ์ง๋ง ๋๋ฌด ๊ท์ฐฎ๊ฒํ์ง๋ ์์ต๋๋ค. ๋ํ "์๋ ์ฝ์ "ํ๋๊ฐ ๋งค์ฐ ํธ๋ฆฌ ํ ์ โโ์๋ค๊ณ ์๊ฐํฉ๋๋ค.ํ์ง๋ง ์ด๋ฌํ ์์ ์๋ ํ์ ๋ชฉ๋ก์ ๋ฃ๋ ๊ฒ๋ณด๋ค ๋ณ๊ฐ์ ์์ฑ์ด๋๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ฃผ๋ก ์ฌ๋๋ค์ด ์์์ ์์กดํ๋ ๊ฒ์ ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ง๊ธ ํ์ฅ์.
์ถ์ . ์ฌ๋๋ค์ด ํ์ฅ ์์์ ์์กด ํ ์ ์๋๋ก ์์ ํด์ ๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ผ๋ก ์๋ ๋ (๊ฒฐ์ ๋ก ์ ) RNG๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ์ฌ์ฉ์ ์ง์ ํ์ ํ์ฅ์ ์ฌ์ ๋ ฌํ๋ ๊ฒ์ ์ง์งํ๊ฒ ๊ณ ๋ คํ ๊ฒ์ ๋๋ค. ๋๋ ํญ์ ์์ ์ ์ข ์์ฑ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ด๋ค ๋งฅ๋ฝ์์ ์ด๊ฒ์ํ๊ณ ์ถ์์ง๋ง ๊ฒฐ์ฝ ๊ธฐํ๋ฅผ ์ป์ง ๋ชปํ์ต๋๋ค. ;)
ํธ์ง : ๋๋ ๋ด ๋ง์์ ๋ฐ๊พธ์๊ณ ๋ ์ด์ ๊ตฌ์กฐ์ฒด ๋ณํ์ ํ์ฉํ์ง ์๋ ์ด์ ๋ฅผ ๋ณด์ง ๋ชปํ์ง๋ง ์ปจํ ์คํธ์ ๋ํ ์๋ ์๊ฒฌ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ฐ๋ผ์ ๋ด ์ดํด์์ ๋ค์์ ์ฌ์ฉ์ ์ ์
#[derive]
๊ฐ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋๋ก ํ์ฉํ๋ ์ธ์์ ๋๋ค.
- ์ด๋ค ๊ฒฝ์ฐ์๋ ์ ์ฉ โโํ ์ ์์ต๋๋ค (์์ ๋ฅผ ๋ณธ ์ ์ด ์์ง๋ง ์กด์ฌํ๋ค๊ณ ์๊ฐํฉ๋๋ค)
- ์ฌ์ฉ ๋ ์์ฑ์ ์ ๊ฑฐ ํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค.
- ์ปค์คํ ํ์ ์์ฑ์์๊ฒ ๋ ๋ง์ ๊ถํ ์ ๊ณต
์ฌ์ฉ์ ์ ์
#[derive]
๊ตฌํ์ ์ ํ์ ์ถ๊ฐํ๊ธฐ์ํ ์ธ์ (์ : ๊ตฌ์กฐ์ฒด์ ์ด๋ฆ๊ณผ ๊ตฌ์กฐ์ฒด์ ํ๋ / ํ๋ ์ด๋ฆ์ด ๋์ผํ๊ฒ ์ ์ง๋์ด์ผ ํจ)๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ด๊ฒ์ ์ฌ์ฉ์ ์ ์
#[derive]
์ ์ํด ์์ฑ ๋ ์ฝ๋๊ฐ ๊ฑด์ ์ฑ์ ์ํด ํ์๋๋ ์ ํ์ ๊ตฌ์กฐ์ ์์กดํ๋๋ก ํ์ฉํฉ๋๋ค (์ : rust-gc์#[derive(Trace)]
. ๋๋ ๋ถ๊ฑด์ ํ๋ฉฐ ์ ์ฌ์ ์ผ๋ก ๋ฏธ๋ฌํ ์ฌ์ฉ ํ ์์ ๋ฐฉ์)- ๊ตฌ์กฐ์ฒด๋ฅผ ํตํด ์ ๋ฌ๋๋ ์ ๋ณด๊ฐ ์ ๊ธฐ ๋๋ฌธ์ ๋งคํฌ๋ก ํ์ฅ์์ ์์ ์ ์ข ์์ฑ์ ๊ฐ๋ฅ์ฑ์ ์ค์ ๋๋ค.
์ ์๊ฐ์๋
unsafe trait
impls ๋๋ ์์ ํ์ง ์์ ์ฝ๋์ ์์กดํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฑด์ ํ ์ฌ์ฉ์ ์ง์ ํ์ ๊ตฌํ์ ์์ฑํ๋ ๊ธฐ๋ฅ์ด ๋งค์ฐ ์ค์ํ๋ฉฐ, ์ฒซ ๋ฒ์งธ ์น์ ์์ ๋๋ถ๋ถ์ ๊ธฐ๋ฅ์ ๋ฌ์ฑ ํ ์์๋ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค ( ์์ ํ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌ์กฐ์ฒด ํ๋๋ฅผ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ์ ์ ์ธํ๊ณ ). ์ด๋ค ํํ์ ์ ์ฝ์ด ์๋ค๋ฉด rust-gc์ ๊ฐ์ ์์๊ฐ ์์ ํ ๋ฐฉ์์ผ๋ก ๊ตฌํ ๋ ์์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋ ๊ฐ์ง ์์ด๋์ด๊ฐ ์์ต๋๋ค.์์ด๋์ด 1
์ฌ์ฉ์ ์ง์ ํ์ ํจ์ค๋ฅผ ์คํํ๊ธฐ ์ ์ ๊ตฌ์กฐ์ฒด์ ์ด๋ฆ๊ณผ ๊ฐ ํ๋์ ์ด๋ฆ์ ์ฝ์ผ์ญ์์ค. ํจ์ค๊ฐ ์๋ฃ๋๊ณ ๊ตฌ์กฐ์ฒด๊ฐ ๋ค์ ๊ตฌ๋ฌธ ๋ถ์๋๋ฉด ๊ตฌ์กฐ์ฒด์ ์ด๋ฆ์ด ๋์ผํ ์ง, ๊ฐ ํ๋์ ์ด๋ฆ (๋ฐ ํ๋ ์)์ด ๋์ผํ ์ง ํ์ธํฉ๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ณ ๋น๋๋ฅผ ์ข ๋ฃํ์ญ์์ค.
์ด๋ ๊ฒํ๋ฉด ์ฌ์ฉ์ ์ง์ ํ์ ํ๋ฌ๊ทธ์ธ์ด ์์กด ํ ๊ฒ์ผ๋ก ์์๋๋ ๊ธฐ๋ณธ ๊ตฌ์กฐ์ ์์ฑ์ด ์์๋์ง ์๊ณ ๋ ๋ง์ ์ฌ์ด๋, ์ฌ์ฉ์ ์ง์ ํ์ ํ๋ฌ๊ทธ์ธ์ด ์์์ ์๋ฏธํฉ๋๋ค. ์ด๊ฒ์ ๋ํ ํ์ฌ์ ์ ๊ทผ ๋ฐฉ์๊ณผ ์ญ ํธํ๋๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ ๋ฏธ๋์ ๋ ์ข์ ์ง๋ค๊ณ ๊ฒฐ์ ํ๋ค๋ฉด, ์ฐ๋ฆฌ๋ ๊ทธ๋ฅ ์ ํํ๊ณ ๋๊ตฌ์ ์ฝ๋๋ ๊นฐ ์ ์์ต๋๋ค. ๋ํ ์ค๋๋ ์ฒ๋ผ ์ฌ์ฉ๋์ง ์๋ ์์ฑ ์ผ์ด์ค๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
์์ด๋์ด 2
๋ชจ๋ ์ฌ์ฉ์ ์ง์ ํ์ ํ๋ฌ๊ทธ์ธ์ ๋์ผํ ์ ๋ ฅ TokenStream (ํ๋ก๊ทธ๋จ์ ์์ฑ๋ ์๋ณธ ํ ์คํธ)์ ์ ๊ณตํฉ๋๋ค. ๊ฒฐ๊ณผ๊ฐ ๋ค์ ๊ตฌ๋ฌธ ๋ถ์ ๋ ๋ ์ถ๋ ฅ ๊ตฌ์กฐ์ฒด์ ์ฌ์ ํ ์กด์ฌํ๋ ์์ฑ์ ๊ธฐ๋กํฉ๋๋ค. ๋ชจ๋ ์ถ๋ ฅ ํ ํฐ ์คํธ๋ฆผ์ ์์ฑ์ด์๋ ๊ฒฝ์ฐ ์ฌ์ฉ๋์ง ์์ ์์ฑ์ ๋ํด ๋ถํํฉ๋๋ค.
์ด๊ฒ์ (๊ฐ๋ ์ ์ผ๋ก ๋ชจ๋ ์ฌ์ฉ์ ์ ์ ํ์ ํ๋ฌ๊ทธ์ธ์ด ๋์ผํ ์๋ ๊ฐ์ฒด์์ ์๋ํ๋ฏ๋ก) ์์ ์ข ์์ฑ์ ๊ฐ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ฉฐ ํ๋ฌ๊ทธ์ธ์ ๊ตฌ์กฐ๋ฅผ ๋ง์น ์๋ ์์์ ์๋ฏธํฉ๋๋ค. ์ด ์์ด๋์ด๋ ๋ชจ๋ ์ฌ์ฉ์ ์ ์ ํ์์ด ๊ธฐ์กด ๊ตฌ์กฐ์ฒด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ํญ๋ชฉ ๋ง ์์ฑํ๋ ๊ฐ์ฅ ์ ์์ ์ธ ๋ฐฉ์์ผ๋ก ์๋ํ๋๋ก ๋ณด์ฅํ๊ธฐ ๋๋ฌธ์ ์ข์ต๋๋ค. ์ด๊ฒ์ ๋ํ ํ์ฌ ์๋ฃจ์ ์ ๋ณํ ํ ์์๋ ์๋ฃจ์ ์ผ๋ก ์ฝ๊ฒ ๋ณํ ํ ์ ์์ต๋๋ค.
TL; DR
์์ฝํ๋ฉด, ๋ณํ ๊ตฌ์กฐ์ฒด๋ฅผ ํ์ฉํ๋ ํน๋ณํ ์ด์ ์ด ๋ฌด์์ธ์ง, ๊ทธ๋ฆฌ๊ณ ์์ ํ
#[derive(Trace)]
๋ฐ ํญ์ ์ฌ๋ฐ๋ฅธ#[derive(Serialize)]
๋ฑ์ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ์์ ๋ฌธ์ ๋ณด๋ค ์ ๋ ์ค์ํ์ง ์ดํดํ๊ณ ์ถ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ mutating structs ๊ฒฝ๋ก๋ก ๋ด๋ ค ๊ฐ๋ฉด ์ข์ ์ด์ ๊ฐ์์ ๊ฑฐ๋ผ๊ณ ํ์ ํ์ง๋ง, ๋ด Trace custom ํ์ ์ด๋ฆ์#[derive(unsafe_Trace)]
๋ก ๋ณ๊ฒฝํ๋ฉด ๋งค์ฐ ์ฌํ๊ฒ ๋ ๊ฒ์ ๋๋ค.
@alexcrichton ์ ์๋ฃจ์ ์ด ์ข์
@mystor ๊ฐ ๋ถ์พํ ๋๋ผ์์ผ๋ก ์ด์ด์ง ์ ์๋ค๋ ์ข์ ์ ์ด ์์ง๋ง struct
๋ฅผ ๋ณ๊ฒฝํ ๊ฐ๋ฅ์ฑ์ ํ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐ๋ฉด์ ์ ์ฐจ ์ ๋งคํฌ๋ก์ ์ฌ์ฉ ์ฌ๋ก, ์์ ํ์ง ์์ ์ฝ๋ ๋ฐ ๋ณด์ ๋ฌธ์ ๋ฅผ ๊ฒฐํฉํ ์์๋ ๋๋ฌผ๊ฒ ๋ณด์
๋๋ค.
์ฃผ์ ์์ ๋ฒ์ด๋จ :์ด ๊ตฌํ์ ๋งคํฌ๋ก๊ฐ ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก๋ณด๊ณ ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๊น?
์ปค์คํ ํ์์ ํ์ฅ ์์๋ฅผ ๋ฌด์์ ํํ๋ @nikomatsakis ์ ์์ด๋์ด๊ฐ ๋ญ๋๋ค . ๊ทธ๊ฒ์ "๋์"๊ด์ต์ด ๋๋ฌด ๋์ค์ ์ด๋๋ ๊ฒ์ ๋ง๋ ๋ฐ ํ์คํ ๋์์ด ๋ ๊ฒ์ด๋ฉฐ ๋๋ฌด ๋ง์ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ฌ์๋ ์๋ฉ๋๋ค.
@mystor ์ธ ๋ฒ์งธ ์ต์ ์ ๋ชจ๋ ํ์ ํญ๋ชฉ์ด ์ ์ฉ๋ ํ ํ ๋ฒ๋ง ์ด๋ฌํ ์์ ๊ฒ์ฌ๋ฅผ ์ํํ๋ ๊ฒ์ ๋๋ค. 100 % ์ฌ์ด๋๋ ์๋์ง๋ง (๋ ๊ฐ์ ํ์์ด ๋์ผํ ํ๋๋ฅผ ์ถ๊ฐํ๊ณ ์ ๊ฑฐ ํ ์ ์์) ๊ฒฝํ์ ๋์ฑ ์ธก๋ฉด์์ ์ฌ์ฉ์ ์ ์ ํ์์์ ๊ตฌ์กฐ์ฒด ์ ์๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ ์๋๋ฅผ ๋ฐฉ์งํ๊ธฐ์ ์ถฉ๋ถํด์ผํฉ๋๋ค.
๊ตฌ์กฐ์ฒด ์์ ์ ๋ํ ์ฐ๋ ค๋ ์ค์ ๋ก ๋ณด์ด์ง ์์ต๋๋ค. ํ๋๋ ๋ณด์ด์ง ์๊ฒ ์ถ๊ฐ ํ ์ ์์ผ๋ฉฐ ์ด๊ธฐํํ๋ ๋์์ฃผ์ํด์ผํฉ๋๋ค. ๊ทธ ์ผ์ด _ ์ ๋ง _ ๊ฑฑ์ ๋๋ค๋ฉด, ์ ์ฒด ๊ตฌ์กฐ์ฒด๋ฅผ ์ฝ๊ฒ ๋ณผ ์ ์๋ค๋ฉด ์ปดํ์ผ์ ์คํจํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋๋ก ํ์๋ฌผ์ ์์ฑํ ์ ์์ต๋๋ค.
@sgrif๋ ์๋ง๋ _most_ ์ฌ๋ก์์ ์ฌ์ค ์ผ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ๋ณธ ํน์ฑ์ด๋ ๋๋ฑํ ๊ฒ์ ๋์ถํ๊ณ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๊ทธ๋ค์ง ๋ง์ง ์์ต๋๋ค.
@sgrif ์ถ์ : ๋๋ถ๋ถ์
๊ตฌ์กฐ์ฒด์ ๋งคํฌ๋ก๋ฅผ ์ ์ฉํ๋ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ ํ์คํ ๊ตฌ์กฐ์ฒด ๋ณ๊ฒฝ + ๋ฐ์ฝ๋ ์ด์ ์ _combination_์ ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ผ๋ฐ์ ์ธ ๋น์จ์ด "๋จ์ง ์ฝ๊ฐ์ ๋ณ๊ฒฝ"์ผ๋ก "๋ง์ ์ฅ์"์ด ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ๊ฐ๋ ์ฑ๊ณผ ์ ์ฐ์ฑ์ ํฅ์์ํค๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์์ ๋ช ํํ ๊ตฌ๋ถ์ ๊ฐ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ทธ๋์ @mystor ์ ์ฃผ์ฅ์์์ด ๋ถ๋ถ์ด ์์ง๋ง :
์ฌ์ฉ์ ์ ์ # [derive]์ ์ํด ์์ฑ ๋ ์ฝ๋๊ฐ ๊ฑด์ ์ฑ์ ์ํด ํ์๋๋ ์ ํ์ ๊ตฌ์กฐ์ ์์กดํ๋๋ก ํ์ฉํฉ๋๋ค (์ : ์ค์ ์ง์ ์ ํ์ ํ์ธํด์ผํ๋ rust-gc์์ # [derive (Trace)] ๋๋ ๋ถ๊ฑด์ ํ๋ฉฐ ์ ์ฌ์ ์ผ๋ก ๋ฏธ๋ฌํ ์ฌ์ฉ ํ ์์ ๋ฐฉ์)
๋๋ ์ด๊ฒ์ ์ ๋ํ๋ ๊ฒ์ด ์ผ์ ์งํํ๋ ์๋ชป๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํนํ, ์ฐ๋ฆฌ๋ ์๋ง ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ๊ตฌ์กฐ ์ ์๋ฅผ ์์ ํ ์์๋ ๊ธฐ๋ฅ์ ์ํ์ญ๋๊น (์, ๊ทธ๊ฒ์ ํฌ๋ช
ํ์ง ์์ต๋๋ค,ํ์ง๋ง ๊ทธ๋์ ๋ญ). ์ฆ, ๋์ค์ ๊ตฌ์กฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋์ง ์๋๋ค๋ ๊ฒ์ ํ์ ํ ์์๋ "์ฌ์ด๋" Trace
์์ด๋์ด๋ _other_ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํด์ผ ํ ์๋ ์์ต๋๋ค. ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ์๋์์ ์๋ก ์ ์ฉ๋๋์ง ๊ณ ๋ คํ์ญ์์ค.
#[mangle] // <-- custom decorator that does bad things to struct definition
#[derive(Trace)]
struct Foo {
x: T, y: U
}
struct
์ ์๊ฐ ๋ณ๊ฒฝ๋๋ฉด _it_๊ฐ ์ปดํ์ผ์ ์คํจํ๋ ๋ฐฉ์์ผ๋ก Trace
impl์ ์์ฑํ ์ ์๋ค๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด :
unsafe impl Trace for Foo {
fn trace(&self) {
let &Foo { ref x, ref y } = self;
<T as Trace>::trace(x);
<U as Trace>::trace(y);
}
}
#[mangle]
๊ฐ ์ง์ ์ผ๋ก ์
๋ง์ ์ธ ๊ฒฝ์ฐ์๋ ๋น์ ์ impl์ ๋ง์น ์ ์์ต๋๋ค. =) ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ํ ์์๋ ์ผ์ด ๋๋ฌด ๋ง์ต๋๋ค.
์ด๋ฌํ ๋ํ์ ๊ด์ฐฐ์๋ก์ #[derive]
๋ impl
๋ธ๋ก ๋ง ์ถ๊ฐํ๊ณ ํ์ ์ฃผ์ ( #[mangle(Foo, Bar)]
์๋ฆฌ ๋์๊ฒ ์ข์ ๐ธ) ์ ํ์ ๊ตฌ์กฐ๋ฅผ _ ๋ณ๊ฒฝ _ํ๋ ๋ฐ ์ ๋
ํฉ๋๋ค. #[mangle]
์๋ ์ ์ ๋ ํ๊ฐ ์์๊ฐ์์ ์ ์์ต๋๋ค.
์์ง์๋ ๊ฒฝ์ฐ ์ฃผ์๊ฐ์ ์ ์ ๋ ํ๊ฐ ์์๊ฐ ์์ด์ผํฉ๋๋ค.
์ด์ ๋ํ ์ ์๊ฒฌ์ด ์ํ ๋ ๊ฒ ๊ฐ์ต๋๋ค. @nikomatsakis ๋ # [derive] ๋ด์์ ๋ณํ ๊ตฌ์กฐ์ฒด๋ฅผ ์ ๊ฑฐํ๋๋ผ๋ ์ฝ๋์์ ๊ตฌ์กฐ์ฒด ๋ ์ด์์์ ๋ํ ๊ฐ์ ์ ํ ์ ์๋ค๋ ์ข์ ์ ์ ์ง์ ํฉ๋๋ค. let Foo{ ... }
ํธ๋ฆญ์ ์ ์์ ์ธ ๊ฒฝ์ฐ ๋ ์ด์์์ด ์ฌ๋ฐ๋ฅธ์ง ํ์ธํ๋ ๋ฐ ํจ๊ณผ์ ์
๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ์ฌ๋์ด ๋
๋ฆฝ์ ์ผ๋ก ๋ฐ๊ฒฌ ํ ํ์๊ฐ ์๋๋ก ์ด๋๊ฐ์ ๋ฌธ์ํํด์ผ ํ ๊ฒ์
๋๋ค.
๋ฟก ๋นต๋จ
๊ทธ๋ฌ๋ ๋์ค์ ๋ณ๊ฒฝ์ ๋ํด _ ๊ฐ๋ณ์ ์ผ๋ก _ ์ฌ์ฉ์ ์ ์ ํ์์ ๊ฐํํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ์๊ฒ๋์ด ๊ธฐ์ฉ๋๋ค. :-)
์์ฑ์ด ์ ์ฉ๋๋ ํญ๋ชฉ์ ๋ด๋ถ๋ฅผ ์์ ํด์ผํ๋ ๊ฒฝ์ฐ์ ๋ํด ๋ฐฉ๊ธ u.r-l.o
์์ "Pre-implementation feedback for Qt with Rust"์ค๋ ๋๋ฅผ ๋ฐ๊ฒฌํ๊ณ ์ด ๊ฒ์๋ฌผ์ ์์ฑํ์ต๋๋ค.
https://users.rust-lang.org/t/pre-implementation-feedback-for-qt-with-rust/7300/19
ํ ๊ฐ์ง ์ฃผ๋ชฉํ ๋งํ ์ธก๋ฉด์ ์ฌ๊ธฐ์์ #[derive]
(๋๋ ์ด์ ์ ์ฌํ)๋ฅผ ๊ตฌ์กฐ์ฒด๊ฐ ์๋ _trait_์ ์ ์ฉํ๊ณ ๊ทธ ์์ ์ถ๊ฐ ๋ ํญ๋ชฉ์ const
ํน์ฑ ๋ฉ์๋๊ฐ ๋ ๊ฒ์์ ์ ์ํฉ๋๋ค. .
์์์ ์ ๊ธฐ ํํ๋ฌผ ๋ฌธ์ ์ ๋น์ทํ์ง๋ง ํ์คํ์ง ์์ต๋๋ค.
#[macro_use]
extern crate double;
double
๋ผ๋ ์์์์ ์ ์ฐจ ๋งคํฌ๋ก ๊ฐ์ ธ ์ค๊ธฐ. ์ปดํ์ผ ํ์์ (์ค์ Ruest์์์ ๊ฐ์ด) ๋ฐํ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ Racket์ (require (for-syntax ...))
์ ์ฌํ ๋จ๊ณ์ ์ผ๋ก ์ฆ๊ฐํ๋ import ๋ฌธ์ด ์์ด์ผํฉ๋๋ค. [๋ผ์ผ ๋ฌธ์๋ https://docs.racket-lang.org/reference/require.html# % 28form ._ % 28 % 28lib._racket % 2Fprivate % 2Fbase..rkt % 29._for-meta % 29 % 29, ์ํ๊น๊ฒ๋ ์ฌ๋ฐ๋ฅธ ์น์
์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์์ต๋๋ค.]
๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ http://blog.ezyang.com/2016/07/what-template-haskell-gets-wrong-and-racket-gets-right/ ๋ Template Haskell์์ ๋ฐ์ํ ๋จ๊ณ์ ์ค์๋ฅผ ์ง์ ํ๋ฉฐ ๊ด์ฌ์ด์์ ์ ์์ต๋๋ค. -๋๋ Rust์์ ๊ฐ์ ์ค์๋ฅผํ๊ณ ์ถ์ง ์์ต๋๋ค.
@ Ericson2314 Rust์ ์ฐจ์ด์ ์ double
๊ฐ ์ด๋ฏธ ํน์ ๋จ๊ณ๋ฅผ ์ํด ์ปดํ์ผ ๋ ๊ฒ์
๋๋ค _.
์ฆ, ์์๋ macro_rules
์ ๊ฐ์ด ์ ์ ๋ ๊ฒ์ฒ๋ผ ๋งคํฌ๋ก / ์์ ์ ์ธํฐํ์ด์ค ๋ง ๋ด ๋ณด๋
๋๋ค.
์ ์ฐจ ์ ๋งคํฌ๋ก์ ๊ธฐ๋ณธ Rust ํญ๋ชฉ (์ ์ฐจ ์ ๋งคํฌ๋ก๋ฅผ ํ์ฑํ๋)์ ๋ชจ๋ ๋ด๋ณด๋ด๋ ์์๋ฅผ ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ ํฅ๋ฏธ๋ก์ธ ๊ฒ์ด์ง๋ง ์ง๊ธ๊น์ง๋ ์ด๋ค ๋ฅ๋ ฅ์ผ๋ก๋ ์ ์๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
์ ์๋๋ ์์๊ฐ ๋ฌด์์ ์ด๋ป๊ฒ ๋ด๋ณด๋ผ ์ง์ ๋ํด ๋ง์ ๊ฒ์ ์ ํํ ์ ์๋๋ก ํ์ฉํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ์ ์์ง๋ง, ๋ค๋ฅธ ์ปดํ์ผ ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ LISP์์ ์์คํ ์ ๋๋งค๋ก ๊ฐ์ ธ ์ค๋ ๊ฒ๋ง์ผ๋ก๋ ๋น์์ฐ์ ์ธ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
๊ทธ๋ @eddyb ๋๋์ด "์์ฑ์ด ๋ค์ด ์คํธ๋ฆผ์์ ์ด๋ป๊ฒ ์ฌ์ฉ ๋ ์ง ์๊ณ ์๋ค"๋ ๋ฐฉ๋ฒ๋ก ์ ํ์์ ์ ๋๋ค. ์ปดํ์ผ ๋ชจ๋ธ๋ก ์ธํด Racket๋ณด๋ค ๋จ๊ณ๊ฐ ๋ ์ค์ํ๋ค๋ฉด (Racket์ด ํฌ๋ก์ค ์ปดํ์ผ ํ ์ ์๋์ง ํ์คํ์ง ์์ต๋๋ค), ๊ทธ๋์ ๋ง์ง๋ง ์ฃผ์ฅ์ ์ดํดํ์ง ๋ชปํ์ต๋๋ค.
์ธ์ด ํ ํ ๋ก ์ ์ง๋ช : ์์ ํ ๊ณํ.
serde ์ชฝ์์๋ ๊ธฐ์กด ์ปดํ์ผ๋ฌ ํ๋ฌ๊ทธ์ธ ์ง์์ ์ค๋จํ๊ณ ๋ชจ๋ ์ผ๊ฐ ์ฌ์ฉ์์๊ฒ ๊ณต์์ ์ผ๋ก Macros 1.1์ ๊ถ์ฅํ๊ธฐ ์ ์ ๋จ์ ๋ฌธ์ ์ ์งง์ ๋ชฉ๋ก์ด ์์ต๋๋ค. https://github.com/serde-rs/serde/issues/545. Rust์์ ํ์ํ ๊ฒ์ # 36211์ ์์ ํ๋ ๊ฒ๋ฟ์
๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋น ๋ฅด๊ฒ ์งํํ๊ณ ์๋ ๋ค๋ฅธ ๋ชจ๋
syntex๋ฅผ ์ฌ์ฉํ์ง ์๊ณ rustc_macro๋ฅผ ๊ตฌํํ๋ PR์ด ์ด๋ ค ์์ผ๋ฏ๋ก ์ปดํ์ผ ์๊ฐ https://github.com/serde-rs/serde/pull/548 ์ ๋ํ ๊ฑฑ์ ์ ๋ฉ์ถ ์ ์์ต๋๋ค
ํธ์ง : ์ ๊ฒฝ ์ฐ์ง ๋ง์ญ์์ค. # 36211์ ์ด์ syntex ๊ตฌํ์๋ง ์ํฅ์ ๋ฏธ์ณค์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ํ์ํ ๋ชจ๋ ๊ฒ์ ํ ์ ์๋๋ก ๊ธ์์ผ๊น์ง ๋์ ค ํญ๊ตฌ๋ฅผ ๋ง๋ฌด๋ฆฌํ๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค.
@dtolnay ์ฃผ์ด์ง serde-rs / serde # 548, serde์ ๋ํ ๋๋จธ์ง ์ฐจ๋จ๊ธฐ๊ฐ ์์ต๋๊น?
@sgrif ๊ต์ฅํฉ๋๋ค, ๊ฐ์ฌํฉ๋๋ค! ๊ทธ๋ฐ ๋ค์ (๋๋ ์ด์ ์) ๋ง๋ ๋๋จธ์ง ์ฐจ๋จ์ ์ ๋ํด ์ฌ๊ธฐ์ ๋๊ธ์ ๋ฌ ์ ์์ต๋๊น?
๋ค, ํ ๊ฒ์.
2016 ๋
9 ์ 27 ์ผ ํ์์ผ ์คํ 7:29 Alex Crichton [email protected]
์ผ๋ค :
@dtolnay https://github.com/dtolnay ์ฃผ์ด์ง serde-rs / serde # 548
https://github.com/serde-rs/serde/pull/548 , ๋จ์ ํญ๋ชฉ์ด ์์ต๋๊น?
serde์ ๋ํ ์ฐจ๋จ์ ?@sgrif https://github.com/sgrif ๊ต์ฅํฉ๋๋ค, ๊ฐ์ฌํฉ๋๋ค! ๋น์ ์ด ๊ทธ๊ฒ์ ํ ํ์
(๋๋ ์ด์ ์) ๋จ์ ์ฐจ๋จ๊ธฐ๋ก ์ฌ๊ธฐ์ ๋๊ธ์ ๋ฌ ์ ์์ต๋๊น?
๋ง๋ฌ์ต๋๊น?โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/rust-lang/rust/issues/35900#issuecomment -250028743,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABdWK7MnA1rpn-WGji8gwAT2JCIqB4LFks5quaa-gaJpZM4JqEAX
.
๋ฟก ๋นต๋จ
serde-rs / serde # 548์์ serde์ ๋ํ ์ฐจ๋จ์ ๊ฐ ๋จ์ ์์ต๋๊น?
์๋์, @ oli-obk ๋๋ @erickt๊ฐ ์ค๋ ๋๋ ๋ด์ผ PR์ ๊ฒํ ํ๋ฉด ๋ค์ ๋ ๋ชจ๋ ๊ฒ์ ํธ์ํ๊ณ Rusoto์ ๊ฐ์ ๋ช ๋ช ์ ์ ๋ช ํ ์ฌ์ฉ์๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ ์ ์์ต๋๋ค.
@dtolnay ์ ๋ Ruma ์์ serde_macros๋ฅผ ๋ง์ด ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๋ ๋ง์ ๋์ด ํ์ํ ๊ฒฝ์ฐ serde_derive๋ ํ ์คํธํ๋ ๋ฐ ๋์์ ๋๋ฆฌ๊ณ ์ถ์ต๋๋ค.
์ฌ์ค, ์ ๋ diesel_codegen์ ์ฌ์ฉํ๋ฏ๋ก Ruma๋์ด ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Macros 1.1 ๋ฒ์ ์ ๋ํ ์ข์ ํ ์คํธ ์ฅ์์ ๋๋ค.
๋๋ Serde 0.8.10์ ๋ฐํํ์ฌ serde_macros๊ฐ ๋งคํฌ๋ก 1.1์ ์ํด ๋ ์ด์ ์ฌ์ฉ๋์ง
https://github.com/rust-lang/cargo/issues/3132- "cargo doc works"ํ์ธ๋์ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค
@dtolnay ์๋ฃ!
์ด๊ฒ์ด serde_derive ๋ฒ๊ทธ์ธ์ง rustc / rustdoc ๋ฒ๊ทธ์ธ์ง ํ์คํ์ง ์์ง๋ง ์์ฑ ๋ ๋ฌธ์์์ ๋ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค.
Deserialize
๋ฐ Serialize
๋ ์ฌ์ฉ์ ์ ์ ํ์์ ์ฌ์ฉํ๋ ์ ํ์ "Trait Implementations"์น์
์ ํ์๋์ง ์์ต๋๋ค.์ฌ์ฉ์ ์ ์ ํ์์ ์ฌ์ฉํ๋ ์ ํ์ ์์ฑ ๋ ๋ ์คํธ๋ง ์์ ๋ถ๋ถ์ ๋ฆฌํฐ๋ด "///"๊ฐ ๋ํ๋ฉ๋๋ค.
์ด๊ฒ์ syn
๋ฒ๊ทธ์์ต๋๋ค. ๋๋ 0.8.2๋ฅผ ์์ ํ์ฌ cargo update
๋ก ์ถ์ํ์ต๋๋ค.
๋๋ ๋ ๋ฒ์งธ ๊ฒ์ ๋ํด ๋ชจ๋ฅธ๋ค. @alexcrichton์๊ฒ ๋งก๊ธธ ๊ฒ์ด๋ค.
๋ฟก ๋นต๋จ
Deserialize
๋ฐSerialize
๋ ์ฌ์ฉ์ ์ ์ ํ์์ ์ฌ์ฉํ๋ ์ ํ์ "Trait Implementations"์น์ ์ ํ์๋์ง ์์ต๋๋ค.
๊ทธ๊ฒ์ ๊ฝค ๋น๋ฆฐ๋ด์ฒ๋ผ ๋ค๋ฆฝ๋๋ค! ์ด๊ฒ์ rustdoc์ ๋ฒ๊ทธ ์ธ ๊ฒ ๊ฐ์ง๋ง ์๋ง๋ ์๋ก์ด ๋ฒ๊ทธ๋ ์๋ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด rustdoc๋ Copy
๊ตฌํ์์ ์ด๊ฒ์ ๋ณด์ฌ์ฃผ์ง ์์ต๋๋ค :
#[derive(Clone)]
pub struct Point {
x: i32,
y: i32,
}
const _FOO: () = {
impl Copy for Point {}
()
};
์ด ํจํด์ serde-derive์์ impl์ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. @dtolnay ๋ serde_macros
๊ฐ์ ์ธ๋์ ํํ๋ฅผ ๊ฐ์ก ๋์? ๋ฌธ์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ง๊ธ ๋น์ฅ ๋ ๋๋ ๊ฒ์ด ์ฌ์ธ๊น์?
@jimmycuadra๊ฐ ๊ทธ๊ฒ์ ๋ํ rustdoc ๋ฌธ์ ๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ๋ณ๋์ ๋ฒ๊ทธ๋ฅผ ์ด๊ณ ์ถ์ต๋๊น?
@dtolnay ๋
serde_macros
๊ฐ์ ์ธ๋์ ํํ๋ฅผ ๊ฐ์ก ๋์?
์.
๋ฌธ์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ง๊ธ ๋น์ฅ ๋ ๋๋ ๊ฒ์ด ์ฌ์ธ๊น์?
์๋์. ์ ๊ฐ ์๋ ํ์ด ๋ ๊ฐ์ง ์ ์ฝ ์กฐ๊ฑด์ ๋ชจ๋ ์ถฉ์กฑํ๋ ์ ์ผํ ์๋ฃจ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
::serde
์๋๋๋ค. ์ด๊ฒ์ ์ฌ๋๋ค์ด ๋ณ๋์ ๋ชจ๋์์ ๊ธฐ๋ฅ ํ๋๊ทธ ๋ค์ serde impls์ ๋ฃ์ ๋ ์ผ๋ฐ์ ์
๋๋ค.์์ธํ ๋ด์ฉ์ https://github.com/serde-rs/serde/issues/159 ๋ฅผ ์ฐธ์กฐ
@dtolnay ์ ์ข์, ๋ช ํํํ๊ธฐ ์ํด @jimmycuadra ์ด๊ฒ์ ์ด์ ์ ํ๊ท๊ฐ ์๋๋๋ค.
์ ๋ฐ์ดํธ : ํฌํธ๋ ์์ง ์๋ฃ๋์ง ์์์ง๋ง ๊ฑฐ์ ์๋ฃ๋์์ต๋๋ค. ๋ด๊ฐ ์ด๋ฏธ๋ณด๊ณ ํ ๊ฒ ์ธ์๋ ์ฐ๋ฆฌ๊ฐ ์ง๋ฉด ํ ๊ฒ์ผ๋ก ์๊ณ ์๋ ์ฌ์ํ ์ ํ ์ธ์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. "๋์ ค ์๋"์์๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์์ ํ ๊ฒ์ ๋๋ค. ์ค๋ ๋ฐค์ ๋ฐ์ํ์ง ์๋ ๊ฒฝ์ฐ ๋งคํฌ๋ก 1.1์ ๋ํ ๋ฆด๋ฆฌ์ค๊ฐ ๋ด์ผ์์ ๊ฒ์ ๋๋ค.
์ถ์ข
์๋ค์ ์ํด ์ ๋ # 36945๋ฅผ ์ด์ด์ ๊ฑฐ์ ๋ชจ๋ ๊ณณ์์ rustc_macro
๋ฅผ proc_macro
์ด๋ฆ์ ๋ณ๊ฒฝํ์ต๋๋ค.์ด ์์์ ์ด๋ฆ์ ๋ํ ํฉ์๊ฐ์๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค.
rustdoc์ ๋๋ฝ ๋ ํน์ฑ ๊ตฌํ (ํ์ฌ ๋ค๋ฅธ ๋ฌธ์ ์์ ์ถ์ ์ค์)์ด ๋งคํฌ๋ก 1.1์๋ง ๊ตญํ๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฌด์ํด๋ ์์ ํฉ๋๋ค.
๋ด mockers
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ปดํ์ผ๋ฌ ํ๋ฌ๊ทธ์ธ์์ ๋งคํฌ๋ก 1.1๋ก ์ด์ํ๋ ค๊ณ ํ๋๋ฐ "์ค๋ฅ : ์ฌ์ฉ์ ์ง์ ํ์ ์์ฑ์ด struct / enum ํญ๋ชฉ์๋ง ์ ์ฉ๋ ์ ์์ต๋๋ค"๋ผ๋ ๋ฉ์์ง๊ฐ ํ์๋์์ต๋๋ค. ์ปดํ์ผ๋ฌ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ฉด ํธ๋ ์ด ํธ์ "derive"๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค (๋ค์ ์ด์ํ์ง๋ง). ๋ด๊ฐ ์ฌ๊ธฐ์ ์ด์ด ์ข์ง ์์ต๋๊น?
@kriomant ํฅ๋ฏธ๋ก์ด! #[derive]
์ด ํธ๋ ์ด ํธ์ ์ ์ฉ ํ ์ ์๋๋ก ์๋ ๋ ์ ์ด ์๋์ง ํ์คํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์ค์ ๋ก ์ปค์คํ
ํ์์ ๋ฒ๊ทธ ์ผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ง๊ธ์ ๋ณด์์ ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์์ง ํน์ฑ์์ ํ์๋์ง๋ ์์ ๊ฒ ๊ฐ์ง๋ง ๋ถ์์ ํ ๊ธฐ๋ฅ์ ์ถ๊ฐ ํ ์๋ ์์ต๋๋ค. @ rust-lang / lang์ ์๊ฐ?
@alexcrichton custom_derive์ ์ธก๋ฉด์์ ํน์ฑ๊ณผ ๊ตฌ์กฐ์ฒด์ ์ฐจ์ด์ ์ ๋ฌด์์ ๋๊น?
@KalitaAlexey ์์, ์ค์ derive
๊ตฌํ ๊ณผ ์ผ์น ์ธ์์ ์ธ ์ ํ์
๋๋ค.
@alexcrichton ํน์ฑ์ ๋ํ ์ง์์ ํ์ฅ ํ ์ ์์ต๋๊น?
์์์ ์ธ๊ธํ๋ฏ์ด ์ปค์คํ ํ์์ด ํธ๋ ์ด ํธ์ ํ์ฉ ๋ ๋ฒ๊ทธ ์ผ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฉฐ ์ด๋ RFC์ ์ฌ์์ด ์ง์ ๋์ง ์์์ผ๋ฏ๋ก ํ์ฅํ๊ธฐ ์ ์ ๋ ๋ง์ ๋ ผ์๊ฐ ํ์ํฉ๋๋ค. ์ด์จ๋ derive-on-trait์ ๋ํ ์ง์์ ์ฒซ ๋ฒ์งธ ํจ์ค์์ ์์ ํ ๋ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ง ๋ง ๋ณ๋์ ๊ธฐ๋ฅ ๊ฒ์ดํธ๋ฅผ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
๋๋ ๊ฐ์ธ์ ์ผ๋ก derive-on-trait์ ์ถ๊ฐํ๊ธฐ๋ฅผ ์ํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ๊ทธ ์์ฒด๋ก ํ์๋๊ธฐ๋ณด๋ค๋ ์ปค์คํ
์์ฑ ์์ญ์ ๋ผ์ธ์ ๋ฐ๋ผ ํจ์ฌ ๋ ๋ง์ด ๋ณด์ด๊ธฐ ๋๋ฌธ์
๋๋ค. (์ : ์๋ ์์ฑ ๋ #[derive]
์ ์ ์ ์ ์๋ฐฐ๋จ)
์ฌ์ฉ์ ์ง์ ํ์์ด ์ผ๋ฐ ํ์๊ณผ ๋๊ฐ์ ๊ท์น์ ๋ฐ๋ฅด๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋์ค์ ๊ทธ๊ฒ์ ๋ณ๊ฒฝํ๊ณ ์ถ์ ์๋ ์์ง๋ง RFC๋ฅผ ๋ฐ์์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ).
ํํ
์ง๊ธ์ ๋ณด์์ ์ด๊ธฐ ์ํด ์์ง ํน์ฑ ํ์์ ์์ ํํ์ง ๋ชปํ ๊ฐ๋ฅ์ฑ์ด ์์ง๋ง ๋ถ์์ ํ ๊ธฐ๋ฅ์ ์ถ๊ฐ ํ ์ ์์ต๋๋ค. @ rust-lang / lang์ ์๊ฐ?
๐ ๋์๊ฒ์.
์ข์, ๋ถ์์ ํ ๊ธฐ๋ฅ์ ์ข์ง๋ง ๋ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ ์ ์ผ๋ก ์๋ํ์ง ์์ ๊ฒ์
๋๋ค (์ฝ๋ ์์ฑ์์ด). macro!(โฆ)
๊ตฌ๋ฌธ๋ "๋งคํฌ๋ก 1.1"์ ํฌํจ๋์ง ์์ต๋๋ค. ๋ง์ต๋๊น?
proc ๋งคํฌ๋ก RFC๋ฅผ ๋ค์ ๊ฒํ ํ๊ณ ์์ผ๋ฉฐ ๋งคํฌ๋ก ์์๊ฐ #[cfg(macro)]
์ ์ธํด์ผํ๋ค๋ ๊ณํ์ด์์์ต๋๋ค. ๋งคํฌ๋ก 1.1์๋์ด ๊ธฐ๋ฅ์ด ํ์ํ์ง ์์ง๋ง ํน๋ณํ ์์ ์ ํ์ด ํ์ํฉ๋๋ค. ๋ ๊ฐ์ง ๋ฉ์ปค๋์ฆ์ ๋ค์ ์ง๊ตํฉ๋๋ค. ์ฒซ ๋ฒ์งธ๋ ์ปดํ์ผ ๋จ๊ณ๋ฅผ ์ค๋ช
ํ๊ณ ๋ ๋ฒ์งธ๋ ์์์ ์ข
๋ฅ๋ฅผ ์ค๋ช
ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ค์ ๋ํ ๋ค์ ๊ฒน์นฉ๋๋ค. ํ์๋ ์ ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ ์๋ ๋์ผํ ํฌ๋ ์ดํธ์์ proc ๋งคํฌ๋ก์ ๋น ๋งคํฌ๋ก ํจ์๋ฅผ ์ ์ธํ๋๋ก ํ์ฅ๋๋ ๋ฐ๋ฉด ํ์๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
์ฌ๊ธฐ์ ๋ณ๊ฒฝํด์ผ ํ ์ฌํญ์ด ์๋์ง ํ์คํ์ง ์์ต๋๋ค. proc ๋งคํฌ๋ก ์ ์์ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ผ๋ก ํดํน ํ ์ ์์ต๋๋ค (๊ณ ์์ ์ผ๋ก ๋งคํฌ๋ก๋ฅผ๋ก๋ํ๋ ๋ฉ์ปค๋์ฆ๊ณผ ํฌ๋ ์ดํธ ์ ํ์ ์ค๋ช ํ์ง ์์). ๊ทธ๋ฌ๋ ์์ ํ ๊ธฐ๊ฐ ๋์ ๊ณ ๋ คํด์ผ ํ ์ฌํญ.
@kriomant ๋ง์ต๋๋ค, ์
@nrc ์ง๊ธ์ ์ค์ ๋ก cfg(rustc_macro)
๋ก ์ ์๋์ด ์์ต๋๋ค (๊ณง proc_macro
๋ก ๋ณ๊ฒฝ ๋ ์์ ์). ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ํ์๋กํ์ง ์์ต๋๋ค.ํ์ง๋ง, ์ปดํ์ผ ์๊ฐ๊ณผ ๋ฐํ์์ ํฌ๋ ์ดํธ์ ์ฐ๊ฒฐํ๋ ๊ฐ๋
๋ชจ๋์ ํ์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ์ฆ, ์ฐ๋ฆฌ๋ proc-macro ํฌ๋ ์ดํธ๋ฅผ ๋ ๋ฒ ์ปดํ์ผํฉ๋๋ค : ํ ๋ฒ์ ํฌ๋ ์ดํธ ์ ํ proc-macro
, ํ ๋ฒ์ ํฌ๋ ์ดํธ ์ ํ rlib
, ํ์๋ libsyntax ๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ ๋งํฌํ์ง ์์ต๋๋ค. ๊ทธ.
์ง๊ธ์ _require_ํ์ง ์์๋ ๊ด์ฐฎ์ ๋ณด์ด์ง๋ง ๋์ค์ ๋ฐํ์ ์ง์์ ์ตํธ ์ธํด์ผ ํจ์ ์๋ฏธํ๋ค๊ณ ์๊ฐํฉ๋๋ค. (ํฌ๋ ์ดํธ๋ฅผ ๋ ๋ฒ ์ปดํ์ผ)
@alexcrichton #[proc_macro_derive]
์์ ํ ์ ์์๊น์? ๋์ผํ ๋ฐฉ์์ผ๋ก #[test]
#[cfg(test)]
ํฉ๋๋ค.
(์ง๊ธ ์ถ๊ฐํด์ผํ๋ค๋ ์๋ฏธ๋ ์๋๋๋ค. cfg
์ถ๊ฐํ๋ ์ต์
์ ๊ฒฝ์ฐ๋ ๋ฏธ์ฌ์ฉ ์์ดํ
๊ฒฝ๊ณ ์
๋๋ค.)
@eddyb extern crate proc_macro;
์ด๋ป์ต๋๊น? ๊ทธ๊ฒ๋ ๊นจ์ง ๊ฒ ๊ฐ์์.
@mystor ๋ค์ํ ์ ํ๊ณผ impls๊ฐ์๋ ์ผ๋ฐ ์์์ ๋๋ค.
libsyntax
์๋ ์ฐ๊ฒฐ๋์ง ์์ต๋๋ค. ์ฆ, ํฌ๋ ์ดํธ๊ฐ proc_macro ํฌ๋ ์ดํธ๋ฅผ ์ฌ์ฉํ๊ณ ํฌ๋ก์ค ์ปดํ์ผํ๋ ค๋ฉด ๊ตฌ๋ฌธ์ ํฌ๋ก์ค ์ปดํ์ผํด์ผํ๋ค๋ ์๋ฏธ์
๋๊น?
@eddyb yes #[proc_macro_derive]
๋ ์๋์ผ๋ก ๋ฌด์ ๋ ์ ์์ง๋ง ๋ฌธ์ ๋ ์ด๋ฌํ ํจ์๊ฐ ์ ์ด์ ์ผ๋ก ๋๋ฌํ๋ ๋ชจ๋ ๊ฒ์ ๋ฌด์ํด์ผํ๋ค๋ ๊ฒ์
๋๋ค (์ : extern crate proc_macro
). "๊ทธ๋ฅ ํฌ๋ ์ดํธ"์ด์ง๋ง ๋ฐํ์์ ์ฌ๊ฐํ ์ํฅ์ ๋ฏธ์นฉ๋๋ค (๋์ ์ฐ๊ฒฐ, ํฌ๋ก์ค ์ปดํ์ผ ๋ ๋์์๋ ์ฌ์ฉํ ์ ์์ ๋ฑ).
ํ
์คํธ์๋ #[cfg(test)]
๊ฐ ์์ผ๋ฏ๋ก ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผํ ๋ชฉ์ ์ผ๋ก #[cfg(proc_macro)]
๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ๋ก ๋ณด์
๋๋ค.
@alexcrichton _Ideally_, ํฌ๋ ์ดํธ์๋ ๋ด ๋ณด๋ธ ๊ฒ ์ธ์๋ ์๋ฌด๊ฒ๋ ์์ผ๋ฉฐ ๋์ ๋งํฌ ๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ด ํ์ํ์ง ์์ต๋๋ค. libstd
์์ต๋๋ค. ๊ทธ๋ฌ๋ #![no_std]
์ผ์ด์ค์์ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๋ชจ๋ ๊ฒ์ ์ก์ผ๋ ค๋ฉด ์ฒ์๋ถํฐ ๋๋ธ ์ปดํ์ผ์ํด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค. : dis specified :.
ํธ์ง : ์ ๊น, ๋ด๊ฐ ๋ฌด์จ ์๊ฐ์ํ๊ณ ์๋? ์ฌ์ฉ์ ์ ์ ์์ ์ ํ์ด ํ์ํ๋ฉฐ ์ด์ค ์ปดํ์ผ์ _ ์ผ๋ฐ _ ์์์ ์ ์ฉ๋๋ฉฐ _ ๋ํ _ ์ ์ฐจ ์ ๋งคํฌ๋ก / ์์ฑ / ํ์ / ๋ฑ์ _ ๋ด ๋ณด๋
๋๋ค. ๊ทธ๋์ ์ง๊ธ์ ๊ด๋ จ์ด ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์๋ก์ด ์์ ์ ํ์ ๋ํด ํญ์ ์ค์ ๋ #[cfg(proc_macro)]
๋ฅผ ๋์
ํ ์ ์์ต๋๋ค.
๐ ์ด ๊ธฐ๋ฅ์ ์ด ๋ฆด๋ฆฌ์ค์ฃผ๊ธฐ๊ฐ ๋๋ ๋ ์์ ํ ํ ๋ชฉ์ ์ผ๋ก ์ต์ข ๋๊ธ ๊ธฐ๊ฐ์ ๋ค์ด๊ฐ๋๋ค ! ๐
์ด์ ์์ ํ๋ฅผ ๊ณ ๋ คํ๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด ์ค๋ ๋์ ๋ํ ์ด์ ํฉ์์ ๋ฐ๋ผ ์ด๋ฆ์ด proc_macro
๋ก ์ด๋ํ๊ณ ์์ต๋๋ค. ์ด ๋ฆด๋ฆฌ์ค์ฃผ๊ธฐ์ ๋๋จธ์ง ๋ถ๋ถ์ ๋ํด ๊ณ์ํด์์ด ๋ฌธ์ ์ ๊ธฐํ ์ธ๋ถ ์ฌํญ์ ์์ ๊ฑฐ ํตํ ํ ์ ์์ต๋๋ค.
์์๋ฅผ ๋ ๋ฒ ์ปดํ์ผํ๋ ๊ฒ์ ๋งค์ฐ ์กฐ์กํ๊ฒ ๋ค๋ฆฝ๋๋ค. ๋ฒ์ ์ง์ ์ด ์ ๋๋ก ์๋ํ์ง ์์ต๋๋ค. extern! crate needed_for_my_inline_proc_macros;
์ ๊ฐ์ ๊ฒ์ด ํจ์ฌ ๋ ์ข์ ์๋ฃจ์
์
๋๋ค.
@aturon ๋ญ, ์ฌ๋๋ค์ด ๋ฐฉ๊ธ ์ ์ ์ฌ์ฉํ๊ธฐ ์์ํ์ง ์์์ต๋๊น?
@ Ericson2314 ๊ทธ๋ณด๋ค ์กฐ๊ธ ๋ ๊ธธ์์ง๋ง FCP ์ฝ๋ฉํธ์์ ์ค๋ช ํ๋ฏ์ด ์์ ์ ์ธ ์ฑ๋๋ก ๋ฐฐ์ก๋๊ธฐ๊น์ง _minimum_ ์๊ฐ์ ์ง๊ธ๋ถํฐ 3 ๊ฐ์์ด๋ฉฐ,์ด ๊ทน๋๋ก ์ข์ ์ธํฐํ์ด์ค์ ์ถฉ๋ถํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
FCP ์์ฒด๋ 6 ์ฃผ ๋์ ์งํ๋๋ฏ๋ก ๋ฐ๋์ ์์ ํ๋ฅผ์ํ ๊ฒฝ๋ก์ ๋์ด๋ ๊ฒ์ ์๋๋๋ค. ๊ทธ๋ฌ๋ ์ ์ด๋ ์ง๊ธ ํ๋ก์ธ์ค๋ฅผ ์์ํ๋ฉด ๊ทธ ์ ์ ๋ฌธ์ ๊ฐ ๋ฐ๊ฒฌ๋์ง ์์๋ค๊ณ ๊ฐ์ ํ๊ณ 3 ๊ฐ์ ์์์ด ๊ธฐ๋ฅ์ ์ ๊ณต ํ ๊ธฐํ๋ฅผ ๋ง๋ญ๋๋ค.
๊ทธ๋. ๋๋ 3 ๊ฐ์์ ๋ถ๋ถ์ ๊ธฐ์ตํ์ง๋ง, ๊ทธ 3 ๊ฐ ์ ์์ FCP์ ์์น๋ฅผ โโ์์๋ค. โ 8 ์ 22 ์ผ๋ถํฐ 3 ๊ฐ์ mounths์๋ค. ๊ทธ๋ ํ์ด๋ฐ์ ์ ๊ฒฝ ์ฐ์ง ๋ง๋ผ.
๋ด๊ฐ ์ ๊ธฐ ํ ๋จ๊ณ์ ๋ฌธ์ ๊ฐ proc ๋งคํฌ๋ก ์ด์ผ๊ธฐ์์ด ์์ ๋ถ๋ถ์๋ ์ํฅ์ ๋ฏธ์น๋ค๊ณ ์๊ฐํ๋ฏ๋ก ํด๊ฒฐ ๋ ๋ฌธ์ ๋ฅผ๋ณด๊ณ ์ถ์ต๋๋ค.
@alexcrichton rustc_copy_clone_marker
๋ฐ ๊ธฐํ rustc_attrs
๊ฐ ์ฌ์ ํ ์ฐ๋ฆฌ๋ฅผ ๋ฌผ๊ณ ์์ต๋๋ค. https://github.com/serde-rs/serde/issues/577์ ์ฐธ์กฐ
#[derive(Copy, Clone)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub struct MyStruct {
value: i64,
}
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฃผ๋ฌธ์ ๋ฐ๊พธ๋ ๊ฒ์ด์ง๋ง์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋์ง ํ์ธํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
#[derive(Copy, Clone)]
pub struct MyStruct {
value: i64,
}
https://github.com/sfackler/rust-postgres-derive ๋ฅผ ๋งคํฌ๋ก 1.1๋ก ์ด์ํ๋ ์์ ์ ๋ง์ณค์ต๋๋ค. ์๋์ ์ผ๋ก ๊ณ ํต์ค๋ฝ์ง ์์์ง๋ง ๋ค์ค ํ์์์ ์ฝ์ ์์ฑ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ํฐ ๊ณ ํต์ ๋๋ค. Serde๋ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฒช์์ง๋ง ๋์์ ๋ ํ์๋ฌผ์ ํ์ฅํ๋ ค๋ฉด ์ด์ํ ๋ ผ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. https://github.com/sfackler/rust-postgres-derive/blob/master/postgres-derive-internals/ src / lib.rs # L26
์์ ํ๋ฅผ ๋ง์์๋ ์๋์ง๋ง ์ ์ ์ธก๋ฉด์์๋ ๊ณง ๋ค๋ฃจ์ด์ผ ํ ์๋์ ์ผ๋ก ํฐ ์ธ์ฒด ๊ณตํ์ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
quote
0.3.0 ์ ์ถ์ํ์ต๋๋ค. ๋ฉ์ง macro_rules!
์คํ์ผ ๋ฐ๋ณต์ ์ง์ํฉ๋๋ค ( ๋์ง์ ๋ํด
pub fn enum_body(name: &str, variants: &[Variant]) -> Tokens {
let num_variants = variants.len();
let variant_names = variants.iter().map(|v| &v.name);
quote! {
if type_.name() != #name {
return false;
}
match *type_.kind() {
::postgres::types::Kind::Enum(ref variants) => {
if variants.len() != #num_variants {
return false;
}
variants.iter().all(|v| {
match &**v {
#( // \
#variant_names => true, // |----- new feature
)* // /
_ => false,
}
})
}
_ => false,
}
}
}
๊ถ๊ธํฉ๋๋ค. ์ #
๊ฐ ์๋ $
#
$
์
๋๊น?
ํธ์ง : ํญ์ ์ธ์ฉ ๊ตฌ๋ฌธ์ด ${...}
๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ๋ช ๋
์ด ์ง๋ฌ๋๋ผ๋ ES6 ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ๋๋ฌด ์ง์ฐฉํ์ ์ ์์ต๋๋ค. \{...}
๋ ์๋ํ์ง๋ง ๋ค๋ฅธ ๊ณณ์์๋ ์ ์ฉํฉ๋๋ค.
๊ดํธ๋ ์ฐพ๊ธฐ ์ด๋ ค์ด ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ๊ฑฑ์ ํ ํ์๋ ์์ต๋๋ค.
๊ถ๊ธํฉ๋๋ค. ์
#
๊ฐ ์๋$
#
$
์ ๋๊น?
๊ทธ๊ฒ์ macro_rules ๋งคํฌ๋ก์ด๊ณ ๋ด๊ฐ ์ํ๋ ๊ฒ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ : smile :. $v
๋ ๋จ์ผ ํ ํฐ์ผ๋ก ์ผ์น๋๋ฉฐ $v
์์ v
๋ณ์๋ฅผ ์ฌ์ฉํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋์กฐ์ ์ผ๋ก #v
๋ ๋ ๊ฐ์ ํ ํฐ์ด๋ฏ๋ก ๊ฐ๋ณ์ ์ผ๋ก ์ผ์น์ํค๊ณ ident๋ก ์์
์ ์ํ ํ ์ ์์ต๋๋ค.
macro_rules! demo {
($tt:tt) => {};
}
fn main() {
demo!($v);
}
์ด ๋ชจ๋ ๊ฒ์ด macro_rules
์์ ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ญ์์ค.?! Forgot macros 1.1์ ์ ์ ๋์ ํ์ ์ ์ฉ์ด์์ต๋๋ค. ์ฆ, $x
ํ ํฐ ํ๋๊ฐ IMO์ ์ค๊ณ ๊ฒฐํจ์
๋๋ค. cc @jseyfried
๋ฟก๋ฟก
@alexcrichton rustc_copy_clone_marker์ ๋ค๋ฅธ rustc_attrs๋ ์ฌ์ ํ ์ฐ๋ฆฌ๋ฅผ ๋ฌผ๊ณ ์์ต๋๋ค. serde-rs / serde # 577์ ์ฐธ์กฐํ์ญ์์ค.
์ค ์ด๋ฐ, ์ ์ข์ ๊ฒ ๊ฐ๋ค์! ์๋จ์ ๋ชฉ๋ก์ ์
๋ฐ์ดํธํ๊ฒ ์ต๋๋ค. @nrc ๋๋ @jseyfried ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ์ด๋ป๊ฒ ํด๊ฒฐํ ์ ์๋์ง์ ๋ํ ์๊ฐ? ๋๋ ๋ชจ๋ ๊ฒ์ ํ์ฅ ์์์ ๋๋ฌด ์ต์ํ์ง ์์ง๋ง #[derive]
์์ฑ ํ๋๊ฐ ํ์ฅ ๋ ๋ ๋ฏธ๋์ ๋ชจ๋ ์์ฑ์ ๋ถํ๋ ค์ ๋จผ์ ํ ์ ์์ต๋๊น?
๋ฟก๋ฟก
๋ค์ค ํ์์์ ์ฝ์ ์์ฑ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์์ฒญ๋ ๊ณ ํต์ ๋๋ค.
๋น์ ์ด ์ฐ๊ฒฐ ํ ์์ ๋ฅผ ๋ฐ๋๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
@alexcrichton ์๋ฅผ ๋ค์ด
#[derive(ToSql, FromSql)]
enum Foo {
#[postgres(name = "bar")]
Bar
}
#[postgres]
์์ฑ์ ToSql
๋ฐ FromSql
๊ตฌํ์ด ์์ฑ๋๋ ๋ฐฉ์์ ์กฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ ค์ง์ง ์์ ์์ฑ์ด๊ธฐ ๋๋ฌธ์ ์ต์ข
์ถ๋ ฅ ์ ์ ์ ๊ฑฐํด์ผํ์ง๋ง ToSql
๋ฐ FromSql
๊ตฌํ์ ๋ณ๋๋ก ์คํ๋ฉ๋๋ค. ๊ตฌํ์ ์์ฑํ๊ณ ์์ฑ์ ์ ๊ฑฐํ์ฌ ์์งํ ๋ฐฉ์์ผ๋ก ์ํํ๋ฉด ๋ ๋ฒ์งธ ํ์์์ ์ฌ์ฉ์ ์ ์๊ฐ ๋๋ฝ๋ฉ๋๋ค.
๋ ํ์ ๋ impls ๋ชจ๋์ ๋ํ ๊ตฌํ์ ํ ๋ฒ์ ๋ชจ๋ ์์ฑํ๋ ๋์ผํ ํจ์๋ก ์ ๋ฌํจ์ผ๋ก์จ ์ง๊ธ ๋ฐ๋ก serde-derive ๋ฐ postgres-derive ํดํน. ์ปดํ์ผ๋ฌ๊ฐ์ด๋ฅผ ์ ๊ฑฐํ๊ธฐ ๋๋ฌธ์ ํ์ฌ ํธ์ถ๋๊ณ ์๋ #[derive]
๋ฅผ ๋ค์ ์ฐ๊ฒฐ ํ ๋ค์ ํ์ฅ๋๋๋ก ๋ณด๋ด์ผํฉ๋๋ค. https://github.com/sfackler/rust-postgres-derive/blob /master/postgres-derive/src/lib.rs#L18
@sfackler ๋๋ _think_ ๋์ผํ ๊ตฌํ ์๋ก๋ถํฐ ํ์ ๋ ๊ฒ์ด ์์ ๋๋ง ์ฌ๋ถ์ ์์ฑ์ ์ ๊ฑฐํจ์ผ๋ก์จ์ด๋ฅผ ์ํ ํ ์๋ ์์ต๋๋ค. ๋น์ ์ ๋ฐฉ๋ฒ์ด ๋ ๋์ ์๋ ์์ต๋๋ค _shrug_.
@sfackler ์ ์ข์, ์๋ฒฝํ๊ฒ ์ดํด๋ฉ๋๋ค. ๊ฐ์ฌ!
๊ทธ๋๋ ๊ทธ ๋
ผ๋ฆฌ๊ฐ ๊นจ์ง๊ธฐ ์ฌ์ด ์ง ๊ถ๊ธํฉ๋๋ค. ์๋ฅผ ๋ค์ด ToSql
ํ์ฅํ๋ ๊ฒฝ์ฐ FromSql
์ ํฅํ ํ์ฅ์ ์ด๋ป๊ฒ ๊ฐ์ง๋ฉ๋๊น? ์์์ ์ธ๊ธ ํ @dtolnay ์ ๊ฐ์ #[cfg]
๋ค์์์ ์ ์์ต๋๋ค. ๊ทธ๋์ ๋ชจ๋ ๊ฒฝ์ฐ์ ํ์ง๊ฐ ๋ถ๊ฐ๋ฅํ ์ ์์ต๋๊น?
@alexcrichton ์, ๋ถ์์ง๊ธฐ ์ฌ์ฐ๋ฏ๋ก ์ค์ ์๋ฃจ์ ์ด ์ค์ํด ๋ณด์ ๋๋ค.
#[cfg]
๋ฐ #[cfg_attr]
๊ฐ ํ์๋๊ธฐ ์ ์ ์ฒ๋ฆฌ๋์ง ์์ต๋๊น?
๋งคํฌ๋ก 1.1 api๋ ๋ฌธ์์ด์์ ์๋ํ๋ฏ๋ก ์ธ ๊ฐ์ง ์๋ฃจ์ ๋ง ์์ํ ์ ์์ต๋๋ค.
๊ฐ ์ต์
์๋ ์ฅ๋จ์ ์ด ์์ต๋๋ค.
๋จ์ 1 : ๋น๋ถ๊ฐ ์ทจ์ฑ ํด๊ฒฐ ๋ฐฉ๋ฒ
๋จ์ 2 : ์ผ๋ถ ์ฌ์ฉํ์ง ์๋ ์์ฑ์ด ๊ฐ์ง๋์ง ์์
๋จ์ 3 : ์ค๊ฐ ์๋ฃจ์
์์ํ ๋ ๋ง์ API ํ๋ฉด
์์ฑ์ ์ ์งํ๊ณ ๋์์ ํ์ดํธ๋ฆฌ์คํธ์ ์ถ๊ฐํ๊ธฐ ์ํด #[used(...)]
์ ์์ฑ์ ๋ํํ๋ ๊ฒ์ ๊ณ ๋ คํ์ง๋ง, ๊ฝค ์ด๋ฆฌ ์๊ณ ๋ถ์์ ํฉ๋๋ค.
ํํ
ํ๋์
#[derive]
์์ฑ์ด ํ์ฅ๋๋ฉด ๋ฏธ๋์ ๋ชจ๋ ์์ฑ์ ๋ถ ํ๋ฆด ์ ์์ต๋๋ค.
์ด ์์ด๋์ด๊ฐ ์ข์์. #[cfg]
s ๋ฐ #[cfg_attr]
s๋ #[derive]
s ์ ์ ์ฒ๋ฆฌ๋๋ฏ๋ก #[cfg]
-guarded #[derive]
s๋์ด ์ ๊ทผ ๋ฐฉ์์ ๋ฌธ์ ๊ฐ๋์ง ์์ต๋๋ค. (๋๋ ์์ฑ ์ ๊ฑฐ ๋ฌธ์ ์ ๋ํ @sfackler ์ ์ ์ฌํ ์๋ฃจ์
).
์ด ์ ๊ทผ ๋ฐฉ์์ @sfackler ์ ์๋ฃจ์ ์ ์ฝ๊ฐ ๋ ๊ฐ๋จํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ๋ค๋ฅธ ๊ด๋ จ ํ์๋ฌผ ์ด ๋ง์ง๋ง ์์ฑ์๋ง์์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค ( ์ ์ ์ด ์ผ์ ๋จ์ํ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค).
์ ์ด ์์ฑ ๋ฌธ์ ์ ๋ํ ํ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ syntex์ ๋ค์ ์ ์ฌํ post-expansion ์ฝ๋ฐฑ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค : https://github.com/sfackler/rust-postgres-derive/blob/master/postgres-derive-codegen/src/lib. rs # L23 ~ L50
ํ์ impl์ ๋ ๋ฆฝ์ ์ด๊ณ ์ ์ด ์์ฑ์ ์ ๊ฑฐํ์ง ์์ ์ ์์ผ๋ฉฐ ์ ๋ฆฌ๋ฅผ ์ํด ๋ชจ๋ ํ์ฅ์ด ์๋ฃ๋ ํ ์คํ๋๋ ํจ์ค๋ฅผ ๋ฑ๋ก ํ ์ ์์ต๋๋ค.
๋์ ค๋ ์๋์ผ๋ก์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์์ต๋๋ค. https://github.com/diesel-rs/diesel/blob/master/diesel_codegen/src/lib.rs#L101 -L112
@dtolnay ์ด์ ๋ฌธ์ ์ฌ๋ฌ ์ฝ #[derive]
์์ฑ์ํด์ผํ๋ค ๊ณง ๊ณ ์ @jseyfried์ ๊ฐ์ฌ๋ฅผ
๋๋ syn
๋ฐ quote
ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ ์ด๊ฒ์ ๊ฐ์ง๊ณ ๋์๊ณ ์ ๋ง ๊ธ์ ์ ์ธ ๊ฒฝํ์ํ์ต๋๋ค. ์ด๊ฒ์ ์์ ํ ๋ ๋ ํฐ ๊ธฐ๋ฅ์ด ๋ ๊ฒ์
๋๋ค.
์์ฑ ๋ฌธ์ ๋ ํ์ฌ serde
ํ์ ๋
ผ๋ฆฌ์ ๋ค์ด ์คํธ๋ฆผ ์ธ ๋ด impl์ ๋ฌผ๊ณ ์์ต๋๋ค.
ํ์ ์ฝ๋์์ ์ฌ์ฉ๋์ง ์๋ ์์ฑ์ ๋ฌด์ํ๊ฑฐ๋ ์ ๊ท ํ์ ํ ์คํ๋๋ ๋ฆ์ ํ์ฅ์ด์ด๋ฅผ ์ ๊ฑฐํ๋๋ก ํ์ฉํ๋ ๊ฒ์ ๋์๊ฒ ํฉ๋ฆฌ์ ์ธ ํด๊ฒฐ์ฑ ์ฒ๋ผ ๋ณด์ ๋๋ค.
๋งคํฌ๋ก์ ์๋ ํ ํฐ ์คํธ๋ฆผ์ ๋ณ๊ฒฝํ ์์๋ ์ต์ ์ด ์๋ค๋ฉด ์ด์์ ์ผ ๊ฒ์ ๋๋ค. ์ง๊ธ๊ณผ ๋งคํฌ๋ก 2.0 ์ฌ์ด์ ์ผ์์์ ์์กด ํ ์์๋ ์ํํ ๊ธฐ๋ฅ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ๋์ค์ ์ ๊ฑฐํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
๊ทธ๋์ ์ ๋ค๋ฆญ ํจ์ ๋ด๋ถ์ ์ ํ ๊ฒฝ๋ก์ ์ธ๋ฏธ์ฝ๋ก ์ด ๋๋ฝ๋์ด rustc์์ ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ ๋ฉ์์ง๊ฐ ํ์๋์์ต๋๋ค. ์ด๋ค ํ์ ๋งคํฌ๋ก๊ฐ lex ์ค๋ฅ๋ฅผ ์ผ์ผ์ผฐ๋์ง, ์ด๋ค ํ ํฐ์ด ์ค๋ฅ๋ฅผ ์ผ์ผ์ผฐ๋์ง ๋ฑ๊ณผ ๊ฐ์ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ๊ณต ํ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
error: custom derive attribute panicked
--> src/simple.rs:69:1
|
69 | struct C(u64);
| ^^^^^^^^^^^^^^
|
= help: message: Failure parsing derived impl: LexError { _inner: () }
LexError์ ๋ํ ํ ์คํธ ์ผ์ด์ค๋ฅผ ๋ง๋ค์๋๋ฐ 10 ์ 13 ์ผ ๋ฐค๋ง๋ค ๋ฐ์ํ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค (rustup์๋ ์ ๋ฐ์ดํธ๊ฐ ์์) https://github.com/keeperofdakeys/proc_macro_derive_test.
@ rust-lang / lang ํ์ ํญ๋ชฉ์ด ์ฃผ์์ด ๋ฌ๋ฆฐ ํญ๋ชฉ์ ์์ ํ ์ ์๋์ง ์ฌ๋ถ์ ๋ํด ๋ ผ์ํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ฅผ ํ์ฉํ๋ ๊ฐ๋จํ ์๋ฃจ์ ์ด์ง๋ง ์ฌ์ฉ์์ ๊ธฐ๋์ ์ด๊ธ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฉฐ ์๋นํ ์ธ๊ธฐ๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ์ฌ์ ํ ํ์ฌ์ ์๋ฃจ์ ์ ์ ํธํฉ๋๋ค. ๋จ์ํจ์ด ์ข๊ณ ์ ์ ๋ ๋์ ์ค ์ด๋ ๊ฒ๋ ์ ์๊ฒ ๋ ๋์ ๊ฒ์ ์์ต๋๋ค.
ํญ๋ชฉ์ ์์ ํ ์์๋ ๊ฒฝ์ฐ ์์ฑ์ ์ ์ดํ๊ธฐ์ํ ๋ช ๊ฐ์ง ์๋ฃจ์ ์ด ํ์ํฉ๋๋ค. ๋๋ (๋ฏธ๋์) ๋น ํ์ ์์ฑ ๋งคํฌ๋ก๊ฐ ํ ์์๋ ํ, ํญ๋ชฉ์ ์์ ํ๋ ํ์ ๋ฅ๋ ฅ์ ์ ์งํ๋ ๊ฒ์ ๋ํด ํน๋ณํ ๊ฐํ๊ฒ ๋๋ผ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๊ตฐ๊ฐ "์์ "์ ์ ์ํด์ผํฉ๋๋ค. ๊ตฌ์กฐ์ฒด์ ๋ฉค๋ฒ๋ฅผ ์์ ํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๊น, ์๋๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ์๋ ค์ง์ง ์์ ์์ฑ์ ๋ํด ๋ถํํ์ง ์๋๋ก ์์ฑ์ ์ ๊ฑฐํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๊น?
๊ตฌ์กฐ์ฒด์ ๋ฉค๋ฒ๋ฅผ ์์ ํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๋ ๊ฒฝ์ฐ, ์ ์๊ฐ์ ๊ฐ์ฅ ์ข์ ํด๊ฒฐ์ฑ ์ ๋ค๋ฅธ ๋ชจ๋ ๊ตฌ์กฐ์ฒด๋ณด๋ค ๋จผ์ ํ์ฅ๋๋ ๊ฐ ๊ตฌ์กฐ์ฒด์์ ํ๋์ ๊ตฌ์กฐ์ฒด ์์ ๋งคํฌ๋ก ๋ง ํ์ฉํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ์ ์ ์๋๊ณ (๋ด ์๊ฒฌ์ผ๋ก๋) ์์๋๋ ํ๋์ ๊ฐ์ง ๊ฒ์ ๋๋ค.
์์ฑ ์ ๊ฑฐ์ ๋ํด์๋ง ์ด์ผ๊ธฐํ๋ ๊ฒฝ์ฐ ๋งคํฌ๋ก์ ์ฌ๋์ ๋งก๊ธฐ์ง ์๊ณ ๋งคํฌ๋ก ๋ฉ์ปค๋์ฆ ์์ฒด์ ์์ฑ์ ํตํฉํ๋ ๋ฐฉ๋ฒ์ด์์ ๊ฒ์ ๋๋ค.
ํ์์ด ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๋ํ ๋ด ์ง๊ฐ์ impls๋ฅผ ์ถ๊ฐํ๋ค๋ ๊ฒ์ ๋๋ค. ์ต์ข ์ฌ์ฉ์์๊ฒ ํ์๋ฌผ์ impls๋ฅผ ์ถ๊ฐํ๊ณ ๋ค๋ฅธ ์์ ์ ์ํํ์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ํนํ, ๋ค๋ฅธ ๋ ๋ผ์ด๋ฒ์๊ฒ ์ค์ํ ๋ฐฉ์์ผ๋ก ๊ตฌ์กฐ์ฒด๋ฅผ ์์ ํด์๋ ์๋๋ฏ๋ก ์์์ ๋ ๋ฆฝ์ ์ด์ด์ผํฉ๋๋ค. ์ด๊ฒ์ด ํ์๋ฌผ์ด ์ด๋ป๊ฒ ์๋ํด์ผ ํ๋๊ฐ์ ๋์ํฉ๋๊น, ์๋๋ฉด ํ์๋ฌผ์ด ๋ถ์ฐฉ ๋ ์ ํ์ ๋ํด ๋ณํ์ ์ํ ํ ์ ์์ด์ผํ๋ค๊ณ ์ฌ๋๋ค์ด ์๊ฐํฉ๋๊น?
์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ๋์ํ๋ค๋ฉด, ์ง๋ฌธ์-์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ์ํํ๊ธฐ ์ํด ์ฐ๋ฆฌ๊ฐ ๋ ธ์ถํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ํฉ๋๊น, ์๋๋ฉด ์ด๊ฒ์ ์ํ ํ ์์ฑ์๋ฅผ ์ ๋ํ๊ธฐ ์ํด ๊ทธ๊ฒ์ ๋จ๊ฒจ๋๊ณ ์ถ์ต๋๊น? ์ฌ๊ธฐ์๋ ๋ ๊ฐ์ง ์์ ๋ฌธ์ ๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
serde
๋ฐ deisel
์ (๋ฅผ) ์ด๋ฌํ ์ ์ฝ ์กฐ๊ฑด์ผ๋ก ์์
ํ๋ ๊ฒ์ ๋ง์ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํฉ๋๋ค.๋ฌผ๋ก ๋ค๋ฅธ ์์ฑ์ด ๊ตฌ์กฐ์ฒด๋ฅผ ์์ ํ๋ ๋ฐฉ๋ฒ์ ํ์, ํนํ ๋์ํด์ผํ๋ ๋ฐฉ๋ฒ๊ณผ ๊ด๋ จ์ด์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
์ฃผ์์ด ๋ฌ๋ฆฐ ํญ๋ชฉ์ ์ ๊ฑฐ ํ ์์๋ ๊ธฐ๋ฅ์ ํตํด ํ์ฌ ์์คํ ์ด ๊ทธ๋ ์ง ์์ผ๋ฉด ์ํ ํ ์์๋ ๋ง์ ์ญํ ์ ์ฑ์ธ ์ ์์ต๋๋ค.
@sgrif deisel์ด ํ์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์ธํ
@withoutboats ๊ทธ๊ฒ์ 90 %๋ ๋น์ ์ด ๊ธฐ๋ํ๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ์ฉ์๊ฐ ์ ๊ณต ํ ํญ๋ชฉ์ ๋ง์ง์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์์คํ ์ ๋งคํฌ๋ก๋ฅผ ํดํนํ๊ธฐ ์ํด ์ฃผ์์ด ๋ฌ๋ฆฐ ํญ๋ชฉ์ ์ ๊ฑฐํฉ๋๋ค. https://github.com/diesel-rs/diesel/blob/master/diesel/src/macros/macros_from_codegen.rs#L12 -L18. ๊ทธ ์ธ์๋ ์ ๋ ฅ ํ ํฐ ์คํธ๋ฆผ์์ ์๋ฌด๊ฒ๋ ๋ง์ง๋ ์ ์ผํ ์๊ฐ์ ์ฃผ์์ ์ ๊ฑฐํ๋ ๊ฒ์ ๋๋ค. https://github.com/diesel-rs/diesel/blob/master/diesel_codegen/src/lib.rs#L109 -L120
@sgrif ๋๋ ๋ํ ์ ์ฐจ ์ ๋ฑ ๋งคํฌ๋ก๋ฅผ ์ป๊ธฐ ์ํด ์ปค์คํ ํ์์ ๋จ์ฉํ์ต๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ๋งคํฌ๋ก 1.1์ ์ ์ฐจ ์ ๋ฑ ๋งคํฌ๋ก ์์คํ ์ด์์ด์์ด ๊ธฐ๋ฅ์ ๋๋ฌด ๋ง์ด ๋จ์ฉํ์ง ์๋๋กํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ๋ด๊ฐ ์ทจํ ์์๋ ์ข์ ๊ธธ์ ๊ฑฐ์ ๋์ผํ ์ ์ฐจ ์ ๋ฑ ๋งคํฌ๋ก ์คํ ๋ฆฌ๊ฐ ์งํ๋๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค (๋งคํฌ๋ก์ ์ ๋ฌ ๋ TokenStream์ ์กด์ฌํ์ง ์๋ ๋ชจ๋ ์๋ณ์๊ฐ ์์์ผ๋ก ์จ๊ฒจ์ ธ์๋ ๊ฒ๊ณผ ๊ฐ์ด ์์ด ๋ฌด๊ฒ์ง๋ง ๊ฐ๋จํ ์์์ด์์ ์ ์์ต๋๋ค.) ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง ์ ํํ ์์ง ๋ชปํจ) ์ปค์คํ ํ์์ ๋จ์ฉํ๋ ๋์ ์ฌ์ฉํ๊ณ ์ปค์คํ ํ์์ด ๊ทธ๊ฒ์ด์๋ ๊ตฌ์กฐ์ฒด๋ฅผ ์์ ํ ์ ์๋๋ก ๋ง๋์ญ์์ค. ๊ทธ๋ ๊ฒํ๋ฉด ๋ ๋ง์ ์์๋ฅผ ์ฌ์ฉํ ์ ์๊ณ UX๋ฅผ ๊ฐ์ ํ๋ฉฐ ๋์ถ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ํ์์ ๊ฐ๋จํ ๋งคํฌ๋ก๋ก ์ ์งํ๋ ์ฃผ์ฅ์ ์ดํดํ ์ ์์ต๋๋ค.
๋ด ๊ด์ ์ Macros 1.1์ ๋ชฉํ๋ ๊ฐ๋ฅํ ํ ๋ง์ ์๊ตฌ๋ฅผ ์ถฉ์กฑ ํ ์ ์๋๋ก ์ต๋ํ ์ ์ฐํ๊ณ ์ ์ง ๊ด๋ฆฌ ๋ถ๋ด์ด ์ ์ด ์ ์ํ๊ฒ ์์ ํ๋๊ณ ๋งคํฌ๋ก 2.0๊น์ง ์์ ๋ฐฉํธ ์ญํ ์ํ๋ ๊ฒ์ ๋๋ค. ํ์ฌ ๋์์ธ์ ์ ์๊ฐ์ ๊ทธ ์ญํ ์ ๋งค์ฐ ์ ๋ง์ต๋๋ค.
์ด ์ญํ ์ ์๊ตฌ์ ์ผ๋ก ์ฑ์ธ ์์๋ ๋ฌด์ธ๊ฐ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๋ค๋ฉด, ๋๋ ๊ทธ๊ฒ์ ํจ์ฌ ๋ ๋ฐ๋ ํ ๊ฒ์ ๋๋ค.
๋ด๊ฐ ํ๋ ธ์ ์๋ ์์ง๋ง RFC๋ฅผ ์ฝ์ ๊ฒ์ ์ด๊ฒ์ด ์๊ตฌ์ ์ผ๋ก ํ์๋๋ ํ๋์ ๊ธฐ์ด๊ฐ ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์
๋๋ค. ์ฆ, ์์ผ๋ก TokenStream
์ ๋ ๋ง์ ๋ฉ์๋๊ฐ ์ถ๊ฐ ๋ ์์ ์ด์ง๋ง ํ์ ๋งคํฌ๋ก๋์ด API๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ ์ฃผ์์ด ๋ฌ๋ฆฐ ํญ๋ชฉ์์ ์์์ ๋ณํ์ ์ํ ํ ์ ์์ต๋๋ค (์ด ๊ธฐ๋ฅ์ deisel์ ์ฌ์ฉ ์ฌ๋ก์ ํ์ํจ). ).
๋๋ ํ์๋ฌผ์ด ์ด๊ฒ์ ์๊ตฌ์ ์ผ๋ก ํ์ฉํ๋ ๊ฒ์ ๋ํด ๊ฝค ๋ถ์ ์ ์ผ๋ก ๋๋๋๋ค. ์์ผ๋ก ์ธ์ ๊ฐ๋ macro_rules
๋งคํฌ๋ก์ ํจ๊ป ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ์์คํ
์ด๊ณ ๋งคํฌ๋ก 2.0์์๋ ๋ ์ ํ์ ์ธ ๋ค๋ฅธ ํ์ API๊ฐ ์ ํธ๋๋ค๋ ์ฌ์ค์ ์๋ฝํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ ํธ์ํฉ๋๋ค.
์๋๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ฌด์์ด๋ ํ ์์๋ ํธ๋์คํฌ๋จธ๋ก ์ง์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์ฑ์ ์
๋ ฅ์ด์๋ ๊ฐ๋จํ ๋ฐ์ฝ๋ ์ดํฐ๋ก ๋
ธ์ถ๋๋๋ก ์ ๋ํฉ๋๋ค.
@withoutboats : serde๋ impls๊ฐ ์์ฑ๋๋ ๋ฐฉ์์ ์์ ํ๊ธฐ ์ํด ๋ง์ ์์ฑ ์ ์ง์ํฉ๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๋ค์ ์ฒ๋ฆฌ ํ ํ์ ๊ทธ๊ฒ๋ค์ ์ ๊ฑฐํ๊ฑฐ๋ ๋ฌด์ํ ์์๋ ๋ฅ๋ ฅ์ด ํ์คํ ํ์ํฉ๋๋ค. ๊ทธ๊ฒ์ด ๋์์ด๋๋ค๋ฉด, ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ๊ฐ ์ง์ ํ๊ณ ์ํ๋ ๋์ ์ ๊ฑฐํด์ผํ๋ ์์ฑ ๋ชฉ๋ก์ ์ปดํ์ผ๋ฌ์ ์ด๋ป๊ฒ ๋ ์ ๊ณต ํ ์ ์์ต๋๋ค.
@eddyb ๋๋
@erickt ๋ง์. ์ฅ๊ธฐ์ ์ผ๋ก ์ด์์ ์ธ ์๋ฃจ์ ์ ํด๋น ์์ฑ์ ์ ๊ฑฐํ๋ ์ฑ ์์ด์๋ deriver ๋์ no-op ์ฌ์ฉ์ ์ง์ ์์ฑ์ผ๋ก ๋ฑ๋กํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋จ๊ธฐ์ ์ผ๋ก๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ฅ๊ธฐ์ ์ผ๋ก ์ด์์ ์ธ ์๋ฃจ์ ์ ํด๋น ์์ฑ์ ์ ๊ฑฐํ๋ ์ฑ ์์ด์๋ deriver ๋์ no-op ์ฌ์ฉ์ ์ง์ ์์ฑ์ผ๋ก ๋ฑ๋กํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋จ๊ธฐ์ ์ผ๋ก๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๋จ๊ธฐ์ ์ผ๋ก์ด๋ฅผ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ์ปดํ์ผ๋ฌ ๋ด๋ถ์ ์ต์ํ์ง ์์ง๋ง ์ฌ์ฉ์ ์ง์ ํ์ ํ๋ฌ๊ทธ์ธ์ด ์ ๊ฑฐํ๋ ค๋ ์ฌ์ฉ์ ์ง์ ํน์ฑ ๋ชฉ๋ก์ ํ์ ํ ๋ค์ ํด๋น ํน์ฑ์ ๋ํ ๋ค๋ฅธ ๋ณํ์ ๊ฑฐ๋ถ ํ ์ ์์ต๋๋ค. ์ค๋ฆฌ์ง๋ ์์ดํ ?
๋ํ Diesel์ ํ๋์ ์ด๋ฆ์ผ๋ก ๋ชจ๋ ์ฌ์ฉ์ ์ ์ ์์ฑ์ ๊ฐ๋ Serde์ ์ ๊ทผ ๋ฐฉ์์ ๋ฐ๋ฅด์ง ์๋๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค (์ : Diesel์ #[table_name = "name"]
์ ๋ฌ๋ฆฌ #[serde(rename = "name")]
). ๋จ์ผ ์ฌ์ฉ์ ์ ์ ์์ฑ ์ด๋ฆ ๋ง ์์ผ๋ฉด ๊ตฌํ์ด ๋จ์ํ๋ฉ๋๊น? ๋ชฉ๋ก ๋์ ๋ฑ๋ก ๋์์ต๋๊น?
์ ์ด ์์ฑ ๋ฌธ์ ์ ๋ํ ํ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ syntex์ ๋ค์ ์ ์ฌํ post-expansion ์ฝ๋ฐฑ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค : https://github.com/sfackler/rust-postgres-derive/blob/master/postgres-derive-codegen/src/lib. rs # L23 ~ L50
ํ์ impl์ ๋ ๋ฆฝ์ ์ด๊ณ ์ ์ด ์์ฑ์ ์ ๊ฑฐํ์ง ์์ ์ ์์ผ๋ฉฐ ์ ๋ฆฌ๋ฅผ ์ํด ๋ชจ๋ ํ์ฅ์ด ์๋ฃ๋ ํ ์คํ๋๋ ํจ์ค๋ฅผ ๋ฑ๋ก ํ ์ ์์ต๋๋ค.
post-expansion
์์ ๋งคํฌ๋ก 1.1์ ๋ํ ํ์ฅ ํ ์ฝ๋ฐฑ์ ๊ตฌํํ์ต๋๋ค. ํ์ impl์ ์ ์ด ์์ฑ์ ์ ๊ฑฐํ์ง ์๊ณ ๋
๋ฆฝ์ ์ผ ์ ์์ผ๋ฉฐ, ์์ฑ์ ์ ๊ฑฐํ๊ธฐ ์ํด ๋ชจ๋ ํ์ฅ์ด ์๋ฃ๋ ํ ์คํ๋๋ ํจ์ค๋ฅผ ๋ฑ๋ก ํ ์ ์์ต๋๋ค.
์ค๋ lang ํ ํ์์์ ์์ / ์ฃผ๋ฌธ ๋ฌธ์ ์ ๋ํด ๋ ผ์ํ์ต๋๋ค. ์ฌ์ฉ์์ ๊ธฐ๋์ ๋ถ์ํ๊ณ ๋จ์ํจ์ ์ํ์ต๋๋ค (๋์์ธ ์ธก๋ฉด์์ ๋๋ฌด ๋ง์ ํดํน์ด ๊ฒน์น์ง ์๊ณ ํด๋ / ๋๋ฒ๊ทธํ๊ธฐ ์ด๋ ค์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์). ๋์ ๋ฐ์ดํฐ์ ์์ ์ ๋๋์ง ๋ง ์์ ํ์ง ์๋ค๋ ์ ์ ์ฃผ๋ชฉํ์ต๋๋ค. ๋ํ ์ฐ๋ฆฌ๋ ๋๊ธฐ๊ฐ ์ข์ ์ด์ ๊ฐ ์๋๋ผ ๊ทธ ์์ฒด๋ฅผ ์ํด ์๊ฒฐ์ ์ถ๊ตฌ ํ ์๋ ์๋ค๊ณ ๋๊ผ์ต๋๋ค.
๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ ์์ค๋ฅผ ์์ ํ์ง ์๋ ํ์๋ฌผ์ด ์๋ง๋ ๋ ์ข์ ๊ฒ์ด๋ผ๊ณ ๊ฒฐ์ ํ๊ณ ๊ทธ ๋ชจ๋ธ๋ก ๋ณ๊ฒฝํด์ผํฉ๋๋ค. ์ด๋ FCP ๊ธฐ๊ฐ ์ฐ์ฅ์ ์๋ฏธ ํ ์ ์์ต๋๋ค. ์คํธ๋ฆฌํ ์์ฑ์ ์ฒ๋ฆฌํ๊ธฐ์ํ ํน๋ณํ ๋ฉ์ปค๋์ฆ์ด ์์ด์ผํ๋ค๊ณ ์๊ฐํ์ง ์์์ต๋๋ค. ์คํ๋ ค ์ปดํ์ผ๋ฌ๊ฐ ์์ฑ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๋งคํฌ๋ก๊ฐ ์ฌ์ฉํ๋ ์์ฑ์ด ํ๋ก๊ทธ๋จ์ ๋จ์ ์๋๋ก ํ์ฉํด์ผํฉ๋๋ค. RFC 1755 ๋์ด๋ฅผ ๊ณ ๋ คํด์ผํฉ๋๋ค.
์ด๋ก ์ธํด ์ผ๋ถ ์ฌ์ฉ์ ์ง์ ํ์ ์ฌ์ฉ์์ ์์ ํ๊ฐ ์ง์ฐ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ถ๋ถ์ ํ์๋ฌผ ์ฌ์ฉ (ํนํ ์ฌ์ฉ์๋ฅผ ์์ ์ ์ธ ๋๊ตฌ ์ฒด์ธ์์ ๋ฒ์ด๋๊ฒํ๋ ๊ฒฝ์ฐ)์ ์์ฑ์ ์ฌ์ฉํ์ง ์๋๋ค๊ณ ์๊ฐํ๋ฏ๋ก ์๋ฅผ ๋ค์ด ๋๋ถ๋ถ์ Serde ์ฌ์ฉ์๋ ๊ณง ์์ ์ ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค. ์์ฑ์ด ํ์ํ ๊ฒฝ์ฐ ๋ช์ฃผ๊ธฐ๊ฐ ๋ ์ค๋ ๊ฑธ๋ฆฌ์ง ๋ง ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์๋ ์ํฅ์์ฃผ์ง ์์ต๋๋ค _.
cc @alexcrichton , @dtolnay , @sgrif , @erickt- ์๊ฐ?
์์ฑ์ ์๋ง๋ ๋น์ ์ด ์ ์ํ๋ ๊ฒ๋ณด๋ค Serde์ Diesel์์ ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ๋ด ๊ฒฝํ์ Serde๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ํ๋ก๊ทธ๋จ์ด ์์ฑ์ ์ฌ์ฉํ๋ค๊ณ ํ์ ํฉ๋๋ค. Diesel์ ์ฌ์ฉํ๋ฉด ํ์คํ ์์ฑ์ ์ฌ์ฉํ๋ฉฐ, ์ด๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ด ๊ตฌ์กฐ์ฒด์ ๋งคํ๋๋์ง diesel_codegen์ ์๋ฆฌ๊ธฐ ์ํด ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฆ, ์ฌ์ฉ์ ์ง์ ํ์ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ณํํ์ง ์๋ ๊ฒ์ด ๋์๊ฒ ์ฌ๋ฐ๋ฅธ ์ ํ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๊ฒ์ ๋จ์ง ๋ชจ๋ ๊ฒ์ ๋จ์ํํ์ฌ ๋ง์ ์ด์ํ ๊ฐ์ฅ์๋ฆฌ ์ผ์ด์ค๋ฅผ ๋ฐฉ์งํฉ๋๋ค. ์ ์ํ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ๋ณด๋ค ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋ ์ค์ํ๋ฏ๋ก ๊ธฐ๋ฅ์ด ์กฐ๊ธ ๋ ๋ถ์์ ํ๊ฒ ์ ์ง๋์ด์ผํ๋ ๊ฒฝ์ฐ์๋ ๋ฌธ์ ๊ฐ ์์ด ๋ณด์ ๋๋ค.
๋์ ๋ฐ์ดํฐ์ ์์ ์ ๋๋์ง ๋ง ์์ ํ์ง ์๋ค๋ ์ ์ ์ฃผ๋ชฉํ์ต๋๋ค.
์์ ํ์ง ์์ ํน์ฑ์ ํ์ํ์ง ์๋ ํ ์์ ํ์ง ์์ต๋๋ค.
์ ์๊ฐ์ ์ปค์คํ ํ์์ ์ฌ์ฉ ์ฌ๋ก ์ค ํ๋๋ ์์ ํ์ง ์์ ๊ฒ์ผ๋ก ํ์๋ ํธ๋ ์ด ํธ๋ฅผ ์์ ํ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ ๊ฒ์ ๋๋ค.
๋ด asn1 ์์์๋ ์ฌ์ํ ์ฉ๋ ์ด์ธ์ ์์ฑ๋ ํ์ํ๋ฏ๋ก ์ฌ์ฉ์ ์ง์ ์์ฑ์ด ๋์ฐฉํ ๋๊น์ง ํจ๊ณผ์ ์ผ๋ก ๊ธฐ๋ค๋ ค์ผํฉ๋๋ค.
์ฌ์ฉ์ ์ ์ ์์ฑ rfc๋ฅผ ๋ ๊ฐ๋ก ๋ถํ ํ๋ ๊ฒ์ด ์ข์ ์๊ฐ์ ๋๊น?
์ฌ์ฉ์ ์ ์ ์์ฑ ๋งคํฌ๋ก๋ ๊ตฌ์ฒดํํ๋ฉด ๋ง์ ๊ฒ์ ์๊ตฌํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ๋ฐ๋ผ์ rfc๋ฅผ ๋ ๊ฐ๋ก ๋ถํ ํ๋ฉด ์ฌ์ฉ์ ์ง์ ํ์ ํจํค์ง์ ๋ํ ์์ ์ ์ธ ์์ฑ์ ๋ ๋นจ๋ฆฌ ์ ๊ณต ํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋ํ ์์ฑ์ด ์ด๋ฆ ๊ณต๊ฐ์ด ์๊ณ ์๋์ ์ด๋ผ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค (์ : ์์์ ์์ฑ์ ์ฌ์ฉํ๋ ค๋ฉด ์ธ๋ถ ์์๊ฐ ํ์ํจ). ๋์ผํ ์์ฑ ์ด๋ฆ์ ์ฌ์ฉํ๋ ๋ ๊ฐ์ ์ฌ์ฉ์ ์ง์ ํ์ ๋งคํฌ๋ก๋ฅผ ๋ฐฉ์งํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ฌ๊ธฐ์ ์ข์ ๊ธฐ๋๋ ์์ฑ์ ๋ํ ํน์ฑ์ด์๋ ์์์ ์ด๋ฆ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
์ด ๊ตฌํ์ด ์ผ๋ฐ์ ์ธ name!
๋งคํฌ๋ก๋ฅผ ํฌํจํ์ง ์๋ ์ด์ ๊ฐ ์์ต๋๊น? ์ผ๋ฐ์ ์ธ ๋งคํฌ๋ก์ ๋ํ ๊ฐ๋จํ TokenStream
in, TokenStream
out์ ๋ณต์กํ ๋ฌธ๋ฒ์ ๋ํ ์ปดํ์ผ ์๊ฐ์ด 30 ์ด๋ฅผ ์ด๊ณผํ๋ pest ์์ ๋งค์ฐ ์ ์ฉํจ์ ์
์ฆํฉ๋๋ค.
@dragostis rfc์ ์์ฝ์ ์ธ์ฉํ๋ ค๋ฉด :
์ปดํ์ผ๋ฌ์์ ์ค๋๋ ์ ์ ์ฐจ ์ ๋งคํฌ๋ก ์์คํ ์ ์์ฃผ ์์ ์กฐ๊ฐ์ ์ถ์ถํ์ฌ ์ต์ข ์ ์ผ๋ก ์์ ์ ์ธ API๋ฅผ ๊ฐ๋๋ก ์ฌ์ฉ์ ์ง์ ํ์ ์์ ๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ์ป์ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ด ์ปดํ์ผ๋ฌ์ ์ ์ง ๊ด๋ฆฌ ๋ถ๋ด์์ฃผ์ง ์๊ณ "์๋ฒฝํ ๋งคํฌ๋ก ์์คํ "์์ํ ์ถฉ๋ถํ ๊ธฐ๋ฅ์ ๋์์ ์ ๊ณตํ์ง ์๋๋กํฉ๋๋ค. ์ ๋ฐ์ ์ผ๋ก ์ด๊ฒ์ ๊ณต์ "๋งคํฌ๋ก 2.0"์ ํฅํ ์ ์ง์ ์ธ ๋จ๊ณ๋ก ๊ฐ์ฃผ๋์ด์ผํฉ๋๋ค.
๋๋ ๋ ์ค์ฉ์ ์ธ ์ฉ์ด๋ก, ์ฐ๋ฆฌ๊ฐ ์ง๊ธ ๊ตฌ์ถ ํ ํด๋ก์ ์์คํ
์ฒ๋ผ ์ ์๋ํ๋ ์ ์ฐจ ์ ๋งคํฌ๋ก ์์คํ
์ ์ป์ผ๋ ค๋ฉด ๋ง์ ๋์์ธ๊ณผ ํ
์คํธ๊ฐ ํ์ํ ๊ฒ์
๋๋ค. serde
๋ฐ diesel
serde
์ ๊ฐ์ ์์์๋ ์ ์ ํ ์ฌ์ฉ์ ์ง์ ํ์ ๊ธฐ๋ฅ์ด์๋ ์ฌ๊ฐํ ์ฌ์ฉ์ฑ ๋ฌธ์ ๊ฐ ์์ผ๋ฏ๋ก ์ง๊ธ ๋ฐ๋ก ํด๊ฒฐํ๊ธฐ ์ํด ์์ ๋ฐฉํธ ์กฐ์น๋ฅผ ์ทจํด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ ๊ฐ๋ฅํ ๋๊ตฌ์ ๊ฒฝํ์ ๋์์ด๋ฉ๋๋ค. ์ ์ฐจ ์ ๋งคํฌ๋ก ์์คํ
. syn
๋ฐ quote
์์๊ฐ ์ด์ ๋ํ ์ข์ ์์
๋๋ค.
@keeperofdakeys ๋ค, proc_macro
์ ๊ฐ์ ๋ค๋ฅธ ์์ฑ์ ์ถ๊ฐํ๋ ๋ฐ ๋ถ๋ด์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค. pest์ ์์ ๋ struct
๋ํ ๊ตฌ๋ฌธ ๋ถ์๊ธฐ๋ฅผ ๋จ์ํ ํ์์ํฌ ๋ฟ์ด๋ฉฐ struct
์์ฒด์์ ํ์๋์ง ์๊ณ {}
์ฌ์ด์ ์ ์ ๋ ๊ฐ๋จํ ๋ฌธ๋ฒ์์ ํ์๋ฉ๋๋ค. ๊ทธ๋๋ ์ฃฝ์ ํ ๋ก ์ ํํค ์น์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!
@dragostis ๋๋ ์ผ๋ง ์ ์ ๋ด๋ถ ์์ด ๊ฐ๋ฅ์ฑ์ ์ ๊ธฐํ์ต๋๋ค. https://internals.rust-lang.org/t/pre-rfc-extend-macros-1-1-to-support-foo-style-macros/3921 ์์ ์๋ต์ ์ฝ์ ์ ์์ต๋๋ค.
@nrc
๋ํ ์ฐ๋ฆฌ๋ ๋๊ธฐ๊ฐ ์ข์ ์ด์ ๊ฐ ์๋๋ผ ๊ทธ ์์ฒด๋ฅผ ์ํด ์๊ฒฐ์ ์ถ๊ตฌ ํ ์ ์๋ค๊ณ ๋๊ผ์ต๋๋ค.
์ด์ ๋ํ ํ ๊ฐ์ง ์ฐธ๊ณ ์ฌํญ : ๋งค๊ฐ ๋ณ์ ๋ฐ ์ ๋ฌธํ์ ๊ฐ์ ์ด๋ ค์ด ๊ฒฐ์ ์ ๋ด๋ ค์ผํ๋ ๋ง์ ๊ฒฝ์ฐ์ "์๋"๊ด๋ จ ๊ฐ๋ ์ ์ ์ ์ผ๋ก ๋ณด์ฅํ๋ ๊ฒ์ ์ด๋ ต๊ฑฐ๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ฌ๋์ด ๊ฒฝ์ฐ์๋ ์ค์ ๋ก ๊ตฌ์ฑ์ ํตํด ๋ณด์ฆํ๋ ๊ฒ์ด ๋งค์ฐ ๊ฐ๋จํ๋ฉฐ, ํ์ ์์์ ์ค์์ฑ์ ์ ๊ฑฐํ๋ ๊ฒ์ ์ฌ์ฉ์์๊ฒ ๋งค์ฐ ๊ฐ๋ ฅํ ๋จ์ํ์ฒ๋ผ ๋ณด์ ๋๋ค.
์์ ์ฑ์ ๊ดํ ํ, ์ฐ๋ฆฌ๋ ์ง๊ธ ์์ฑ์ ๋ฌด์ํ๊ธฐ์ํ ๋ถ์์ ํ ๋ฉ์ปค๋์ฆ์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ฌ์ ํ โโ์ผ๊ฐ์ ์ฌ์ฉํด์ผํ๋๋ผ๋ ์ค์ ๋ก๋ ์์ ์ ์ ๋๋ค (API๊ฐ ๊นจ์ง๊ธฐ ์ฝ์ง ์๋ค๋ ์ ์์). ์ฐ๋ฆฌ๋ ์ด๋ฌํ ๋ถ ์ฑ๋์ ์์ ํํ๋ ๊ฒ์ ๊ณ ๋ คํ ์ ์์ผ๋ฉฐ, ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉด๋ณด๋ค ์ผ๋ฐ์ ์ธ ๋ฉ์ปค๋์ฆ์ ์ ํธํ๋๋ก ์ง์์ ์ค๋จ ํ ๊ณํ์ ๋๋ค. ๋๋ @keeperofdakeys ์ ์ ์์ ๊ณ ๋ คํ๊ณ ์ฆ๊ฐ์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์์๋ ์ผ๋ฐ ์์ฑ ์๋ฃจ์ ์ ๋น ๋ฅด๊ฒ ์ถ์งํ ์ ์์ต๋๋ค.
๋ด ๊ด์ ์์ ๋ณผ ๋, ์ด๋ฌํ ์ฐ๋ ค ์ค ์ด๋ ๊ฒ๋ ๋งคํฌ๋ก 1.1์ด Serde์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๊ฒ๊ณผ ์ต์ํ "์ฌ์ค์"์์ ๋ (์ฆ, ์ค๋จ๋์ง ์์)์ ํฌ๊ฒ ์ฐจ๋จํ์ง ์๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
ํ
์ด ์ญํ ์ ์๊ตฌ์ ์ผ๋ก ์ฑ์ธ ์์๋ ๋ฌด์ธ๊ฐ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๋ค๋ฉด, ๋๋ ๊ทธ๊ฒ์ ํจ์ฌ ๋ ๋ฐ๋ ํ ๊ฒ์ ๋๋ค.
@withoutboats ๋ฅผ ๋ฐํฅํ๊ณ ํ์ฌ ์๋๋ ๋งคํฌ๋ก 2.0์ ์ ๊ณต ํ ๋์๋ ๋งคํฌ๋ก 1.1 API ํ๋ฉด์ ๊ทธ๋๋ก ์ ์งํ๋ ๊ฒ์์ ๋ช ํํํ๊ณ ์ถ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ฌ๊ณ ํ ์์๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ต์ข ์์คํ ์ด ์ ์๋ฆฌ์ ๋์ด๋ฉด ํ๊ธฐํ๋ ค๋ ์๋๋ก ์ค๋๋ ์ macro_rules์ ๋ ๋น์ทํ๋ค๊ณ ์๊ฐํ ์ ์์ต๋๋ค.
์ฌ์ฉ์ ์ ์ ํ์์ ๋ํ ์์ฑ ์ฌ์ฉ์ ๋ํ ๋ด ์ธ์์ @jimmycuadra ์ ์ธ์ ๊ณผ ๋น์ท ํ๋๋ฐ , ์ด๋ ๊ฝค ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ค๋ ๊ฒ์ ๋๋ค. ๋๋ ์ฌ์ฉ์ ์ ์ ์์ฑ์ด ์ฌ๋ฌ ๋์ ค์ ์ฌ์ฉ ์ฌ๋ก์ ์ค์ํ๋ค๊ณ ๋ฏฟ์ต๋๋ค (ํ์ง๋ง ๋ด๊ฐ ํ๋ ธ๋ค๋ฉด ์์ ํ์ญ์์ค).
๊ทธ๋ฐ ์๋ฏธ์์ ์ด๋ฌํ ์์ฑ์ ๋ํ ์ต์ ์ ๋ฐฉ๋ฒ์ด ๋ฌด์์ธ์ง 100 % ํ์ ํ์ง ๋ชปํฉ๋๋ค. ๋งคํฌ๋ก 1.1์ ์์ ํํ๋ ๊ฒ์ ๋ถ๋๋ฌ์ด ์ผ์ด์ง๋ง, ์ฒ์์๋ ๋งคํฌ๋ก 1.1์ ๋น ๋ฅธ ์์ ํ ๋ชฉ์ ์ ๋ค์ ์๋ฐฐํ๊ธฐ ๋๋ฌธ์ ์ผ๊ฐ์ ๋ง์ ์์ ์ฌ์ฉ์๋ฅผ ๋จ๊ฒจ ๋๋ ๊ฒ์ด ๋ถ๋๋ฌ์ด ์ผ์ ๋๋ค. ๋ค์ ๋งํด์, ์ฐ๋ฆฌ๊ฐ ๋งคํฌ๋ก 1.1 ์ฌ์ฉ์์ ๋๋ค์๋ฅผ _ ์ค์ ๋ก _ ์์ ์ ์ธ Rust๋ก ๋์ด ๋ค์ด์ง ์๋๋ค๋ฉด ์์ ํ ๋งคํฌ๋ก 1.1์ ๊ธฐ๋ค๋ฆด ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ ๋ฅผ ๊ดด๋กญํ๋ ํ ๊ฐ์ง ์์ ์ ์ฌ์ฉ์ ์ ์ ์์ฑ์ด ์ฅ๊ธฐ์ ์ผ๋ก ๋ณด์ผ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ณ ํ์ฌ ๋งคํฌ๋ก 1.1 ์์คํ
์์์ด๋ฅผ ํฉ๋ฆฌํ ํ ๊ฒ์ด๋ผ๋ ์ ์
๋๋ค. ์ฌ์ฉ์ ์ง์ ์์ฑ์ ๋ํ ํ์ฌ RFC ์์ ํฌ๋ ์ดํธ๋ ํฌ๋ ์ดํธ ์๋จ์ ํ์ดํธ๋ฆฌ์คํธ ์์ฑ ๋ค์ ์คํ์ด์ค๋ฅผ ์ ์ธํด์ผํฉ๋๋ค. ์ฆ, ์ฌ์ฉ์ ์ง์ ํ์์์ ์ฌ์ฉ์ ์ง์ ํน์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ค๋ฅธ ๊ณณ์์ ์ฌ์ฉ์ ์ง์ ํน์ฑ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ทผ๋ณธ์ ์ผ๋ก ๋ค๋ฆ
๋๋ค. RFC๋ฅผ ์กฐ์ ํ๊ธฐ์ํ ๊ฐ์ ๊ธฐ๋ฅ (์ : serde
ํฌ๋ ์ดํธ์ ์ฐ๊ฒฐํ๋ฉด ์๋ง๋ serde ์์ฑ์ ์๋์ผ๋ก ํ์ดํธ๋ฆฌ์คํธ์ ์ฌ๋ฆด ์ ์์)์ผ๋ก ๋ณผ ์ ์์ง๋ง, ์ด๋ฌํ ์ฐ๊ฒฐ ๋๊น์ ์ธ์ฒด ๊ณตํ์ ๊ด์ ์์ "๊ฐ์ฅ ๋๋ผ์ด"๊ด์ ์์ ์ ๋ฅผ ๊ฑฑ์ ํฉ๋๋ค. ).
์ ๋ฐ์ ์ผ๋ก ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ๋งคํฌ๋ก 1.1 ์์คํ ์ ํ์ฌ ๊ทธ๋๋ก ์๋ฒฝํ๊ฒ ์์ ํํ์ฌ ์์ผ๋ก ๋์๊ฐ ์์์ ๊ฒ์ ๋๋ค. ์ฆ, ์ฌ์ฉ์ ์ง์ ํ์ ํ์ฅ ํจ์๊ฐ ๊ตฌ์กฐ์ฒด๋ฅผ ์์ ํ ๋ค์ ๋ณด์กดํ๋ ค๋ ๊ฒฝ์ฐ ๊ตฌ์กฐ์ฒด๋ ๋ฐํํด์ผํ๋ค๋ ์ฌ์ค์ ์์ ํํฉ๋๋ค.
๋๋ rustc-serialize์์ serde _because_ serde์ ์ฝ๋ ์์ฑ์ด ์ ์ด ์์ฑ์ ์ง์ํ๋ ๊ฒ์ผ๋ก ์ ํํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
ํ์ ์์ฑ ์์ฒด์ ๋ํ ์ธ์๋ฅผ ์ง์ํ๋๋ก ๋งคํฌ๋ก 1.1์ ํ์ฅ ํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด ์ข์ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฉฐ ์ ์ฌ์ ์ผ๋ก ๋จ๊ธฐ์ ์ผ๋ก ์ ์ด ์์ฑ ๋ถ์กฑ์ ํด๊ฒฐํ๋ ๊ฒ์ด ๋จ์ฉ ๋ ์ ์์ต๋๋ค.
Ditto @jimmycuadra ๋ฐ @sfackler , ์์ฑ์ @nrc ์ ์ฃผ์์ด ์๋ฆฌ๋ฅผ๋ด๋ ๊ฒ๋ณด๋ค ์ค์ ํฉ๋๋ค. ์์ฑ์ด์๋ ๊ฑฐ์ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก๋ rustc-serialize์ ์ํด์๋ ์ ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋ฐค๋ง๋ค ์ฌ๋๋ค์ ์์ ๊ณ ์ถ๋ค๋ฉด rustc-serialize๋ฅผ ์ ํธํ๋ Serde๋ฅผ ๋น์ ๋ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์์ ์ฌ๋ฐ๋ฅธ ์์ง์์ ๋ํ ์๊ฒฌ์ ์์ง ์์ง๋ง, ์์ฑ์์ด ์์ ํ๋๋ฉด ๋ฌธ์ ์ฃผ์์ ๊ตฌ๋ฌธ ๋ถ์ํ์ฌ ์์ฑ์ ์ถ์ถํ๋ ๊ฒ์ ๊ฐ๋ ฅํ ๊ณ ๋ คํ ๊ฒ์์ ์๊ณ ์์ต๋๋ค. ๋ง์ ์ฌ๋๋ค์ด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์๋๋ก ๋น๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ถ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
#[serde(skip_serializing)]
.. ๋์ ์:
/// <!-- serde(skip_serializing) -->
ํ ๋ง์นด
์ ์๊ฐ์ ์ปค์คํ ํ์์ ์ฌ์ฉ ์ฌ๋ก ์ค ํ๋๋ ์์ ํ์ง ์์ ๊ฒ์ผ๋ก ํ์๋ ํธ๋ ์ด ํธ๋ฅผ ์์ ํ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ ๊ฒ์ ๋๋ค.
์ด ์ ์์ ์ฌ๊ธฐ ๋ด ์๊ฒฌ ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น? ๋ง์กฑ์ค๋ฌ์ด ํจํด์ ์ฐพ์์ต๋๋ค.
ํ ๊ฐ์ง๋ฅผ ๋ช ํํํ๊ณ ์ถ์ต๋๋ค.
์ฌ์ฉ์ ์ง์ ์์ฑ์ ์ ๊ฑฐํ๋ ๊ฒ์ด ์ฌ๋๋ค์ด ์ฌ์ฉ์ ์ง์ ํ์์ผ๋ก ์ํ ํ๋ ์ฃผ์ ์์ ์ ๋๊น?
๋ด๊ฐ ํ ์์๋ ๋ช ๊ฐ์ง ํดํน์ด ์๊ณ foo!
๋ฐฉ๋ฒ ์ค์ ๊ทธ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ต๋๋ค - ์ ํ (์, @sgrif ๋์ ค ์ด๋ฌํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ธ๊ธ, ๋ด๊ฐ @tomaka ๋๋ฌด ํ๋๋ฅผ ์ธ๊ธ ํ ์๊ฐ)์ ๋งฅ๋ฝ์์ ํ์ฅ ?
๋ด๊ฐ ๋ฌป๋ ์ด์ ๋ ์ด๊ฒ์ด๋ค : ํ์ ๋ฉ์ปค๋์ฆ์ด ์ถ๊ฐ impls ๋ชฉ๋ก ๋ง ๋๋ ค์ฃผ๋ ์ด์ ์ ๋ด ๋๋ค. ํนํ ์ ํ ์ ์ธ ์์ฒด์ ๋ฒ์๊ฐ ์ ํํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ํด๋น ์ ํ์ ์ปจํ ์คํธ์์ ํ์ดํธ๋ฆฌ์คํธ์ ์์ฑ ์ด๋ฆ ๋ชฉ๋ก์ ์ ๊ณต ํ ์์๋ ๋น ๋ฅด๊ณ ๋๋ฌ์ด API๋ฅผ ์ปจํ ์คํธ์ ์ถ๊ฐํ๋ ๊ฒ์ ์์ฑ์ ๋ํ ์ถฉ๋ถํ ์ฌ์ด ์์ ์ฒ๋ผ ๋ณด์ด๋ฉฐ ํญ์ ์ฌ์ฉ์ ์ค๋จ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๊ฐ ๋ ๋ง์ ์ ์ค ์ผ์ด์ค๋ฅผ ํ์ฑํํ๊ณ ์ถ๋ค๋ฉด (์์งํ ๊ทธ ์ ์ค ์ผ์ด์ค๊ฐ ์ข ๋ ... ๋๋๊ฒ๋ ํ์์์ ๊ธฐ๋ํ๋ ๊ฒ์ ์๊ฐํ ๋) ์๋ํ์ง ์์ต๋๋ค. ์ด๊ณ ๊ณํ (์ฐ๊ธฐ ๋์ถํ๊ธฐ ์ํด ๋ ๋์ ๋ฐฉ๋ฒ ๋์ ๋ฏธ๋์ "์์ ๋ฐ์ดํธ์์"API๋ฅผ ๋น์ถ์ฒ์ผ๋ก ๋ชจ๋ ํ, ์ฐ๋ฆฌ๊ฐ ์ ๋ง ์ฌ๋๋ค์ด ๊ธฐ๋ํ์ง ์๋ ๊ฒฝ์ฐ์, ๋๋ ์๋ง ์์ ๊ณผ ๋ฒ๊ธ์ ๊ฒ ์ด์จ๋ ์์ ๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ง์ต๋๊น?ํ์ง๋ง ํ ํฐ ์คํธ๋ฆผ์ ์ฌ์ฉํฉ๋๊น?) API์ ์ฝ๊ฐ ๋ ๋ณต์กํ ์ด๋ฆ์ ์ง์ ํ ์ ์์ต๋๋ค =)
@nikomatsakis ์ฃผ๋ ํ์๋ ์์ฑ์ ์ ๊ฑฐํ๋ ๊ฒ์ด ์๋๋ผ ๋ฌด์ํ๋ ๊ฒ์ ๋๋ค. ๋๋ ๊ทธ๋ค์ ๋ฌด์ํ๋ ์ฌ๊ฐํ ๋จ์ ์ ์์ง ๋ชปํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฃผ์ ์์ฑ์ ๋ํ ์ถ๊ฐ ๋งค๊ฐ ๋ณ์๋ฅผ ํตํด ํ์ ํจ์์ ๋ํ ํ์ดํธ๋ฆฌ์คํธ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ์ ์ฐจ ์ ๋งคํฌ๋ก ํดํน์ด ์๋ ์ค์ ํ์๋๋ ๋ชจ๋ ์ค์ ์๊ตฌ ์ฌํญ์ ์ถฉ๋ถํด์ผํฉ๋๋ค.
๊ทธ๋, ๋๋ ์ด๊ฒ์ ๋ํ ๋ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์ ์ฌ์ด์์ ๊ฐ๋ฑ์ ๊ฒช๊ณ ์์ผ๋ฉฐ, ๋ ๋ค ๋ถ๋ช ํ ๋จ์ ์ด ์์ต๋๋ค.
ํธ์ง : ๊ทธ๋ฌ๋ @eddyb ์ ํ์ดํธ๋ฆฌ์คํธ๋ ์ ๋งํ๊ฒ ๋ค๋ฆฝ๋๋ค.
๋ด ๋ง์ @nrc ๊ฐ (IIRC๊ฐ ์ฌ์ฉ์ ํฌ๋ ์ดํธ์ ํ์ดํธ๋ฆฌ์คํธ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ง๋ง) ํจ์ฌ ๋ค๋ฅธ ๊ฒ์ ์ ์ํ๋ ๊ฒ๊ณผ๋ ๋ค๋ฆ ๋๋ค. ํ ํฐ ์คํธ๋ฆผ ๋ง ์์ผ๋ฉด "์ฌ์ฉ ๋ ์์ฑ ํ์"์ ๋ํด ์ด์ผ๊ธฐํ๋ ๊ฒ์ ์ด๋ฆฌ ์์ต๋๋ค.
๋ด๊ฐ rust-cpp์์ ๋งคํฌ๋ก 1.1 ์์คํ ์ ์ ์ฉํด์จ ์์์ ์ ์ฐจ ์ ๋งคํฌ๋ก๋ ๋จ์ํ impls๋ฅผ ์ถ๊ฐํ๊ณ ์์ฑ์ ๋ฌด์ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋์ฒด ์ ๊ทผ ๋ฐฉ์์ผ๋ก ์์ ํ ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค.
์์ฑ์ ๋ฌด์ํ ์์๋ ๋ฅ๋ ฅ์ด ํ์์ ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ๊ทธ ์ธ์๋ ๊ทธ ์ง์ ์ ๋์ด์ ๊ตฌ์กฐ์ฒด๋ฅผ ์์ ํ ์ ์์ด๋ ๊ด์ฐฎ์ต๋๋ค.
@sgrif ๊ฐ deisel์์ ์ด๋ค ํํ์ ํดํน์ ์ฌ์ฉํ๊ณ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ตฌ์กฐ ์์ฒด๋ฅผ ์์ ํ ์์๊ณ ๋์ ์ถ๊ฐ ํญ๋ชฉ ๋ง ์ถ๊ฐ ํ ์์๋ ์ธ์์์๋ _ ๊ฐ๋ฅํ์ง ์์ต๋๋ค.
@sfackler๊ฐ ์ ์ํ๋๋ก ์ฌ์ฉ์ ์ง์ ํ์์ด ์ธ์๋ฅผ ๋ฐ๋๋ก ํ์ฉํ๋ ๊ฒ์ ์ฌ์ฉ์ ์ง์ ํน์ฑ์ ๋ํ ๊ฒฐ์ ์ ์ฐ๊ธฐํ๋ ๋์ ๋ชจ๋ ์ฌ๋์ด ํ์ํ ๊ธฐ๋ฅ์ ์ป์ ์์๋ ๋ฐฉ๋ฒ์ด ๋ ์ ์์ต๋๋ค. ๋ณด๊ธฐ์ ์ข๊ฑฐ๋ ๊ฐ๋ ์ฑ์ด ์ข์ง๋ ์์ง๋ง ์์ ์ ์๋ฃ ํ ์ ์์ต๋๋ค. ์ :
#[derive(Debug, Clone, Serialize(field("bar", rename = "baz")))]
pub struct Foo {
pub bar: String,
}
์ด ์์์ ๋์ค์ ๊ฒฐ์ ์ด ๋ด๋ ค์ง๋ฉด ์ฌ์ฉ์ ์ ์ ์์ฑ์ ์ํด ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ ์ ์์ต๋๋ค.
serde์ ๋ด ์์ ๋ชจ๋ ํ๋ / ๋ณํ ์์ฑ์ด ํ์ํฉ๋๋ค. ํ์ ์ธ์๋ก ์ด๊ฒ์ ๋ชจ๋ฐฉํ๋ ค๋ ๊ฒ์๋ณ๋ก ์๋ฏธ๊ฐ ์์ผ๋ฉฐ ์์ฑ์ด ํ์ํฉ๋๋ค.
์ด๋ฅผ ์์ ํํ๊ธฐ ์ํด ์ด๋ค ๊ฒฐ์ ์ ๋ด๋ฆฌ ๋ , ์ฌ์ฉ์ ์ ์ ํ์ ๋งคํฌ๋ก ์ฌ์ฉ์๊ฐ ๋งคํฌ๋ก 2.0 ํ์ API๋ก ์ ํ ํ ๋ ์ฝ๋๋ฅผ ์์ ํ ํ์๊ฐ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค (๋ถ๋ช ํ ์ฌ์ฉ์ ์ ์ ํ์ ๋งคํฌ๋ก ์์ฑ์๊ฐ ์ํ ํ ๊ฒ์ ๋๋ค). ๊ฐ์ฅ ํ๋ช ํ ๊ฒฐ์ ์ ์ปดํ์ผ๋ฌ์๊ฒ ํ์์ ์ํด ์ ๊ฑฐ ํ ์์ฑ ๋ชฉ๋ก์ ์ ๊ณตํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ฒฐ์ ์ ์ผ๋ก, ๊ทธ๊ฒ๋ค์ _all_ ํ์ ๋งคํฌ๋ก๊ฐ ์คํ ๋ ํ์ ๋ง โโ์ ๊ฑฐ๋ฉ๋๋ค. Serde, diesel ๋ฐ ๋ด ์์๋ ๋ชจ๋ ์ฌ๋ฌ ํ์ ๋งคํฌ๋ก์ ๋ํด ๋์ผํ ์์ฑ์ ์๊ตฌํ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์คํธ๋ฆฌํ ๋์์ ์ฌ์ฉํ๋ฉด ๋๋จธ์ง๊ฐ ์คํ ๋ ํ ์์ฑ์ ์ ๊ฑฐํ๊ธฐ ์ํด @dtolnay ๊ฐ ๋ค๋ฅธ ํ์ ๋งคํฌ๋ก๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด ๋ง๋ ํ์ฅ ํ ํฌ๋ ์ดํธ๊ฐ ํ์ํ์ง ์์ต๋๋ค.
FWIW ์ด๋ฌํ ์์ฑ์ ์ ๊ฑฐํ๋ ์ ์ผํ ์ด์ ๋ HIR์ ๋ ์๊ฒ ์ ์งํ๋ ๊ฒ์ ๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ๋ฌธ์ ์ ๋ํด์๋ ์ฌ์ฉ ๋ ๊ฒ์ผ๋ก ํ์ํ๊ธฐ ๋งํ๋ฉด๋ฉ๋๋ค.
์ฌ์ฉ์ ์ง์ ์์ฑ์ ์ ๊ฑฐํ๋ ๊ฒ์ด ์ฌ๋๋ค์ด ์ฌ์ฉ์ ์ง์ ํ์์ผ๋ก ์ํํ๋ ์ฃผ์ ์์ ์ ๋๊น?
๋๋ foo๋ฅผ ํ ๋ช ๊ฐ์ง ํดํน์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค! ์ ํ์ ๋งฅ๋ฝ์์ ํ์ฅ (์๋ฅผ ๋ค์ด, @sgrif ๋์ ค ์ด๋ฌํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ธ๊ธ, ๋๋ @tomaka ๋๋ฌด ํ๋๋ฅผ ์ธ๊ธ ํ ์๊ฐ) - ์ด๋ป๊ฒ ์ค์ ๊ทธ ์ฌ์ฉ ์ฌ๋ก๋?
์ปค์คํ ํ์์ด ๊ตฌ์กฐ์ฒด๋ฅผ ์์ ํ ์ ์๋ค๋ ์ฌ์ค์ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค.
์ ๋ ์์ ์ ์ธ Rust์ ํ๋ฌ๊ทธ์ธ์ด ์๋ค๋ ์ ์ ๋ํด ์์ฃผ ๋ถํํฉ๋๋ค. ๊ทธ๋์ ์ปค์คํ ํ์์ ๋ณด์์ ๋ ํ๋ฌ๊ทธ์ธ์ ๊ฐ์ง ๊ธฐํ๋ก ์ฌ์ฉํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ปค์คํ ํ์์ด ๊ทธ๋ค์ด ์ค๊ณ๋์ง ์์ ๊ฒ์ ์ง์ํด์ผํ๋ค๊ณ ๋ถ๋ช ํ ์ฃผ์ฅํ์ง ์์ ๊ฒ์ ๋๋ค.
์ต๊ทผ ์ผ๊ฐ์ ํ๊ท๊ฐ ๋ฐ์ํ ๊ฒ ๊ฐ์ต๋๋ค. ์ค๋ฅ ๋ฐ๊ธฐ
Queryable
์ ํ์ ๋ชจ๋์ ๋๋ค.
์์ ๋ฅผ ์ปดํ์ผ ํ ๋.
#[derive(Queryable)]
pub struct Post {
pub id: i32,
pub title: String,
pub body: String,
pub published: bool,
}
@sgrif # 37198๋ก ์ธํด ๋ค๋ฅธ ๋งคํฌ๋ก์ ๋์ผํ ๋ค์ ์คํ์ด์ค๋ฅผ ์ฌ์ฉํ๋๋ก ์ฌ์ฉ์ ์ ์ ํ์์ด ๋ณ๊ฒฝ๋์์ต๋๋ค ( bang!()
๋งคํฌ๋ก, #[attribute]
๋งคํฌ๋ก ๋ฐ #[derive(custom)]
๋งคํฌ๋ก ๋ชจ๋ ๊ณต์ ๋์ผํ ๋ค์ ์คํ์ด์ค).
์ด ์์ ์์ #[macro_use] extern crate diesel;
๋ Queryable
๋ผ๋ ์ด๋ฆ์ bang ๋งคํฌ๋ก๋ฅผ ๊ฐ์ ธ์ค๊ณ #[macro_use] extern crate diesel_codegen;
๋ ์ด๋ฆ์ด Queryable
์ธ ์ฌ์ฉ์ ์ง์ ํ์ ๋งคํฌ๋ก๋ฅผ ๊ฐ์ ธ์ต๋๋ค.์ด ๋งคํฌ๋ก๋ ์๋์ผ๋ก bang ๋งคํฌ๋ก๋ฅผ ๋ฎ์ด ์๋๋ค. - #[macro_use]
์กฐ์ฉํ ๋ฎ์ด ์ฐ๊ธฐ๋ ์ ํฉํ์ง ์์ต๋๋ค,ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ํต๊ทผ ์์์์ ๋งคํฌ๋ก๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค ์ผ๋จ ๋ฌธ์ ๊ฐ๋์ง ์์ ๊ฒ์
๋๋ค use
๋์ #[macro_use]
๊ณง!).
๋๋ ์ค๋ฅ๊ฐ ์พ
๋งคํฌ๋ก ํธ์ถ์ ์ํ ๊ฒ์ผ๋ก ํ๋จ Queryable!();
์ฌ์ฉ์ ์ ์ ํ์์ ํ์ฅ์์, ์ด๋ค์์ ์ฌ์ฉ์ ์ง์ ๋์ถ ํ ๊ฒฐ์ diesel_codegen
์์ ๋์ ๊ฐํ ๋งคํฌ๋ก diesel
.
@jseyfried ์ธ ๊ฐ์ง "์ข ๋ฅ"์ ๋งคํฌ๋ก ๋ชจ๋์ ๋จ์ผ ๋ค์ ์คํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์์ฑ๊ณผ ๋งคํฌ๋ก๋ฅผ ๋์ผํ ๋ค์ ์คํ์ด์ค๋ฅผ ์ฐจ์งํ๋ ๊ฒ์ผ๋ก ์ทจ๊ธํ๋ ๊ฒ์ด ๋ ์ด์ ๋ง์ด๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ํจ์์ ์ ํ์ ๋์ผํ ๋ค์ ์คํ์ด์ค๋ฅผ ์ฐจ์งํ๋ ๊ฒ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋ ์ด์ ์๋ฏธ๊ฐ ์์ต๋๋ค (๋งคํฌ๋ก๋ฅผ ๋ ์ ๊ฒ ํ์).
@withoutboats ๋๋ ๊ทธ๊ฒ์ด ์๋ชป๋ ๋น์ ๋ผ๊ณ ์๊ฐํ๋ค. ๋๋ ๋ค๋ฅธ ์ข ๋ฅ์ ๋งคํฌ๋ก๊ฐ ๋ค๋ฅธ ์ข ๋ฅ์ ๊ฐ์ด๋ ํ์ ์ดํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ค์ ์คํ์ด์ค๋ฅผ ๊ณต์ ํ๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ ์ ํธํ๋ค (์ : ํจ์์ const). ๋ค์ ์คํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐ๋ ๋ณต์ก์ฑ ๋น์ฉ์ด ์์ผ๋ฉฐ ์ ์ ์์ ๋ค์ ์คํ์ด์ค๊ฐ ๋ ์ข๋ค๊ณ ์๊ฐํ๋ฏ๋ก ์ ๋ค๋ฅธ ๋ค์ ์คํ์ด์ค๊ฐ ํ์ํ๊ฐ์? ์ญ ํธํ์ ์ํด์๋ ๋งคํฌ๋ก๊ฐ ํจ์ ๋ฐ ์ ํ๊ณผ ๋ค๋ฅธ ๋ค์ ์คํ์ด์ค์ ์์ด์ผํฉ๋๋ค.
์ง์ง ๋ฌธ์ ๋ use
๋ฅผ ์ฌ์ฉํ์ฌ ๋งคํฌ๋ก๋ฅผ ์ ํ์ ์ผ๋ก ๊ฐ์ ธ ์ค๊ฑฐ๋ ์ด๋ฆ์ ๋ฐ๊ฟ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ์์ ์ฌ์ฉ์๋ ๋งคํฌ๋ก ์ด๋ฆ ์ถฉ๋์ ํผํ ์ ์์ต๋๋ค. ๋์์ ProcMacro ํฌ๋ ์ดํธ๋ฅผ ๊ฐ์ ธ ์์ ๋ก์ปฌ ๋งคํฌ๋ก ์ด๋ฆ๊ณผ ์ถฉ๋ ํ ๊ฒ์ผ๋ก ๊ธฐ๋ํ์ง๋ ์์ต๋๋ค. ํ์ ๋งคํฌ๋ก๊ฐ derive_
์์ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๋ค์ ์คํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐ๋ ๋ณต์ก์ฑ ๋น์ฉ์ด ์์ผ๋ฉฐ ์ ์ ์์ ๋ค์ ์คํ์ด์ค๊ฐ ๋ ์ข๋ค๊ณ ์๊ฐํ๋ฏ๋ก ์ ๋ค๋ฅธ ๋ค์ ์คํ์ด์ค๊ฐ ํ์ํ๊ฐ์?
ํญ๋ชฉ์ด ์๋ก ๋ชจํธ ํ ์์๋ ๊ฒฝ์ฐ์๋ง ๋ค์ ์คํ์ด์ค๋ฅผ ๊ณต์ ํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. const์ fns๋ ๋ชจ๋ ์ ์ปจํ ์คํธ์์ ID๋ก ์ฌ์ฉ๋๋ฏ๋ก ๋์ผํ ๋ค์ ์คํ์ด์ค์ ์์ต๋๋ค. ์ ํ ๋ฐ ํน์ฑ์ ํน์ฑ ๊ฐ์ฒด์ ๋ํ ๊ตฌ๋ฌธ ๋๋ฌธ์ ๋์ผํ ๋ค์ ์คํ์ด์ค์ ์์ต๋๋ค.
์ด ์ธ ๊ฐ์ง ์ข ๋ฅ์ ๋งคํฌ๋ก๋ ๋ชจ๋ ๊ณ ์ ํ ๋ฐฉ์์ผ๋ก ํธ์ถ๋ฉ๋๋ค. ํธ์ถ์ ๋ชจํธํจ์ด์์ ์ ์๊ธฐ ๋๋ฌธ์ ๋ค์ ์คํ์ด์ค๋ฅผ ๊ณต์ ํด์ผํ๋ค๋ ๊ฒ์ด ์ ์๊ฒ ์ด์น์ ๋ง์ง ์์ต๋๋ค.
๊ตฌํ ๋ณต์ก์ฑ ๋น์ฉ์ด ์์ง๋ง ์ด๋ฌํ ์ด๋ฆ์ ๋ณ๋๋ก ์ง์ ํ์ฌ _use_ ๋ณต์ก์ฑ์ ์๋นํ ๋น์ฉ์ด ๋ ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ธ์ด ๊ธฐ๋ฅ์ ๋ณต์ก์ฑ ๋น์ฉ์ ๋ํด ์๊ฐํ ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ ๋ณต์ก์ฑ์ ๋ํด ์๊ฐํฉ๋๋ค.
_all_ ํญ๋ชฉ์ด ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋๋ผ๋ฉด ๋์ผํ ๋ค์ ์คํ์ด์ค์ ์์ด์ผํ๋ค๊ณ ๋ง์ ํ์๊ฒ ์ต๋๊น? ๋น์ ์ ์ฌ๊ณ ๊ณผ์ ์ ๋ช ํํํ๋ ค๊ณ ๋ ธ๋ ฅํฉ๋๋ค.
์กฐ๊ธ ๋ ์๊ฐํด ๋ณด๋ฉด, ๋ชจ๋ ํญ๋ชฉ์ด ๋ค์ด์๋ ๋ค์ ์คํ์ด์ค๊ฐ 1 ๊ฐ๋ง ์์ด์ผํ๋ค๊ณ ํด๋ ๊ด์ฐฎ์ ๊ฒ์ ๋๋ค. ์ ์ฒด "์ค์ ์์ฑ์"ํจํด์ IMO๋ฅผ ๋ค์ ํท๊ฐ ๋ฆฌ๊ฒํฉ๋๋ค.ํ์ง๋ง ๊ทธ๊ฒ์ Rust๊ฐ ๋น ๋งคํฌ๋ก ํญ๋ชฉ์ ๋ํด ๋ด๋ฆฐ ๊ฒฐ์ ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋งคํฌ๋ก ํญ๋ชฉ์ด ๋ค๋ฅธ ๋ค์ ์คํ์ด์ค๋ฅผ ์ฐจ์งํ๋ ๊ฒ์ด ๋ ์ผ๊ด์ ์ด๊ณ ๊ธฐ๋๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
์ง์ง ๋ฌธ์ ๋ ๋งคํฌ๋ก๋ฅผ ์ ํ์ ์ผ๋ก ๊ฐ์ ธ ์ค๊ฑฐ๋ ์ด๋ฆ์ ๋ฐ๊พธ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋งคํฌ๋ก 2.0์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ ๋ชจ๋ธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํ ๊ฐญ ํดํน์ ๋๋ค.
ํ์ ๋งคํฌ๋ก๊ฐ derive_๋ก ์์ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๊ทธ๊ฒ์ ์ค๋๋ ์ปค์คํ ํ์ ์์คํ ์ด์๊ณ , ๋๋ ๋งคํฌ๋ก 1.1์ด ์ด๊ฒ์ ์ํํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๊ตฌํ ๋ณต์ก์ฑ ๋น์ฉ์ด ์์ง๋ง ์ฌ์ฉ ๋ณต์ก์ฑ์ ์๋นํ ๋น์ฉ์ด ๋ ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์ฌ์ฉ์ ์ ์ํ๋ ๋ฐ์๋ ๋น์ฉ์ด ๋ญ๋๋ค. ํนํ ๋๊ตฌ์ ๊ฒฝ์ฐ ์ถ์ ๋ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค (๊ทธ๋ค์ง ๋ ผ์ ํ ์๋ ์์ง๋ง). ๋ํ ์ธ์ด ๋ณต์ก์ฑ๋งํผ ์ค์ํ ๊ฒ์ ๊ตฌํ ๋ณต์ก์ฑ์ด ๊ทธ๋ฆฌ ํฌ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค (๋ค์ ์คํ์ด์ค๊ฐ ์ปดํ์ผ๋ฌ๋ฅผ ํ์คํ ๋ณต์กํ๊ฒ ๋ง๋ค์ง ๋ง, ์ด๊ฒ์ด ๊ทธ๋ ๊ฒ ์ค์ํ์ง ์๋ค๋ ๋ฐ ๋์ํฉ๋๋ค). ์์ ๋ฐ ๊ทธ๋ฆผ์์ ๊ฐ์ ๊ฒ์ ์ํฅ์ ๋ฏธ์น๊ณ ๋ ๋ณต์กํ๊ฒ ๋ง๋ญ๋๋ค.
์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋๋ผ๋ฉด ๋ชจ๋ ํญ๋ชฉ์ด ๋์ผํ ๋ค์ ์คํ์ด์ค์ ์์ด์ผํ๋ค๊ณ ๋ง์ ํ์๊ฒ ์ต๋๊น? ๋น์ ์ ์ฌ๊ณ ๊ณผ์ ์ ๋ช ํํํ๋ ค๊ณ ๋ ธ๋ ฅํฉ๋๋ค.
๋๋ ๊ทธ๋ ๊ฒ ๋ฉ๋ฆฌ ๊ฐ์ง ์์ ๊ฒ์ ๋๋ค. ๊ฐ๊ณผ ์ ํ์ด ๋ถ๋ฆฌ๋์ด ์์ผ๋ฉด ์ด์ ์ด ์๋ค๊ณ ์๊ฐํ์ง๋ง ํ์คํ ๋จ์ผ ๋ค์ ์คํ์ด์ค๋ฅผ ๊ฐ์ง ์ธ์ด๋ ์ฌ๋ฌ๋ฉด์์ ์์ ํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ข์ ๊ฒ์ ๋๋ค.
ํ์ง๋ง ๊ทธ๊ฒ์ Rust๊ฐ ๋งคํฌ๋ก๊ฐ ์๋ ํญ๋ชฉ์ ๋ํด ๋ด๋ฆฐ ๊ฒฐ์ ์ด ์๋๋๋ค.
๋์๋ฒ : ๋ชจ๋๊ณผ ํ๋๋ ๊ฐ ๋ค์ ์คํ์ด์ค์ ์์ง๋ง ์ฌ์ฉํ ์์๋ ์์น๋ ๋ค๋ฅธ ๊ฐ์ ์ฌ์ฉํ ์์๋ ์์น์ ๋ค๋ฆ ๋๋ค.
์๋ ํ์ธ์.
์ง์ง ๋ฌธ์ ๋
use
๋ฅผ ์ฌ์ฉํ์ฌ ๋งคํฌ๋ก๋ฅผ ์ ํ์ ์ผ๋ก ๊ฐ์ ธ ์ค๊ฑฐ๋ ์ด๋ฆ์ ๋ฐ๊ฟ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๊ณง ๊ธฐ๋ฅ ๊ฒ์ดํธ ๋ค์์ use
๋งคํฌ๋ก๋ฅผ extern crate
s์์ ์ฌ์ฉํ ์ ์์ต๋๋ค (~ 1 ์ฃผ), cf https://github.com/rust-lang/rfcs/pull/1561 ๊ทธ๋ฆฌ๊ณ # 35896. ์ฌ์ฉ์ ์ ์ ํ์ ์์์์ use
๋งคํฌ๋ก๋ฅผ ์ฌ์ฉ์ ์ ์ ํ์ ์์์ ํจ๊ป ์์ ํํ๊ธฐ๋ก ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
ํ์ ๋งคํฌ๋ก๊ฐ
derive_
์์ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
์ด๊ฒ์ ๊ตฌ์ ์ปค์คํ
ํ์๋ฌผ์ ํด๋น๋ฉ๋๋ค. ๋งคํฌ๋ก 1.1 ์ฌ์ฉ์ ์ ์ ํ์์ ์ฌ์ฉํ๋ฉด #[derive(Serialize)]
(์ :)์์ Serialize
๊ฐ ์ฌ์ฉ์ ์ ์ ํ์ ๋งคํฌ๋ก๋ก ํด์ ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
์๋ ํ์ธ์.
์ธ ๊ฐ์ง "์ข ๋ฅ"์ ๋งคํฌ๋ก ๋ชจ๋์ ๋จ์ผ ๋ค์ ์คํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
- ์ฐ์ ์์ : bang ๋งคํฌ๋ก์ ์์ฑ ๋งคํฌ๋ก๋ ์ค๋ซ๋์ ๋ค์ ์คํ์ด์ค๋ฅผ ๊ณต์ ํด ์์ผ๋ฏ๋ก ๋ณ๊ฒฝ ๋ ๋๊น์ง ์ฌ์ฉ์ ์ง์ ํ์๋ ํด๋น ๋ค์ ์คํ์ด์ค๋ฅผ ๊ณต์ ํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
- ์ญ ํธํ์ฑ : ๋จ์ผ ๋งคํฌ๋ก ๋ค์ ์คํ์ด์ค๋ก ์์ํ๋ฉด ์ญ ํธํ ์ ์ผ๋ก ๋ถํ ํ ์ ์์ต๋๋ค. ์ฌ๋ฌ ๋งคํฌ๋ก ๋ค์ ์คํ์ด์ค๋ก ์์ํ๋ฉด ์์ํ ๊ณ ์ ๋ฉ๋๋ค.
- ๋จ์์ฑ : ๊ฐ ๋งคํฌ๋ก "์ข ๋ฅ"์ ์์ฒด ๋ค์ ์คํ์ด์ค๊ฐ์๋ ๊ฒฝ์ฐ ์ด 5 ๊ฐ์ ๋ค์ ์คํ์ด์ค๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ https://github.com/rust-lang/rfcs/pull/1561 ์ฐฉ๋ฅ ํ
use foo::bar;
๋bar
(๊ฐ, ์ ํ, bang ๋งคํฌ๋ก)๋ผ๋ ์ด๋ฆ์ _5 ๊ฐ์ ๊ฐ๋ณ ํญ๋ชฉ _์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์ ์ง์ ํ์ ๋งคํฌ๋ก๊ฐ ์๋ bang ๋งคํฌ๋ก๋ฅผ ๋ค์ ๋ด๋ณด๋ด๊ฑฐ๋ ์ฌ์ฉ์ ์ง์ ํ์ ๋งคํฌ๋ก๋ฅผbaz
์ผ๋ก ๊ฐ์ ธ ์ค๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์์ต๋๋ค.
์ญ ํธํ์ฑ : ๋จ์ผ ๋งคํฌ๋ก ๋ค์ ์คํ์ด์ค๋ก ์์ํ๋ฉด ์ญ ํธํ ์ ์ผ๋ก ๋ถํ ํ ์ ์์ต๋๋ค. ์ฌ๋ฌ ๋งคํฌ๋ก ๋ค์ ์คํ์ด์ค๋ก ์์ํ๋ฉด ์์ํ ๊ณ ์ ๋ฉ๋๋ค.
ํนํ 1.1์ด ์์ ๋ฐฉํธ์ด๋์ด์ผํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ค๋๋ ฅ์ด ์์ต๋๋ค. : +1 :
PartialEq!
๊ฐ์ macro_rules ๋งคํฌ๋ก๋ฅผ ๊ฐ์ง ์ฌ๋์ ์ํด์ด ์ฝ๋๊ฐ ์ค๋จ๋ฉ๋๊น?
์๋์, PartialEq
์ (๋) ์ฌ์ฉ์ ์ง์ ํ์์ด ์๋๊ธฐ ๋๋ฌธ์ ์ค๋๋ ๋งคํฌ๋ก ๋ค์ ์คํ์ด์ค์ ์ ์๋์ด ์์ง ์์ต๋๋ค.
#[derive(Foo)]
๋ ์ฌ์ฉ์ ์ ์ ํ์์ ์ฐพ๊ธฐ ์ ์ Foo
๊ฐ "๋ด์ฅ ํ์"( PartialEq
, Copy
๋ฑ)์ธ์ง ๋จผ์ ํ์ธํฉ๋๋ค. Foo
๋งคํฌ๋ก ๋ค์ ์คํ์ด์ค์ ์์ต๋๋ค. ๋ด์ฅ ๊ธฐ๋ฅ์ derive
์ ์์ ํ๋ ์ฝ๋ฉ๋ฉ๋๋ค.
์ฆ, ์ฐ๋ฆฌ๊ฐ ๊ฒฐ๊ตญ PartialEq
๋ด์ฅ ๋์ ์ ์ฃผ๊ณก์์ ์ฌ์ฉ์ ์ ์ ํ์์ผ๋ก ๋ง๋ค๊ธฐ๋ก ๊ฒฐ์ ํ๋ฉด ์ค๋ช
ํ๋๋ก ์ฝ๋๋ฅผ ๊นจ๋จ๋ฆด ์ ์์ผ๋ฏ๋ก ์ง๊ธ ์ด์ ๋ํ ๋ฏธ๋๋ฅผ ์ฆ๋ช
ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์์ฑ ๋ฌธ์ ์ ๋ํ ์ ์ (ํ์ ๋งคํฌ๋ก๊ฐ ์ ์ธ ๋ ํญ๋ชฉ์ ์์ ํ ์์๊ณ ์ฅ์ ๋งํ๋ ๋ชจ๋ธ์์ ์์ ํ๋ค๊ณ ๊ฐ์ ) :
MultiItemModifier
ํธ๋ ์ด ํธ๋ฅผ ๊ตฌํํฉ๋๋ค. ๋งคํฌ๋ก 2.0์ด ๊ณ์ํด์ ํน์ฑ์ ๊ตฌํํ๊ณ ์ด ํน์ฑ์ ๋ฉ์ปค๋์ฆ์ ํ์ฅ์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ณํ์
๋๋ค. ๋งคํฌ๋ก ์ธ ์ฃผ์์ด ๋ฌ๋ฆฐ ํจ์๊ฐ์ด ํน์ฑ์ ๊ตฌํํฉ๋๋ค. ํ๋ฌ๊ทธ์ธ ๋ฑ๋ก ๊ธฐ๊ด์ ์ฌ์ฉํ์ง ์์ง๋ง ์ด๋ ๋ณธ์ง์ ์ผ๋ก ์คํ ์ ๊ฑฐ์
๋๋ค.CustomDerive
ํธ๋ ์ด ํธ๋ฅผ ๋ถ๋ฆฌํด์ผํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ, ๋งคํฌ๋ก ์์ฑ์๋์ด๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ค์ ํจ์์ ์์ฑ์ ์ฌ์ฉํ๋ ๋์ ํน์ฑ์ ์ง์ ๊ตฌํํ ์์๋ ์ต์
์ด ์์ต๋๋ค. (๋๋ ์ฐ๋ฆฌ๊ฐ impl์์ ์์ฑ์ ์ฌ์ฌ์ฉ ํ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ์๋ง๋์ด ๋ฑ๋ก ๋ฉ์ปค๋์ฆ์ ๋
ผ์ํด์ผ ํ ๊ฒ์
๋๋ค).declare_attributes
์ ๊ธฐ๋ฅ์ CustomDerive
๋ฐํ Vec<String>
. ๋น vec๋ฅผ ๋ฐํํ๋ ๊ธฐ๋ณธ impl์ด ์์ต๋๋ค.declare_attributes
_ ์ถ๊ฐ _๋๋ฉฐ์ด ๋ฉ์ปค๋์ฆ์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค.declare_attributes
๋ฐํ ๋ ๋ฌธ์์ด์ ์์ฑ์ ๊ฒฝ๋ก ์ ๋์ฌ๋ก ํ์ธ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด declare_attributes
vec!["foo::bar"]
๋ฐํ ํ ๊ฒฝ์ฐ #[foo::bar::baz]
๋ฐ #[foo::bar::qux]
์ด ํ์ฉ๋ฉ๋๋ค.์๊ฐ? cc @alexcrichton @jseyfried @dtolnay @sgrif @erickt @ rust-lang / lang
@nrc ๊ฐ #[cfg(..)]
์ ๊ฐ์ _used_ ์์ฑ์ ์ค์๋ก ๋๋ ๊ณ ์๋ก ๋นํ์ฑํ ํ ์ ์์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋ฐ๋ ์ ์์ต๋๊น?
@nrc ๋ถํํ๋ ์ด๋ฌํ ์ ์ฝ ์กฐ๊ฑด์ ๊ณ ๋ คํ ๋ ๊ตฌํ์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง ์ ์ ์์ผ๋ฏ๋ก ์๋ํ๋์ง ์ฌ๋ถ๋ฅผ ์์ ํ ํ์ ํ ์ ์์ต๋๋ค.
ํธ๋ ์ด ํธ์ ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ ์์น์ ์๊ธฐ ๋๋ฌธ์ ํธ๋ ์ด ํธ์ ํธ๋ ์ด ํธ ๊ฐ์ฒด๊ฐ ์๋ํ๋์ง ์ฌ๋ถ์ ๋ํด ๋ค์ ํ์์ ์ด๋ผ๊ณ ํฉ๋๋ค.
@nrc ์ ์ด๊ฒ์ด ํ์์ ์ด์ด์ผํ๊ณ ํ์ ํ์ฅ๊ธฐ ๊ธฐ๋ฅ์ ์ง์ ํ๋ ์์ฑ์ ๋ชฉ๋ก์ด ๋ ์์๋ ์ด์ ๋ ๋ฌด์์
๋๊น? ์ : #[proc_macro_derive(Serialize, uses_attrs(serde_foo, serde_bar))]
๋๋ ์ผ๋ถ.
@ colin-kiegel ํ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ฒ์์๋ง ์ ์ฉ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.์ด ๊ฒฝ์ฐ ๋งคํฌ๋ก ํ์ฅ ์ ์ cfgs๋ฅผ ์ ์ฉ ํ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง ๋ค๋ฅธ ์์ฑ์ ๋นํ์ฑํํ๋ ๊ฒ์ ์์๋๋ ๋์ ์ผ ๊ฒ์ ๋๋ค (์ด๊ฒ์ ๋ณ๊ฒฝ๋์์ง๋ง ๊ธฐ์ตํ ์ ์์ต๋๋ค). ์ด์ ๋ ์ดํ).
ํํ
ํธ๋ ์ด ํธ์ ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ ์์น์ ์๊ธฐ ๋๋ฌธ์ ํธ๋ ์ด ํธ์ ํธ๋ ์ด ํธ ๊ฐ์ฒด๊ฐ ์๋ํ๋์ง ์ฌ๋ถ์ ๋ํด ๋ค์ ํ์์ ์ด๋ผ๊ณ ํฉ๋๋ค.
ํ , ์ข์ ์ง์ ์ ๋๋ค. ๋งคํฌ๋ก 2.0์ ๋ํด์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํฉ๋๋ค.
@eddyb ์ด๊ฒ์ ์ข์ ์๊ฐ์ด๋ฉฐ ์๋ง๋ ๋จ๊ธฐ์ ์ผ๋กํ๊ธฐ๊ฐ ๋ ์ฌ์ธ ๊ฒ์ ๋๋ค. ๋ช ๋ นํ ์ ๊ทผ ๋ฐฉ์์ ์ ํธํ๋ ์ด์ ๋ ์ด๊ฒ์ด ์ผ๋ฐ์ ์ธ ํ์ฅ ์ฑ ๋ฉ์ปค๋์ฆ์ด๋ฉฐ ์ ์งํ๊ณ ์ถ์ ๋ฐ๋ฉด ์์ฑ์ ํญ๋ชฉ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ฌด ์ ํ์ฅ๋์ง ์์ผ๋ฉฐ ์์ํ ๊ณ ์ ๋๊ณ ์ถ์ง ์์ ๊ฒ์ด ์๋ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. . ๋ฐ๋ฉด์ ์ง๊ธ์ ํ์คํํ๊ธฐ๊ฐ ๋ ์ฝ๊ณ ์ฃผ์๋ฅผ ๋งด๋๋ ๊ฒ์ด ๋์์ง ์์ ๊ฒ ๊ฐ์ผ๋ฏ๋ก ๋ ๋์ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์กํ๊ธฐ-๋๋ ๋๋ผ๋ฅผ ๋ ๋ฌ๊ณ ์ํ๋ค. ๋ชจ๋ ์ข
๋ฅ์ ๋งคํฌ๋ก๊ฐ ๋์ผํ ๋ค์ ์คํ์ด์ค๋ฅผ ์ฐจ์งํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด์ง ์๋ค๊ณ ์๊ฐํ๋ฏ๋ก https://github.com/rust-lang/rust/pull/37198 ์ ๋ค์ ๋ฐฉ๋ฌธํ๊ณ ์ถ์ต๋๋ค. ์ต์ํ ์ฌ์ฉ์ ์ง์ ํ์ ๋งคํฌ๋ก๊ฐ ํด๋น ๋ค์ ์คํ์ด์ค์ derive_Foo
๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค. ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ๋์ผํ ์ด๋ฆ์ ์ฌ์ฉํ๋ ์ฌ๋ฌ ์ ํ์ ๋งคํฌ๋ก์ ๋ํ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ต๋๋ค (์ : #[cfg]
๋ฐ cfg!
)
๋ํ ๊ณต์ ๋ค์ ์คํ์ด์ค๊ฐ ์กฐ๊ธ ์ด์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ต์ข ์ฌ์ฉ์์ ๊ด์ ์์ ๋ณด๋ฉด ์ผ์ข ์ ์ํธ ๊ตํ ์ฑ, ๋ชจํธ์ฑ ๋๋ ํฅ๋ฏธ๋ก์ด ์ผ์ด์๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ต๋๋ค. ๋๋ ์ด์ ๊ฐ์ '๋ฌด์์'์ ํ์ด Rust๋ฅผ ์ธ์ด๋ก ์ดํดํ๋ ๊ฒ์ ์กฐ๊ธ ๋ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค ..
ํ์ง๋ง ์๋ง ์ธ์์ ๋์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค๋ฅธ ๋ค์ ์คํ์ด์ค๋ ์์ผ๋ก๋ ๋ง์ด ์ค๋จ๋์ง ์๊ณ ๋์ ๋ ์์๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
@sgrif @ colin-kiegel https://github.com/rust-lang/rust/issues/35900#issuecomment -256247659์์ ๋จ์ผ ๋งคํฌ๋ก ๋ค์ ์คํ์ด์ค์ ๋ํ ๊ทผ๊ฑฐ๋ฅผ ์ค๋ช ํ์ต๋๋ค.
๋ชจ๋ ์ข ๋ฅ์ ๋งคํฌ๋ก๊ฐ ๋์ผํ ๋ค์ ์คํ์ด์ค๋ฅผ ์ฐจ์งํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ช ํํ๊ฒ ๋งํ๋ฉด, bang ๋งคํฌ๋ก์ ์์ฑ ๋งคํฌ๋ก๋ ํญ์ ๋์ผํ ๋ค์ ์คํ์ด์ค๋ฅผ ์ฐจ์งํ์ต๋๋ค. # 37198 ๋ฐฉ๊ธ ์ด๋ ํ ์ฌ์ฉ์ ์ง์ ํ์ ํญ๋ชฉ์ด์ด ๋ค์ ์คํ์ด์ค๋ก ๋ค์ด๊ฐ๋๋ค.
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ๋์ผํ ์ด๋ฆ์ ์ฌ์ฉํ๋ ์ฌ๋ฌ ์ ํ์ ๋งคํฌ๋ก์ ๋ํ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ต๋๋ค (์ :
#[cfg]
๋ฐcfg!
)
๋๋ cfg
๋ bang ํธ์ถ ๋๋ ์์ฑ ํธ์ถ์ ํตํด ์ฌ์ฉํ ์์๋ ๋จ์ผ ๋งคํฌ๋ก๋ก ๋ณผ ์ ์์ต๋๋ค (ํ์ฌ ์ฌ์ฉ์๊ฐ bang ๋๋ ์์ฑ์ ํตํด ํธ์ถ ํ ์์๋ ๋งคํฌ๋ก๋ฅผ ์ ์ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ์ง๋ง, ๋งคํฌ๋ก 2.0์์ ํ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ ์ ์์ต๋๋ค.)
์ต์ข ์ฌ์ฉ์์ ๊ด์ ์์ ๋ณด๋ฉด ์ผ์ข ์ ํธํ์ฑ์ด์๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ต๋๋ค.
๋ ๋งคํฌ๋ก๊ฐ ์ถฉ๋ ํ ๋ ๋ช ํํ ์ค๋ฅ ๋ฉ์์ง๋ก ๊ฐ์ ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค (์ค๋์ ๋ฉ์์ง๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ฒ ์ต๋๋ค).
๋ค๋ฅธ ๋ค์ ์คํ์ด์ค๋ ๋ง์ ๋ถ๋ถ์ ์ค๋จํ์ง ์๊ณ ์์ผ๋ก๋ ๊ณ์ ๋์ ๋ ์ ์์ต๋๋ค.
๋งคํฌ๋ก ๋ค์ ์คํ์ด์ค๋ฅผ ๋ถํ ํ๋ ๊ฒ์ด ์ด์ ๋ฒ์ ๊ณผ ์์ ํ ํธํ๋๋ค๊ณ ์๊ฐํฉ๋๋ค (๋ด๊ฐ ํ๋ ธ๋ค๋ฉด ์์ ). ์ด๊ฒ์ด ์ค๋ ๋จ์ผ ๋งคํฌ๋ก ๋ค์ ์คํ์ด์ค๋ฅผ ์ ์งํ๋ ์ฃผ๋ ๋๊ธฐ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋งคํฌ๋ก 1.1์ด ๊ฐ๋ฅํ ํ ๋ฏธ๋์ ํธํ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ง์ง๋ง์ผ๋ก, bang / attribute ๋งคํฌ๋ก ๋ ์ฌ์ฉ์ ์ง์ ํ์ ๋งคํฌ๋ก ์ถฉ๋์ ์ค์ ๋ก๋ ๋๋ฌผ๋ค๊ณ ์๊ฐํฉ๋๋ค. bang / attribute ๋งคํฌ๋ก๋ ์ผ๋ฐ์ ์ผ๋ก ์๋ฌธ์์ด๊ณ ์ฌ์ฉ์ ์ง์ ํ์์ ์ผ๋ฐ์ ์ผ๋ก ๋๋ฌธ์์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฆ, ์ด๋ฌํ ๋ช ๋ช ๊ท์น์ ๋ฐ๋ฅผ ๋ ์ฌ์ฉ์ ์ง์ ํ์์๋ ์ด๋ฏธ ์์ฒด ๋ค์ ์คํ์ด์ค๊ฐ ์์ต๋๋ค.
ํ์ (https://github.com/diesel-rs/diesel/issues/485)์ Queryable! { struct S; }
๋ฐ #[derive(Queryable)] struct S;
์ง์์ผ๋ก ์ธํด ๋ฐ์ํ ๊ฒ ๊ฐ์ต๋๋ค. ์ปค์คํ
ํ์์ด ์์ ๋๋ฉด Queryable! { struct S; }
์ ์ง์ํ ํ์๊ฐ ์์ผ๋ฏ๋ก ๋ ์ด์ ๋ฌธ์ ๊ฐ๋์ง ์์ต๋๋ค.
๊ทธ๋์ diesel
์
๋ฐ์ดํธํ์ฌ
Queryable!
๋ #[macro_use] extern crate diesel_codegen;
์์ด๋ ๊ณ์ ์ง์๋ฉ๋๋ค.#[derive(Queryable)]
์์ง๋ง Queryable!
, ์ง์๋ฉ๋๋ค #[macro_use] extern crate diesel_codegen;
.ํ ๋ก ์ ์ํด IRC์์ ์ ๋ฅผ ์์ ๋กญ๊ฒ ํํ์ญ์์ค. PR์ ์์ฑํด ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
ํธ์ ๋ด์ ๊ฐ๊ธฐ
ํธ๋ ์ด ํธ์ ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ ์์น์ ์๊ธฐ ๋๋ฌธ์ ํธ๋ ์ด ํธ์ ํธ๋ ์ด ํธ ๊ฐ์ฒด๊ฐ ์๋ํ๋์ง ์ฌ๋ถ์ ๋ํด ๋ค์ ํ์์ ์ด๋ผ๊ณ ํฉ๋๋ค.
@eddyb์ ์๊ฒฌ์ ๋์ํฉ๋๋ค. ํธ์์ฑ๊ณผ ํธ์์ฑ์ ์ํด ์์ฑ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ฉด ์์ฑ์ ํ์ฅํ๋ฉด๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๊ฐ ์ข ๋ ์ ์ฐํ ํ์ฅ ์์คํ
์ ์ํ๋ค๋ฉด ๋๋ ์ฐ๋ฆฌ๊ฐ traits๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง, ๊ทธ traits๋ Self
์ฐธ์กฐํ์ง ์๋ ๋ฉ์๋ ๋ชจ์์ผ๋ก ์ ์ ๋ ๊ฒ์
๋๋ค.
trait CustomDerive {
fn foo(); // note: no self
fn bar(); // again, no self
}
๊ทธ๋ฐ ๋ค์ struct my_annotation_type;
์ ๊ฐ์ ๋๋ฏธ ์ ํ (์์ฑ๊ณผ ๊ฐ์ ์ด๋ฆ์ ๊ณต์ ํฉ๋๊น?)์์ ๊ตฌํํ๊ณ ํน์ฑ ๋ถ์์ ์ฌ์ฉํ์ฌ <my_annotation as CustomDerive>::foo
์ ๊ฐ์ ๊ด๋ จ ํจ์๋ฅผ ์ถ์ถํฉ๋๋ค (์๋ง๋ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ๋). ์์ ์ my_annotation
์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ฑฐ๋ ํ์๋กํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. ์ด๋ ๊ด๋ จ ํจ์๋ฅผ ๋ฌถ๋ ๊ทธ๋ฃนํ ๋ฉ์ปค๋์ฆ ์ผ๋ฟ์
๋๋ค.
ํ์คํ ๊ฐ์ฅ ์ฐ์ํ ๊ฒ์ ์๋์ง๋ง ๋ ์ข์ ๋ฐฉ๋ฒ์ด ํ์คํ์ง ์์ต๋๊น? ๋๋ ์ฐ์ํจ์ด ์ฐ๋ฆฌ๊ฐ ์์ฑ ๊ธฐ๋ฅ์ผ๋ก ์์ํ๊ณ ์ถ์๋ ์ด์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. =)
๋ค์ ์คํ์ด์ค์ ๊ด๋ จํ์ฌ @sgrif ๋ #[cfg]
๋ฐ cfg!
์์ ์์ ์ข์ ์ฌ๋ก์
๋๋ค. ๋๋ ํ์คํ ํ๋๊ฐ ์ํ๋ ์์ํ ์ #[derive(SomeTrait)]
๊ณผ๋ ๊ฐ์ ๋ช ๊ฐ์ง ๋งคํฌ๋ก๊ฐ SomeTrait! { ... }
๋ฌด์ธ๊ฐ๋ฅผ ์์์ .... =) ๊ทธ๋ฌ๋ @jseyfried ๋ ๋ํ ์ฐ๋ฆฌ๊ฐ ํ๊ณ์ ๋ถ๋ชํ์ง ์๋ ํ _ ์ด๋ฏธ _.
๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ์ ์ ์์ ๋ค์ ์คํ์ด์ค๋ฅผ ์ ํธํ๋ ๊ฒฝํฅ์ด ์๋๋ฐ, ๋๋ถ๋ถ ๊ฐ / ์ ํ ๋ค์ ์คํ์ด์ค ๋ถํ ์ด ์ด์ ์ฐ๋ฆฌ์๊ฒ ๊ฐ์ ธ ์จ๋ค๊ณ ์๊ฐํ๋ ๊ณ ํต ๋๋ฌธ์ ๋๋ค. ์ฆ, ์๋ ค์ง ๋ฌธ์ ์ ์ ๋๋ถ๋ถ์ด ์ฌ๊ธฐ์ ์ ์ฉ๋์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
use foo::bar
๋ผ๋ ๋ชจ๋์ bar
์ผ๋ก ๊ฐ์ ธ ์ค๊ฑฐ๋ ๊ฐ์ ธ ์ค์ง ์์ ์ ์์ผ๋ฏ๋ก bar::baz
์ ๊ฐ์ ์ด๋ฆ ํ์ธ๊ณผ ๊ด๋ จ์ด์์ ์๋ ์๊ณ ๊ทธ๋ ์ง ์์ ์๋ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฆ ํ์ธ์ ์ด๋ ค์์ด ์์ต๋๋ค. ํ์ง๋ง ๋์ฒด๋ก ์ฐ๋ฆฌ๊ฐ ๋ค๋ฆฌ๋ฅผ ๊ฑด ๋๊ธฐ ๋๋ฌธ์ ์์ฒด ๋ค์ ์คํ์ด์ค์์ "์ฌ์ฉ์ ์ง์ ํ์"์ ์ฌ์ฉํ๋ ๊ฒ์ด ํน์ ๋ฌธ์ ๋ฅผ ๊ฐ์ ธ ์ค๋์ง ํ์คํ์ง ์์ต๋๋ค.
derive_
์ ๋์ฌ๋ฅผ ์์ฑ ๋ ๋งคํฌ๋ก์ ์ถ๊ฐํ์ฌ ๊ฐ์ ๋ค์ ์คํ์ด์ค๋ก ๋ง๋ค ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ทธ ๋ณํ๋ฅผ ์ํ๋ค๋ฉด ์ง๊ธ์ด ๋ฐ๋ก ๊ทธ๋๊ฐ ๋ ๊ฒ์
๋๋ค.
@keeperofdakeys ์ฌ์ฉ์ ์ง์ ํ์ ์ด๋ฆ์ derive_*
์ง์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ ์ฌ์ฉ์ ์ง์ ํ์ ์์ฑ์์ ๋์ผํ์ง ์์ต๋๊น? ์ด์จ๋ derive_*
์ด๋ฆ์ ์ต์ข
์ฌ์ฉ์์๊ฒ ๋๋ฌด ์ถํ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฟก ๋นต๋จ
ํ์ง๋ง ๋์ฒด๋ก ์ฐ๋ฆฌ๊ฐ ๋ค๋ฆฌ๋ฅผ ๊ฑด ๋๊ธฐ ๋๋ฌธ์ ์์ฒด ๋ค์ ์คํ์ด์ค์์ "์ฌ์ฉ์ ์ง์ ํ์"์ ์ฌ์ฉํ๋ ๊ฒ์ด ํน์ ๋ฌธ์ ๋ฅผ ๊ฐ์ ธ ์ค๋์ง ํ์คํ์ง ์์ต๋๋ค.
๊ฐ์ ธ ์ค๊ธฐ ํ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์์์ ๋ง์ ๋ค์ ์คํ์ด์ค๋ฅผ ์ฒ๋ฆฌ ํ ์ โโ์์ง๋ง ๊ฐ ๋ค์ ์คํ์ด์ค์ ๋ํด ์ ์ฌ์ ์ผ๋ก ์ฌ์ํ ์์ ์์
์ ์ํํฉ๋๋ค. ํนํ ๊ฐ ๊ฐ์ ธ ์ค๊ธฐ I
๋ฐ ์ฌ์ฉ๋์ง ์์ ๊ฐ ๋ค์ ์คํ์ด์ค S
์ ๋ํด S
์์ I
์ด ์คํจํ์์ ์ฆ๋ช
ํฉ๋๋ค (https : // github. com / rust-lang / rfcs / pull / 1560 # issuecomment-209119266). ์ด ์ฆ๋ช
์ ๊ด๋ จ ๋ถํ์ ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ๊ฒ์ํ๊ธฐ ์ํด ์ข
์ข
glob ๊ฐ์ ธ ์ค๊ธฐ ๊ทธ๋ํ์ DFS (์ ์ ์ด ๋ชจ๋์ด๊ณ ๊ฐ์ฅ์๋ฆฌ๊ฐ glob ๊ฐ์ ธ ์ค๊ธฐ ์)๊ฐ ํ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ฌํ ์ถ๊ฐ ๋ค์ ์คํ์ด์ค ๋ณ ์์ ์ ์ค์ ๋ก ์ฐจ์ด๋ฅผ ๋ง๋ค์ง ์์ ์ ์์ผ๋ฉฐ ํ์ํ ๊ฒฝ์ฐ ํผํ ์ ์์ต๋๋ค (https://github.com/rust-lang/rfcs/pull/1560#issuecomment-209119266 ์ฐธ์กฐ). ๋งคํฌ๋ก ๋ค์ ์คํ์ด์ค์๋ง ์ ์ฉ๋๋ ์ฌ์ํ ์ ํ์ ๋๋ค.
์ ๋ # 37198์ ๋ค์ ์คํ์ด์ค๋ฅผ ๋ณํฉํ์ฌ ๋๋ถ๋ถ์ ์ต์ ์ ์ด์ด๋๊ณ ์ค์ ๋ก ์ ํ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฌ๋๋ค์ด ์ค๋ ๊ทธ๊ฒ์ ์ํ๊ณ @ rust-lang / lang์ด ์ฌ๋ฌ ๋งคํฌ๋ก ๋ค์ ์คํ์ด์ค๋ฅผ ์์ํ ๊ฐ์ง๊ณ ์์ด๋ ๊ด์ฐฎ๋ค๋ฉด ์ด์๊ฐ ์์ต๋๋ค.
๋ฟก ๋นต๋จ
๋๋ ๋น์ ์ ์ ๋ต์ด ๋๋๊ฒ๋ ํจ๊ณผ๊ฐ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ด ๊ฐ์ธ์ ์ธ ๋๋์ ์ด์ ํจ์ด ๋ฌด๊ฒ๋ฅผ ๋น๊ธฐ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค (์ : ์ค๋ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ๊ด์ฐฎ์ต๋๋ค).ํ์ง๋ง ์ด๋ค ๋ฐฉ์ ์ผ๋ก๋ ๊ตฌํํ ์ ์์ด์ผํฉ๋๋ค.
@alexcrichton ๋ด๊ฐ ์ ์ ์ผ๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ฒ๋ผ, ๋ ๋ง์ ํ์ด ํ์ํ ๋๊น์ง ๊ธฐ๋ค๋ฆด ์์์ด ๊ธฐ์ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ด๊ฐ ์ค๋ช
ํ ํน์ฑ์ด๋ ๋ ๋์ ๊ฒ์ ํ ์ ์์ต๋๋ค. ์ง๊ธ์ fn
์ ์ฉ๋ ์์ฑ์ ํ์ฅํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํธ๊ธฐ์ฌ์ด ์๊ฒผ๊ณ ์ด ์์ด๋์ด์ ๊ธฐ๋ณธ ๊ตฌํ์ ์์ํ์ต๋๋ค (ํญ๋ชฉ์ ์ฌ์ฉ ๋ ๊ฒ์ผ๋ก ํ์ ํ ์์ฑ ์ด๋ฆ์ ๋ํ๋ด๋ proc_macro ํจ์์ ์์ฑ ์ฌ์ฉ).
์ฐ๋ฆฌ๊ฐ ์์ง ์์ ํ ํ ์ค๋น๊ฐ ๋ ์ง์ ์ ๋๋ฌํ์ง ์์ ๊ฒ์ด ๋ถ๋ช ํด ๋ณด์ด๊ธฐ ๋๋ฌธ์ FCP ํ๊ทธ๋ฅผ ์ง ์ ์ต๋๋ค. ์ ๋ ๋ํ์ ์ํ๋ฅผ ์์ฝํ๊ณ ํนํ ํ๊ณ ํ ๊ฒฐ์ ๋ฐ / ๋๋ ์ฝ๋ ๊ธฐ์ฌ๊ฐ ์ฌ์ ํ ํ์ํ ์ค๋ฅ๋ฅผ ๊ฐ์กฐํ๊ธฐ ์ํด ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค.
์ ์ :
#[proc_macro]
๋ฅผ ํ์ฅํ๊ณ rustc์๊ฒ ๊ทธ๊ฒ๋ค์ "์ค๊ณ "๋ก ๊ฐ์ฃผํ๊ณ ๋ฌด์ํ๋ผ๊ณ ์ง์ํ์ญ์์ค.๋ค์์ ๋ํ ์ธ์ :
#[derive(Foo)]
๋ foo!
)์ด ์ด๋ฏธ ๋ชฉ์ ์ ๋ฌ์ฑํ์ต๋๋ค.use foo::Bar
์ ์ด์จ๋ ๋น์ ์ด ์๋ฏธํ๋ ๋ค์ ์คํ์ด์ค๋ฅผ ๊ตฌ๋ถํ ์ ์์ผ๋ฏ๋ก ๊ณต์ ํ์ง ์์ ๊ฒฝ์ฐ ํผ๋ ํ ์ฌ์ง๊ฐ ์ ์ต๋๋ค.๋ฐ๋ ์ฃผ์ฅ :
#[cfg()]
๋ cfg!()
#[cfg()]
๋ cfg!()
๊ฐ ์ค๋ ๋ฐ์ํฉ๋๋ค (๊ทธ๋ฌ๋ ์ด๋ค ์ค ์ด๋ ๊ฒ๋ ์ฌ์ฉ์ ์ ์ ํ์์ด ์๋๋ฉฐ ๋งคํฌ๋ก๊ฐ ์คํ์ค์ธ ์ปจํ
์คํธ๋ฅผ ์๋ ค ์ค์ผ๋ก์จ ์์ฉ ํ ์ ์์)์ ์ :
๋ค๋ฅธ ๋ฏธํด๊ฒฐ ์ง๋ฌธ์ด ์์ต๋๊น?
๋์ฐ๋ณ์ด ๋ฌธ์ ์ ๋ํ ์ ์ฌ์ ํด๊ฒฐ์ฑ :
์ ํ์ด TokenStream -> TokenStream
์ธ ์ฌ์ฉ์ ์ ์ ํ์ ๋์ ์ ํ์ด ์์ต๋๋ค.
Item -> TokenStream
, ์ฌ๊ธฐ์ Item
๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์์ํ๋ ๋ถํฌ๋ช
ํ ์ ํ์
๋๋ค.
item.tokens()
, ์ค๋ ์ ๋ฌ ๋ TokenStream
๋ฐํitem.use_attrs(name)
, ์ง์ ๋ ์ด๋ฆ์ ๋ชจ๋ ์์ฑ์ด ์ฌ์ฉ๋จ์ผ๋ก ํ์๋ฉ๋๋ค.๋ฐํ ๋ TokenStream
์๋ ํ์ ๋ impl
๋ง ํฌํจ๋ฉ๋๋ค.
๊ฒฐ๊ตญ ํธ์ ๊ธฐ๋ฅ (์ : ํญ๋ชฉ์ ํ๋ / ๋ณํ์ ๋ํ ๋ฐ๋ณต) ๋๋ syntax_ext::deriving::generic
์๋ ๊ฒ๊ณผ ๊ฐ์ ์์ ์์ค ํ์ API๋ฅผ ์ฌ์ฉํ์ฌ Item
์ API์ ์ถ๊ฐ ํ ์ ์์ต๋๋ค.
#[proc_macro_derive]
(์ : https://github.com/rust-lang/rust/issues/35900#issuecomment-258315395์ ์ง๋ฌธ 1์ ๋ํ ๋ ๋ฒ์งธ ์ ์) ํ๊ฒ๋์ด ๊ธฐ์ฉ๋๋ค. ๋ด Item -> TokenStream
์ ์.
๊ธฐ๋ณธ ํญ๋ชฉ์ ๋ณ๊ฒฝํ ์์๋ ์ฌ์ฉ์ ์ ์ ํ์์ ์์ ํํ๋ ๊ฒ์ ์ค์๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋์ฐ๋ณ์ด๋ฅผ ํ์ฉํ์ฌ ํฌ์ํ๋ ์คํฌ ์ ๋ณด๋ ์ด๋ฏธ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, # 37563 ์์ ๊ณผ # 36218 ์์ ์ค์์ ์ ํํด์ผํฉ๋๋ค.
๋ช ๋ นํ ํ์ดํธ ๋ฆฌ์คํ ์ ๋งค๋ ฅ์ด ๋ณด์ด์ง ์์ต๋๋ค. ๋๊ตฌ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์๊ฐํด ๋ผ ์ ์์ต๋๊น?
์ด ์ฝ๋๊ฐ ์ปดํ์ผ๋๋ ๊ฒ์ด ์๋์ / ์ํ๋ ๊ฒ์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
#![feature(proc_macro)]
#[proc_macro_derive(Whatever)]
struct Foo {}
@eddyb ๋ช
๋ น ์ ํ์ดํธ๋ฆฌ์คํธ์ ๊ณ ์ ํ ๋งค๋ ฅ์ด ์๋์ง ํ์คํ์ง ์์ต๋๋ค.
Item -> TokenStream
๋ ๋ ๋ง์ ์ข
๋ฅ์ ์ ์ธ์ ์์ฑ์ ์ถ๊ฐํ๋ ๊ฒ๋ณด๋ค Item
์ API๋ฅผ ํ์ฅํ๋ ๊ฒ์ด ๋ ์ฝ๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ ์กด์ฌ๋ ํ์๋ก ๋ค๋ฅธ ๋ง์ ์ฌ์ฉ ์ฌ๋ก๊ฐ๋์ง ์์ ์๋ ์์ต๋๋ค, ์ข ๋ ์ด๊ฒ์ ๋ํด ์๊ฐํ๋ค Item
์ด์ TokenStream
, ๊ทธ๋์ TokenStream
-> TokenStream
์ ์ธ์ ํ์ดํธ๋ฆฌ์คํธ๊ฐ์๋
๋งคํฌ๋ก 2.0์ด์ด API๋ฅผ ๋์ฒดํฉ๋๊น? ๊ทธ๋ ๋ค๋ฉด ํ์ฅ ์ฑ์ ์ค์ง์ ์ธ ๋ฌธ์ ๊ฐ ์๋๋ฉฐ Item -> TokenStream
api๋ ๊ทธ๋ค์ง ๋งค๋ ฅ์ ์ด์ง ์์ต๋๋ค.
RFC์ ๋ฐ๋ฅด๋ฉด @keeperofdakeys :
์ ๋ฐ์ ์ผ๋ก ์ด๊ฒ์ ๊ณต์ "๋งคํฌ๋ก 2.0"์ ํฅํ ์ ์ง์ ์ธ ๋จ๊ณ๋ก ๊ฐ์ฃผ๋์ด์ผํฉ๋๋ค.
๋งคํฌ๋ก 1.1์ ์๋๋ ๋ฐฉ๋ํ ๊ธฐ๋ฅ์ ์์ ํํ์ง ์๊ณ ๋ ์ ์ ๊ณผ ๊ตฌํ๋ฉด์์ ๋งคํฌ๋ก 2.0์ ์ต๋ํ ๊ฐ๊น๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ์๋ฏธ์์ ์์ ์ ์ธ ๋งคํฌ๋ก 1.1์ด ์ฃผ์ด์ง๋ฉด ๋งคํฌ๋ก 2.0์ ๋๋ฌํ๊ธฐ ์ํด ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋ ๊ธฐ๋ฅ์ ๊ณ์ธตํ ํ ์ ์์ต๋๋ค.
https://github.com/rust-lang/rfcs/pull/1681#issuecomment -233449053 ๋ฐ https://github.com/rust-lang/rfcs/pull/1681#issuecomment -233708395 ๋ฐ https : // github. com / rust-lang / rfcs / pull / 1681 # issuecomment -239558657์ ๋งคํฌ๋ก 2.0์ด ๋์ฐฉํ๋ฉด "์ ํ๋"์ง์ ์ค๋จ ๋ง ์์๋จ์ ๋ํ๋ด๋ ๊ฒ ๊ฐ์ต๋๋ค. ํนํ : "๋ฌธ์์ด ํ ํ ํฐ ํธ๋ฆฌ์ ํจํด์ ์ค์ ๋ก ์ฌ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ์๋ ์ ํธ๋์ง ์์ต๋๋ค."
@eddyb
๋ช ๋ นํ ํ์ดํธ ๋ฆฌ์คํ ์ ๋งค๋ ฅ์ด ๋ณด์ด์ง ์์ต๋๋ค. ๋๊ตฌ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์๊ฐํด ๋ผ ์ ์์ต๋๊น?
๊ธ์, ๋๋ ์์ฑ์ ์ด๋ฆ์ด ์ด๋ค ๋ฐฉ์ ์ผ๋ก๋ ๋์ ์ผ๋ก ์์ฑ๋๋ ๊ฒฝ์ฐ๋ฅผ ์์ํ ์ ์์ต๋๋ค (์๋ง๋ ์ ํ ๋๋ ํ๋์ ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก?). ๋ฐ๋ผ์ ๋ฏธ๋ฆฌ ์ ์ธ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ผ์ข ์ ์ธ๊ณต์ ์ธ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฉฐ ํนํ ์ข์ ์ต๊ด์ ์๋๋๋ค.
@jseyfried ์ ๋์์ด ๋งค๋ ฅ์ ์ด๋ผ๊ณ โโ์๊ฐํฉ๋๋ค. ์์ฑ์ ์ฌ์ฉ ๋ ๊ฒ์ผ๋ก ํ์ํ๋ ํ์ ํน์ฑ ๋๋ฌธ์ด ์๋๋ผ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ Item
API๊ฐ ๋ ํ๋ถํด์ง ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ์ฆ, ์ฐ๋ฆฌ๋ ๋งค์ฐ ๊ตฌ์กฐํ ๋ ๋ฐฉ์์ผ๋ก ํ๋ ์ธํธ๋ฅผ ๊ฑท๋ ๊ฒ์ ์ง์ํ๊ณ , ์ฐ๋ฆฌ๊ฐ ์ฒ๋ถ ํ ์์๋ ๋ ๋ง์ ๋ฐ์ดํฐ (์ด๋ฆ ํ์ธ๊ณผ ๊ฐ์)์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๋ค.
๋ฌผ๋ก ,์ด ์ค ์ผ๋ถ๋ ํ์ค AST API์ ์ผ๋ถ ํ์ (_eventually_)์์๋ ์ ๊ณต๋ฉ๋๋ค.
ํ์ด๋ฐ์ ๋ํ ์ฐธ๊ณ ์ฌํญ : ์ ๋ง ๋ค์์ฃผ๊ธฐ์์ ๋งคํฌ๋ก 1.1์ด ์์ ํ๋๋ ๊ฒ์๋ณด๊ณ ์ถ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ฐจ๋จ ๋ ๊ฒ์ ๊ถ๊ทน์ ์ผ๋ก ์๋นํ ์ฌ์ํ ๋๋์ ๋๋ค.
๊ทธ๋ฐ ์ ์ ์ผ๋ก ๋ด๊ฐ ์ค๋ช ํ ๋ฌธ์ ์ ๋ํ ๋์ ๊ฒฌํด :
#[proc_macro]
ํ์ฅ _or_ ์ ํ์ Item
๋ณ๊ฒฝํ๋ ๊ฒ์ ๋ง์กฑํฉ๋๋ค. ๋๋ ๋ํ ์ฐ๋ฆฌ๊ฐ ์ด๋ค ๊ฒ์ ์ ํํ๋ ๊ทธ๊ฒ์ด ์ข์ ์๊ฐ์ฒ๋ผ ๋ณด์ด๋ฉด ๋ฏธ๋์ ๋ค๋ฅธ ๊ฒ์ ์ ์ฌ์ ์ผ๋ก ์ฑํ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋จผ์ ๊ตฌํ๋๋ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค. =)#[cfg]
์ cfg!
๊ตฌ๋ณํ๋ ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ ํ ์์๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๊ฑฐ๋ ์ํ๋ ๊ฒฝ์ฐ ๋ถํ ๋ค์ ์คํ์ด์ค _then_์ ๋์
ํ ์ ์์ต๋๋ค. ํตํฉ ๋ค์ ์คํ์ด์ค๋ฅผ ๊ฐ๋ ๊ฒ์ด ํนํ ์ฌ์ฉ์ ์ง์ ํ์ ์ฌ์ฉ ์ฌ๋ก์ ํด๋ฅผ ๋ผ์น๋ ๊ฒ ๊ฐ์ง๋ ์์ต๋๋ค. ์ด๋ ์ด์จ๋ ์์ ํ์ ๋ํด ์ด์ผ๊ธฐํ๋ ์ ์ผํ ๊ฒ์
๋๋ค. ๊ถ๋ฆฌ?@nikomatsakis ๊ทํ์ ์์ฝ์ ์ ํํฉ๋๋ค. ์์ฑํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! Rust 1.14์์ ๋งคํฌ๋ก 1.1์ ์ป์ง ๋ชปํด ์ํ๊น์ง๋ง ์ด๊ฒ์ด ๋ ผ์์ ์ฌ์ง๊ฐ์๋ ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์ดํดํฉ๋๋ค.
๋ด ๊ฐ์ธ์ ์ธ ๋๋์ ์ฌ์ฉ์ ์ง์ ํ์์ด ์์ฑ์ ์ ๊ฑฐํด์ผํ๊ณ ๋ค์ ์คํ์ด์ค๊ฐ ํ๋ ๋ฟ์ธ ๋ชจ๋ ๊ฒ์์๋ ๊ทธ๋๋ก ์์ ํํ๋ ๊ฒ์ ๋๋ค.
์ ๋ Item -> TokenStream
API๋ฅผ ๋ฐ๋ฅด์ง ์์ต๋๋ค. ๋ฐํ ๋ ํ ํฐ ์คํธ๋ฆผ์ด ์ฌ์ ํ ์๋ ํญ๋ชฉ์ ํฌํจํฉ๋๊น ์๋๋ฉด ์ถ๊ฐ ๋ impls ๋ง ํฌํจํฉ๋๊น? &mut Item
ํ์ํ๋ค๋ ๋ป์
๋๊น?
@ est31 ๊ทํ์ ์๊ฒฌ ์ ๋ฒ๊ทธ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ๋ณ๋์ ๋ฌธ์ ๋ฅผ ์ด โโ์ ์์ต๋๊น?
๋๋ @nikomatsakis ์ ์๊ฒฌ์ ๊ฑฐ์ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ํ์๋ฌผ์ด ์ฐ๊ฒฐ๋ ํญ๋ชฉ์ ๋ณ๊ฒฝํ ์์ ํต์น๊ถ์ด ์๋ค๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํ์ง๋ง ์ ์ ๋ ๋ชจ๋ ๊ตฌํ์ ๋์๊ฒ ๊ด์ฐฎ์ ๋ณด์ ๋๋ค.
ํตํฉ ๋ค์ ์คํ์ด์ค๋ฅผ ๊ฐ๋ ๊ฒ์ด ํนํ ์ฌ์ฉ์ ์ง์ ํ์ ์ฌ์ฉ ์ฌ๋ก์ ํด๋ฅผ ๋ผ์น๋ ๊ฒ ๊ฐ์ง๋ ์์ต๋๋ค. ์ด๋ ์ด์จ๋ ์์ ํ์ ๋ํด ์ด์ผ๊ธฐํ๋ ์ ์ผํ ๊ฒ์ ๋๋ค. ๊ถ๋ฆฌ?
ํ์ฌ Queryable!
๋ผ๋ ๋งคํฌ๋ก๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋์ ค์ด ๊ณ ์ฅ ๋ฌ๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.์ด ๋งคํฌ๋ก๋ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ํํ์ฌ Queryable
๋ฅผ ํ์์ํฌ ์ ์์ต๋๋ค.
์ง๊ธ ๋น์ฅ ๋์ ค์ ์ฌ์ฉํ๊ฑฐ๋ ์ ์งํ์ง ์๋ ์ฌ๋์ผ๋ก์ (์ฆ, ๋ด๊ฐ ์ ์ํ๋ ค๋ ๊ฒ์ ์ํฅ์๋ฐ์ง ์๋ ์ฌ๋์ผ๋ก์ : sweat_smile :), ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ง๊ธ์ 1 ๊ฐ์ ๋ค์ ์คํ์ด์ค๋ฅผ ์ ์งํ๊ณ ๋์ ค์ ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ ๊ฒ์
๋๋ค. ํด๋น ๋งคํฌ๋ก๋ฅผ derive_Queryable!
๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ผ๋ก ์ง์ ํฉ๋๋ค. ์ด์จ๋ ์ด๊ฒ์ด ์์ ๋๋ฉด ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ ๊ฒ์
๋๋ค.
์ ์ ๋ ๊ธฐ๋ฅ์ ๋ํด PR https://github.com/rust-lang/rust/pull/37614 ๋ฅผ ๋ง๋ค์์ต๋๋ค. ๋ณ๋์ ์์ฑ #[proc_macro_attributes(..)]
๋ฅผ ์ฌ์ฉํ๋ฉฐ ๋ ์ด์ ๋ฐํ ๋ TokenStream
์๋ ํญ๋ชฉ์ ๋ฐํ ํ ํ์๊ฐ ์์ต๋๋ค.
proc ๋งคํฌ๋ก๊ฐ $crate
์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผํ๋์ง ์์๋ณด๊ธฐ ์ํด # 37637์ ์ ์ถํ์ต๋๋ค.
๋ช ํํํ๊ธฐ ์ํด,์ด ์ฌ์ฉ ์ฌ๋ก๊ฐ ๊ด์ฐฎ์ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๊น ์๋๋ฉด ์์คํ ์ ์ค์ฉ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๊น?
์ฌ๊ธฐ ์์ ๊ธฐ์กด ๊ตฌ์กฐ์ฒด์ ์์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ์ ๊ตฌ์กฐ์ฒด๋ฅผ ์์ฑํ๊ณ ํ๋์ ๊ตฌ์กฐ์ฒด๋ก ํตํฉ ํ ์์๋ ๋์์ธ์ด ๋ง์์ ๋ญ๋๋ค.
๊ทธ๋ฌ๋ ์์คํ ์ด ๋์ค์ ์ด๋ฌํ ์ข ๋ฅ์ ๊ตฌํ์ ํ์ฉํ์ง ์๋๋ก ๋ณ๊ฒฝ ๋ ์ ์๋ค๋ฉด ๋ ๋ง์ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ด๋ ๋์ ์ง๊ธ ์ค๋จ ํ ์ ์์ต๋๋ค (ํ์ฌ ๊ตฌํ์ ๊ฐ๋ ์ ๋น ๋ฅธ ์ฆ๋ช ์ผ๋ฟ์ ๋๋ค).
ํํ
์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ ์ด์ ํญ๋ชฉ์ ์์ ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค (TokenStream์์ ๋ค์ ์ ๋ฌํ์ง ์์). ๋๋ impl ์ด์ธ์ ๋ค๋ฅธ ๊ฒ์ ํ์ํ๋ ๊ฒ์ ์๋ ๋ ๊ฒ์ด ์๋๋ผ๊ณ ๋งํ๊ณ ์ถ์ง๋ง, ๋น์ ์ด ์ด๊ฒ์ํ๋ ๊ฒ์ ๋ง์ ์๋ ์์ต๋๋ค. ์ด๋ฆ ์ถฉ๋์์ฃผ์ํด์ผํฉ๋๋ค.
๋ค๋ฅธ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ํญ๋ชฉ์ ๋ํ ์ฌ์ฉ์ ์ง์ ์์ฑ ์ค๋ฅ๋ฅผ ํธ๋ฆฌ๊ฑฐํ์ง ์์์ผํ๋ ์์ฑ ์ด๋ฆ ๋ชฉ๋ก์ ์ ๊ณต ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
RE : Diesel์ ๋ค์ ์คํ์ด์ค ์ถฉ๋์ ๋๋ค. ์ด ๊ธฐ๋ฅ์ด ์์ ๋๋ฉด ๋งคํฌ๋ก๋ฅผ ๋ ์ด์ ์ฌ์ฉํ์ง ์์์ง, ์๋๋ฉด ์ปดํ์ผ๋ฌ ํ์ฅ์ด ํ์ ์๋์ง์ ๋ํ ์๊ตฌ๊ฐ ์๋์ง์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ์์ฌ ์ค๋ฝ๋ค. ๋ด๋ถ ํ ์คํธ์ ์ฌ์ ํ ์ ์ฉํ์ง๋ง ์ด๋ฆ์ ๋ฐ๊พธ๋ ๊ฒ์ ๊ด์ฐฎ์ต๋๋ค.
์ ๋ ฅ ์คํธ๋ฆผ์ ์์ ํ๋ ๊ธฐ๋ฅ์ ์๋ ๊ฒ์ ๋ถํํ ์ผ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฃผ์์ด ๋ฌ๋ฆฐ ํญ๋ชฉ์ ์ ๊ฑฐ ํ ์ ์์ผ๋ฏ๋ก์ด ์์คํ ์์๋ ๋ฑ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋๋ ๊ทธ ์ฐ๋ ค๋ฅผ ์ดํดํ์ง๋ง ๊ทธ๋ค์ ๋ํ ๋ฅ๋ ฅ์ ์๋ ๊ฒ์ ๋ถ๋๋ฌ์ด ์ผ์ ๋๋ค.
@TheNeikos @sgrif ๋ด ๊ด์ ์ ์ ๋ ฅ์ ์ฌ๊ฐํ๊ฒ ์์ ํ๋ ๊ฒ์
ํญ๋ชฉ์ ์์ ํ ์ ์๋ค๋ ๊ฒ์ ํญ๋ชฉ์ ๋ฒ์ ์ ๋ณด๊ฐ ์ ์ง๋จ์ ์๋ฏธํ๋ฏ๋ก ํญ๋ชฉ์ ๋ํ ์ค๋ฅ ๋ฉ์์ง๊ฐ ํจ์ฌ ๋ ๋ช ํ ํด์ง๋๋ค (๋ํ ํ์ ๋ ์ถ๋ ฅ์ ์ค๋ฅ ๋ฉ์์ง๊ฐ ๋ ์ด์ ํญ๋ชฉ์ ๋ฒ์๋ฅผ ๊ฐ๋ฆฌ ํค์ง ์๊ณ ํ์ ์์ฑ์ ๋ฒ์๋ฅผ ๊ฐ๋ฆฌํด์ ์๋ฏธ ํจ). ์ฐ๋ฆฌ๊ฐ ์ ๋ง๋ก ์ ์ ํ ์ ์ฐจ ์ ๋งคํฌ๋ก๋ฅผ ์ํ๋ค๋ฉด ์ฌ๋๋ค์ด์ด ๊ธฐ๋ฅ์ ๋จ์ฉํ๋๋ก ํ์ฉํ๋ ์ข์ ์ด์ ๋ฅผ ์ ์ ์์ต๋๋ค.
@TheNeikos ๋๋ ๋น์ ์ด ํ์ํ๋ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ชจํฐ๋ธ๋กํ์ง ์๋ ํ ํ์์ ํตํด ์๋ก์ด ๊ตฌ์กฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ ํ์ฉํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ ๊ฐ ์๊ฐํ๊ธฐ์ ๊ด์ฉ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ์๋ก์ด ์ ํ์ ์์ฑํ๋ ๊ฒ์ด ๊ด์ฐฎ๋ค๊ณ ์๊ฐํ์ง๋ง ์ด๋ฌํ ์ ํ์ด ํ์๋๋ ํน์ฑ๊ณผ ๊ด๋ จ๋ ์ ํ์ด๋ฉด ํจ์ฌ ์ข์ต๋๋ค. ์๋ฅผ ๋ค์ด, Iterator
๊ตฌ์กฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ์ ํ์ ๋ํด IntoIterator
๋ฅผ ํ์์ํฌ ์ ์๋ค๊ณ ์์ํด๋ณด์ญ์์ค. ๊ฐ๋
์ ์ผ๋ก์ด ์ ํ์ ๋ํ ๋์์ ์ ๋ํด์ผํ์ง๋ง ํด๋น ๋์์ "ํน์ฑ ๊ฐ์ฒด"๊ฐ ์๋ ์ ์์ต๋๋ค.
ํ
์ ๋ ฅ ์คํธ๋ฆผ์ ์์ ํ๋ ๊ธฐ๋ฅ์ ์๋ ๊ฒ์ ๋ถํํ ์ผ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฃผ์์ด ๋ฌ๋ฆฐ ํญ๋ชฉ์ ์ ๊ฑฐ ํ ์ ์์ผ๋ฏ๋ก์ด ์์คํ ์์๋ ๋ฑ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋๋ ๊ทธ ์ฐ๋ ค๋ฅผ ์ดํดํ์ง๋ง ๊ทธ๋ค์ ๋ํ ๋ฅ๋ ฅ์ ์๋ ๊ฒ์ ๋ถ๋๋ฌ์ด ์ผ์ ๋๋ค.
ํ , ๋๋ ๋ถ๋ช ํ ๋์ ์ ์ด์ง๋ง ( @nrc๊ฐ ์ง์ ํ๋ฏ์ด) ์ด๊ฒ์ ์์คํ ์ด ์ค๊ณ๋ ๊ฒ์ด ์๋๋ฉฐ ๋ค์ํ ๊ฑฐ์น ๊ฐ์ฅ์๋ฆฌ๋ฅผ ๋ ธ์ถ์ํค๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ์ด๊ฒ์ ์๋ง๋ ๋น์ ์ ์ฌ์ฉ ์ฌ๋ก์์ ์ค์ํ์ง ์์ ๊ฒ์ ๋๋ค. ์ค์ํ ์ง๋ฌธ์ "๋ฑ ๋งคํฌ๋ก 1.1"๊ณผ ๊ฐ์ ์ผ๋ก ์ ์ํ๊ฒ ์ด๋ํ ์์๋ ๋ฐฉ๋ฒ์ ๋๋ค.
PR์ด ๋ณํฉ๋์์ผ๋ฏ๋ก ๋ค์๋ ๋ฐค์ ๋ค์ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ธํ ์ ์์ต๋๋ค. proc_macro_derive ํจ์๋ ๋ ์ด์ ํญ๋ชฉ์ ๋ฐํํ์ง ์์์ผํ๋ฉฐ (๊ทธ๋ ๊ฒํ๋ฉด ์ ํ์ด ๋ ๋ฒ ์ ์๋๋ค๋ ์ค๋ฅ๊ฐ ๋ฐ์ ํจ) ์ด์ #[proc_macro_derive(Derive, attributes(Foo, Bar)]
์ ๊ฐ์ด ํ์ดํธ๋ฆฌ์คํธ์ ์์ฑ ์ด๋ฆ ๋ชฉ๋ก์ ์ ๊ณต ํ ์ ์์ต๋๋ค.
cc @dtolnay , @sgrif ^
๋ถํํ๋ ๊ณง ํ์๋ ๊ฒ์ ๋๋ค.
๋ค, ์ฐ๋ฆฌ ์ชฝ์์ ์ถ์ ํ๊ธฐ ์ํด https://github.com/serde-rs/serde/issues/614 ์ ์ ์ถํ์ต๋๋ค.
https://github.com/diesel-rs/diesel/pull/493 ์์ Diesel์ ํ์์ ์์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋์ดํ๋ฆฌ๊ฐ ๋ค์ ๊ตฌ์ถ๋๋ฉด ํ์คํ ์ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์์ด ์ค๋ ๋๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฝ๊ณ ์๋ค๋ฉด proc ๋งคํฌ๋ก๋ ์ด๊ธฐ ํญ๋ชฉ์ ์ถ๊ฐ ๋ ์ถ๊ฐ ํญ๋ชฉ ๋ง ๋ด๋ณด๋ผ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๊ธฐ ํญ๋ชฉ์ ๋ ๋ง์ ์ฃผ์์ ์ถ๊ฐ ํ ์ ์์ต๋๊น? ( "ํ์ ์ฃผ์"์ ํ์ฉํ๋ค๋ ์ธ๊ธ์ด ์์ง๋ง ๋ค๋ฅธ ๊ฒ์ ์์ต๋๋ค.)
์ฃผ์์ ๋ฌ๊ณ ์๋ ๊ตฌ์กฐ์ฒด์ ๋ฐ๋ผ ๋ค๋ฅธ #[derive()]
์ธํธ๋ก ํ์ฅ๋๋ (์๊ณ ๊ฒ์๋์ง ์์) ํฌ๋ ์ดํธ์ #[derive(newtype)]
proc ๋งคํฌ๋ก๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด #[derive(newtype)] struct Foo(u64)
๋ #[derive(Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] struct Foo(u64);
#[derive(newtype)] struct Foo(u64)
ํ์ฅ๋๋ ๋ฐ๋ฉด #[derive(newtype)] struct Foo(::semver::VersionReq)
๋ #[derive(Clone, Debug, PartialEq)] struct Foo(::semver::VersionReq);
ํ์ฅ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ๋์ด ๋งคํฌ๋ก์ ์ํด ์์ ๋์ง ์์ง๋ง ๋ค๋ฅธ ํ์ ํญ๋ชฉ์ด ์ถ๊ฐ๋ฉ๋๋ค (๊ตฌ์กฐ๋ฌผ๋ ์์ ํ์ง ์์).
์ด๋ฌํ ๊ตฌ์กฐ์ฒด๋ ์์ญ ๊ฐ๊ฐ ์์ผ๋ฉฐ ๊ฐ๊ฐ์ด ๋งคํฌ๋ก๊ฐ ํ์ฅ ๋ ํ 10 ๊ฐ ์ ๋์ ์๋ก์ด ํ์์ด ์์ต๋๋ค. ๋๋ ๋ชจ๋ u64
newtypes๊ฐ ํ๋ ์ด์์ ํน์ฑ์ ๊ตฌํํ๊ธฐ๋ฅผ ์ํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์ผ๋ฉด ๋ชจ๋ ๋จ์ผ ๊ตฌ์กฐ์ฒด ๋์ newtype
๋งคํฌ๋ก ์ฝ๋์ ํ ๊ณณ์์ ํ์ ์ธํธ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ ์ํด macro_rules newtype!
๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก proc ๋งคํฌ๋ก๋ก ์ ํํ์ต๋๋ค.
pub
๋ฑ์ ์ ๋ฌด๋ ์กฐํฉ ๋ ๋งคํฌ๋ก ๋งค์น ์ ์์ด๋ ๋ฌด๋ฃ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.์ํ๊น๊ฒ๋ ๋ ์ด์์ด ์์ ์ ํ ์ ์์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ ํฅํ ํธํ์ฑ์ด ์์ ์ ์ด๋ผ๋ ์ : ํ๋ฌ๊ทธ์ธ ํจ์๊ฐ "์์"์ผ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ํจ์์ ๋ถ์ฌ ๋ ๊ฐ์ฒด์ ์์๊ฐ ํฅํ์ ๋ณ๊ฒฝ๋๊ฑฐ๋ rustc๊ฐ ๋ฉํฐ ์ค๋ ๋๋ฅผ ๊ตฌํํ๋ฉด ๋ธ๋ ์ดํน ์ฒด์ธ์ง๊ฐ ๋ ๊ฒ์ ๋๋ค. ์ปดํ์ผ?
@ est31 ์๊ฐ์ด ์๋ค๋ฉด ์์ ์ธ๊ธ ํ IPC ๊ฒฉ๋ฆฌ๋ฅผ ์ ๊ฑฐํด์ผํฉ๋๋ค.
๊ฐ์ฅ ์ต๊ทผ์ ๋ณ๊ฒฝ ์ดํ ๋์ ค์์ ICE๋ฅผ ์ง์์ ์ผ๋ก๋ณด๊ณ ์์ต๋๋ค.
../src/librustc_metadata/decoder.rs:490 : entry : id not found : DefIndex (1) in crate "diesel_codegen"with number 28
@sgrif ๋ # 37793์ ์ํด ์์ ๋ # 37788 ๋ฌธ์ ๊ฐ ๋ ๊ฒ์ ๋๋ค (๋ด์ผ ๋ฐค์ ๋๋ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค ...).
@ est31 ์ผ๊ฐ ๋น๋๊ฐ ์์๋๊ธฐ ์ ์ ๋ณํฉํ๊ธฐ์๋์ด ์๊ฐ์ด ๋๋ฌด ๋ฆ์ต๋๋ค.
https://github.com/rust-lang/rust/issues/37839 ๋ ์์ฒด์ ์ผ๋ก proc_macro ํฌ๋ ์ดํธ๋ฅผ ์ฌ์ฉํ๋ lib ํฌ๋ ์ดํธ๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋๋ค. AFAICT ํ ์คํธ๋ proc ๋งคํฌ๋ก ๋ชจ๋ ๋ง ์ปดํ์ผํ๊ฑฐ๋ proc ๋งคํฌ๋ก ๋ชจ๋๊ณผ proc ๋งคํฌ๋ก๋ฅผ ์ง์ ์ฐธ์กฐํ๋ bin ๋ชจ๋์ ์ปดํ์ผํ๊ธฐ ๋๋ฌธ์ ์ด์ ์ํฅ์๋ฐ์ง ์์ต๋๋ค.
ํธ์ง : ์ด์ ์์ ๋์์ต๋๋ค!
@Arnavion # --target
์ฌ์ฉํ ๋ ๋ฌธ์ ๊ฐ ๊ณ์ ๋ฐ์ํฉ๋๋ค. ์ฌ์ ํ ์ค๋จ๋๋ --target
๋ฅผ
@rfcbot fcp ๋ณํฉ
์ด์ ํ์ดํธ๋ฆฌ์คํธ ์์ฑ ๊ธฐ๋ฅ ์ด ๊ตฌํ๋์์ผ๋ฏ๋ก์ด๋ฅผ ์์ ํํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค! Serde, Diesel ๋ฐ ๊ธฐํ ์ฌ์ฉ์-ํ์ฌ ๋์์ธ์ด ์๋ํ์ง ์๋ ๊ฒฝ์ฐ ์ด์ ๊ฐ์ฒด์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ๋๋ค. =)
cc @sgrif @erickt
@nikomatsakis ํ์ ์ด์ด๋ฅผ ๋ณํฉ ํ ๊ฒ์ ์ ์ํ์ต๋๋ค. ๋ค์ ๋จ๊ณ๋ ํ๊ทธ๊ฐ ์ง์ ๋ ๋๋จธ์ง ํ์ ๊ฒํ ์ ๋๋ค.
ํ์ฌ ๋์ด๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ด๋ฌํ ๊ฒํ ์๊ฐ ํฉ์์ ๋๋ฌํ๋ฉด ์ต์ข ์๊ฒฌ ๊ธฐ๊ฐ์ด ์์๋ฉ๋๋ค. ์ด ๊ณผ์ ์์ ์์ง ์ ๊ธฐ๋์ง ์์ ์ฃผ์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ์๋ ค์ฃผ์ธ์!
ํ๊ทธ ๋ ํ์์ด ๋์๊ฒ ์ค ์์๋ ๋ช ๋ น์ ๋ํ ์ ๋ณด๋ ์ด ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
๊ฐ๊น์ด ์ฅ๋์ ๋ฑ ๋งคํฌ๋ก๊ฐ ํ์๋๋ ๊ฒ์๋ณด๊ณ ์ถ์ต๋๋ค. ํ์ง๋ง ์ด์๋ ์์ต๋๋ค.
@rfcbot ๊ฒํ
ํ์ฌ TokenStream์ด ๊ตฌ๋ฌธ ๋ถ์์ ์คํจ ํ๋ฉด ๋น LexError๊ฐ ๋ฐํ ๋ฉ๋๋ค. ๊ตฌ๋ฌธ ๋ถ์์ ์คํจํ ํ ํฐ๊ณผ ๊ฐ์ ๋ ๋์ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ฌ๊ธฐ์ ๋ฐํ ํ ์ ์์ต๋๊น? ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์๋ ์ด๋ฌํ ์ข ๋ฅ์ ์ค๋ฅ ๋ฉ์์ง๋ฅผ๋ณด๊ณ ์ถ์ง ์์ ๊ฒ์ ๋๋ค.
์, ๋งคํฌ๋ก ์์ฑ์์๊ฒ ํธ๋ฆฌํฉ๋๋ค. ์ค๋ฅ๋ฅผ ์ฐพ๊ธฐ ์ํด ์คํธ๋ฆผ์ ํ์ผ์ ๊ธฐ๋กํ๊ณ ๋์ดํฐ์์ ํ์ธํด์ผํ์ต๋๋ค.
๋งคํฌ๋ก์ ๋ํด ๋ ๋์ ๋ฒ๊ทธ ๋ณด๊ณ ์๋ฅผ ์ ์ถํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ์์๊ฒ๋ ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
https://github.com/rust-lang/rust/pull/38140 ์์ ์ฌ์ฉ์ ์ง์ ํ์ ์ ์ธ์ด ๊ณต๊ฐ๋๋๋ก ๊ฐ์ ํ๊ณ ์์ต๋๋ค. ์ด๋ก ์ ์ฐ๋ฆฌ๊ฐ ์ธ์ ๊ฐ ์ฌ์ ์ธ ํ์๋ฌผ์ ์ํ ์ ์๊ณ ์ ์ ํจ์์ ๊ฐ์์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ๋ณ์ํ๊ณ ์ถ์ ๊ฒ์ ๋๋ค. ์ด์จ๋ ์ด๊ฒ์ ๋ณด์์ ์ธ ์ ํ์ ๋๋ค. ์ด ๊ธฐ๋ฅ์ ์์ ํํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ณํฉํ๊ธฐ ์ ์ ์ฌ๋๋ค์ด ๋ณผ ์ ์๋๋ก ํ๋ฃจ๋ ์ดํ ๋์ ๋ด๊ทธ๋ ๊ฒ์ผ๋ก ์๊ฐํ์ต๋๋ค.
# 37480์ด ๋ซํ๋ฉด ์ฒดํฌ๋ฆฌ์คํธ์ ๋ฐ์๋์ด์ผํฉ๋๋ค.
๊ฒฐ์ ๋
@pnkfelix ๋๋ ๋น์ ์ด PTO์ ์๊ณ ๋๋ ์์ ํ ์ ์์ ์๋ค๊ณ ๋ฏฟ๊ธฐ ๋๋ฌธ์ ๋น์ ์ ์ํด ๋น์ ์ ์์๋ฅผ ์ฒดํฌ ํ ์์ ๋ฅผ ์ป์์ต๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์๋ ค์ฃผ์ญ์์ค!
: bell : ์ง๊ธ์ ์ ์ ์ ๋ฐ๋ผ ์ต์ข ๋๊ธ ๊ธฐ๊ฐ์ ์ ๋ ฅํฉ๋๋ค . :๋ฒจ:
psst @nikomatsakis , final-comment-period
๋ ์ด๋ธ์ ์ถ๊ฐ ํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ฒ ํด์ฃผ์ธ์.
์๋ฐํ ์์ ํ๋ ๋งจ ์์์๋ ์ฒดํฌ๋ฆฌ์คํธ์ ๋๋จธ์ง ์๋ ค์ง ๋ฒ๊ทธ๊ฐ ๋จผ์ ์์ ๋ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๊น? ์๋๋ฉด ์์ ํ๋ฅผ ๋ง๊ณ ์์ง ์์ต๋๊น?
์ง๊ธ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
mod foo;
๋ก ํ์ฅ๋๋๋ก ํ ์ ์์ต๋๋ค.์ผ! ์ด๊ฒ์ RFC 1636 ๋ฌธ์ ๊ฐ์ฌ์ ๋๋ค. ์ด๊ฒ์ RFC 1636์ด ์ฑํ ๋ ์ดํ ์์ ํํด์ผ ํ ์ฒซ ๋ฒ์งธ ์ฃผ์ ๊ธฐ๋ฅ์ด๋ฉฐ์ด ๊ฒฝ์ฐ์ด๋ฅผ ์ ๋ฐ๋ผ์ผํฉ๋๋ค.
RFC๋ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ํฉ๋๋ค.
๊ธฐ๋ฅ์ ์์ ํํ๊ธฐ ์ ์ ๊ธฐ๋ฅ์ ์ด์ ๋ค์๊ณผ ๊ฐ์ด ๋ฌธ์ํ๋ฉ๋๋ค.
- ์ธ์ด ๊ธฐ๋ฅ :
- Rust Reference์ ๋ฌธ์ํ๋์ด์ผํฉ๋๋ค.
- The Rust Programming Language์ ๋ฌธ์ํ๋์ด์ผํฉ๋๋ค.
- ์์ ์ ์ํด Rust์ ๋ฌธ์ํ ๋ ์ ์์ต๋๋ค.
- ์ธ์ด ๊ธฐ๋ฅ๊ณผ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ณ๊ฒฝ ์ฌํญ์ ๋ชจ๋ ๋ค์์ ํฌํจํด์ผํฉ๋๋ค.
- ๋ณ๊ฒฝ ๋ก๊ทธ๋ฅผ์ํ ํ ์ค
- ๊ธด ํ์์ ๋ฆด๋ฆฌ์ค ๋ฐํ์ ๋ํ ๊ธด ์์ฝ์ ๋๋ค.
์ด๋ฅผ์ํ ์ฌ๋ฐ๋ฅธ ํ๋ก์ธ์ค๋ ๋ฌด์์ ๋๊น? ์ด ๋ฌธ์ ์ ์ต์์ ๋๊ธ์ ์ฒดํฌ๋ฆฌ์คํธ ํญ๋ชฉ์ ์ถ๊ฐํด์ผํฉ๋๊น? ์๋๋ฉด ๋ฌธ์ ์ถ์ ์ ์ํด ์ ๋ฌธ์ ๋ฅผ ๋ง๋ค์ด์ผํฉ๋๊น? 1.15 ๋ฆด๋ฆฌ์ค๊น์ง ํธ๋ฆฌ์์ ์ด๋ฌํ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋ ๋ฌธ์๊ฐ ์์ด์ผํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
cc @ rust-lang / docs
@withoutboats ๊ฐ์ฌ
๋์ ์์์ ํญ์ ์์ ํ ๊ฒฐ์ ๊ณผ ์ค์ ์์ ํ๊ฐ ๋ถ๋ฆฌ๋์ด ์๋ค๋ ๊ฒ์ด์๋ค. ์ฆ, @ rust-lang / lang์ "์ด๊ฒ์ ์์ ์ ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค"๋ผ๊ณ ๋งํ ์ ์์ง๋ง ๊ฒ์ดํธ๋ฅผ ์ ๊ฑฐํ๊ฒ ๋ค๋ ์ฝ์์ ๋ฌธ์๊ฐ ์กด์ฌ ํจ์ ๋ณด์ฅํฉ๋๋ค. ๋ถ์์ ํ ์ฑ ์ด ์กด์ฌ ํ๋ ์ธ์์์ ์ด๊ฒ์ ๋ฌธ์๋ฅผ ๊ฑฐ๊ธฐ์์ ์์ ๋ ๋ฌธ์๋ก ๋์ด ์ฌ๋ฆด ๊ฒ์ ๋๋ค. ํ์ง๋ง ๊ทธ๋๊น์ง๋ ์ํฉ์ด ์ฝ๊ฐ ์ด์ํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋ฐฉ๊ธ ๋ฆด๋ฆฌ์ค๋ฅผ ๋ฐ์์ผ๋ฏ๋ก ๋ด ๊ณํ์ ๋ค์๊ณผ ๊ฐ์ดํ๋ ๊ฒ์ด ์์ต๋๋ค.
2 ๊ฐ์ 3 ๊ฐ๋ฅผ ๊ฒฐํฉํ ๊ฒ ๊ฐ์ต๋๋ค.
/ cc @ rust-lang / core, ์ด๊ฒ์ ํ ๊ฐ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
@steveklabnik ์ ๋์๊ฒ ์ข์ ๊ฒ ๋๋๊ธฐ ์ ์๋) ์ธ์ ๋ ์ง ๋ฌธ์๋ฅผ ๋ฐฉ๋ฌธํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ฌ๊ธฐ์ FCP๋ ์ฐ๋ฆฌ๊ฐ ์ค์๋ก ๋ค์ด๊ฐ๋ ๋ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ ธ๊ธฐ ๋๋ฌธ์ ์ด์จ๋ ์ผ์ข ์ ์ ์ฌ ๋ง๋ฌด๋ฆฌ์ ๋๋ค.
๋ํ 1.15 ๋ฒ ํ ๋ธ๋์น๋ก์ ์์ ํ ๋ฐฑ ํฌํธ๋ฅผ ๋ณด์ฅ ํ ์ ์๋๋ก ์ด๋ฌํ ์ ๋ณด๋ฅผ ๋น ๋ฅด๊ฒ ๊ฐ์ ธ ์ค๋ ๊ฒ๋ ์ข์ต๋๋ค!
๋ด๊ฐ ์ด๊ฒ์ ์ฒ์์ผ๋ก ์น๋ค๋ฉด ๊ทธ๋ ๊ฒ ๋์ ์๋ ์์ง๋ง ์๋ ค์ง ๋ฒ๊ทธ ์๋์ ํฌํจํฉ์๋ค : ์ฌ์ฉ์ ์ ์ ํ์์ด์๋ ๊ตฌ์กฐ์ฒด ๋ด๋ถ์ ์ ํ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ๋ฉด ICE https://github.com/rust-lang/ ๋ น / ๋ฌธ์ / 38706
https://github.com/rust-lang/rust/pull/38737 ์ ์ ํ ๋งคํฌ๋ก ICE : heart :๋ฅผ ์์ ํฉ๋๋ค
๋ฐฉ๊ธ proc_macro
์์์ ๋ํ ๋ฌธ์์ ๊ด๋ จํ์ฌ # 38749๋ฅผ ๋ง๋ค์์ต๋๋ค.
Macros 1.1์ด 1.15์์ ์์ ํ ๋ ๊ฒ์ด๋ผ๋ ๋ด์ฉ์ ์ฌ๋ฌ ๋ฒ ์ฝ์์ง๋ง 2 ์ฃผ ์ ์ ์ถ์ ๋ 1.15.0-beta.1๊ณผ ์ต์ extern crate proc_macro;
์ ์ฌ์ ํ โโ์ผ๊ฐ 4ecc85beb 2016์์ ๊ธฐ๋ฅ ๊ฒ์ดํธ๊ฐ ์์ต๋๋ค. -12-28. ์์ ํ ๋ณ๊ฒฝ์ ๋ฐฑ ํฌํธ ํ ๊ณํ์
๋๊น?
@SimonSapin ๋ค, ๊ทธ๊ฒ ๊ณํ ์ด์์ง๋ง ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์คํํด์ผํฉ๋๋ค!
๊ทธ๊ฒ์ ์ฌ์ ํ โโ๊ณํ์ ๋๋ค : p
์ฌ์ฉ์๊ฐ #[derive(Foo)] #[foo_def = "definition.json"] struct MyStruct;
ํ๋ฉด ๋งคํฌ๋ก ํธ๋ค๋ฌ๋ "ํ์ฌ ๋๋ ํ ๋ฆฌ"๊ฐ ๋ฌด์์ธ์ง ์ ์ ์์ผ๋ฏ๋ก definition.json
์ฐพ์ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์ค๊ณ์ ์ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ณ ์น๊ธฐ๊ฐ ์ฝ์ง ์์ ๊ฒ์ ๋๋ค. ์ด์จ๋ ์ด๊ฒ์ ๊ณ ์น๊ธฐ์๋ ๋๋ฌด ๋ฆ์๋ค ๊ณ ์๊ฐํฉ๋๋ค.
Span
-> FileMap
-> ํ์ผ ์ด๋ฆ-> ๋๋ ํ ๋ฆฌ๋ก ์ด๋ํ ์ ์์ต๋๋ค. ๋น ์ง ๊ฒ์ proc_macro
ํตํด ์ ๋ณด์ ์ก์ธ์คํ๋ ๊ฒ์
๋๋ค.
๋ํ ์ปดํ์ผ๋ฌ์๊ฒ definition.json
์ข
์์ฑ์ ์ถ๊ฐํ๋๋ก ์ง์ํ์ฌ ๋น๋๊ฐ ์์ ๋ ๊ฒฝ์ฐ ๋ํฐ๊ฐ๋๋๋กํด์ผํฉ๋๋ค.
proc ๋งคํฌ๋ก๋ env::var("CARGO_MANIFEST_DIR")
๋ฅผ ์ฌ์ฉํ์ฌ ๋งคํฌ๋ก ํธ์ถ์ ํฌํจํ๋ ์์์ Cargo.toml์ด ํฌํจ ๋ ๋๋ ํ ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์๋ง๋ foo_def
๋ ๊ทธ๊ฒ์ ์๋์ ์
๋๋ค. https://github.com/dtolnay/syn/issues/70#issuecomment -268895281์ ์ฐธ์กฐ
@tomaka ์, FileMap์ ๋์ฐ๋ณ์ด์ ์ํด ์ํ ๋ ์์๋ ์ด ์ด๋ป๊ฒ '์
๋๋ค include_str!
๋งคํฌ๋ก๋ฅผ ์ํํฉ๋๋ค.
์๋ง๋ foo_def๋ ๊ทธ๊ฒ์ ์๋์ ์ ๋๋ค.
Cargo.toml์ ์๋์ ์ธ ๊ฒฝ๋ก๋ฅผ ์ ๋ ฅํด์ผํ๋ ๊ฒ์ ๊ทธ๋ฆฌ ์ง๊ด์ ์ด์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๋ FileMap์ ๋ณ๊ฒฝํ์ฌ ์ํ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด include_str! ๋งคํฌ๋ก๊ฐ ์ํํฉ๋๋ค.
์, ํ ์ ์๋ค๋ ๊ฒ์ ์๋๋ค. ํ์ฌ์ ์ ์ฐจ ์ ๋งคํฌ๋ก API๋ก๋ ํ ์ ์์ต๋๋ค.
๋งค๊ฐ ๋ณ์๋ Item
์
๋๋ค. ํด๋น ํญ๋ชฉ์์ ๋ฒ์๋ฅผ ๊ฒ์ํ๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ํ์ฉ๋์ง๋ง Item
์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ์ฌ ์ปดํ์ผ๋ฌ์๊ฒ ์ข
์์ฑ์ ์ถ๊ฐํ๋๋ก ์์ฒญํ๋ ๊ฒ์ ํดํน IMO์
๋๋ค.
Span-> FileMap-> ํ์ผ ์ด๋ฆ-> ๋๋ ํ ๋ฆฌ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
์ด๋ฌํ API (ํนํ FileMap
)๊ฐ ์์ ํ ๋ ๊ฒฝ๋ก์ ์์ต๋๊น?
๊ทธ๋ด ํ์๋ ์์ต๋๋ค. ์ฌ์ค ์ ๋ ๋ด๋ถ๋ฅผ ์์ ํํ๊ณ ์ถ์ง ์์ต๋๋ค. ๋์ Span
์ ๋ํ ์ ๋ณด (์ : ์ค, ์ด, ํ์ผ ์ด๋ฆ)๋ฅผ ์ถ์ถํ๋ API๋ฅผ ์์ ํ ํ ์ ์์ต๋๋ค.
๋ด ์์์์์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ฌด์จ ์ผ์ด์ผ?
``
error: Cannot use
#! [feature (proc_macro)] and
#! [feature (custom_attribute)] ๋์์
````
@alexreg #[derive]
ํ๊ณ ์๋ค๋ฉด ์ด์ ์์ ์ ์
๋๋ค. #![feature(proc_macro)]
ํ์ํ์ง ์์ต๋๋ค.
๋ฟก๋ฟก
proc_macro_derive
s (๋งคํฌ๋ก 1.1)๊ฐ ์ด์ ์์ ์ ์
๋๋ค. #![feature(proc_macro)]
์ ๊ฑฐํ๋ฉด๋ฉ๋๋ค.
#[proc_macro_attribute]
์ต๊ทผ #![feature(proc_macro)]
๊ธฐ๋ฅ ๊ฒ์ดํธ ๋ค์ ์ฐฉ๋ฅํ์ต๋๋ค. #![feature(custom_attribute)]
์ ํธํ๋์ง ์์ต๋๋ค. #![feature(custom_attribute)]
๊ต์ฒด๊ฐ ์๋ฃ๋๋ฉด ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค (https://github.com/rust-lang/rfcs/pull/1755).
@jseyfried proc_macro
์ ๋ํ ์ถ์ ๋ฌธ์ ๊ฐ ๋ซํ ์๊ณ ๊ด๋ จ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ง ์์ผ๋ฏ๋ก ๋ณ๊ฒฝํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ฌํฉ๋๋ค. ๋ง์ด ๋๋ค์.
@abonander ์, #![feature(proc_macro)]
์ ์ด์ # 38356์ ํ์คํ ๊ฐ๋ฆฌ์ผ ์ผํฉ๋๋ค. # 38842๋ฅผ ๊ฒํ ํ ๋ ํ์ธ ํ์ด์ผํฉ๋๋ค. PR์ ์ ์ถํ ์ ์์ต๋๊น?
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ข์์, ์ค๋ ์ด๊ฒ์ ์ดํด๋ณด๊ณ ์ผ๋ง๋ ๋ฉ๋ฆฌ ์๋์ง ๋ณด๊ฒ ์ต๋๋ค.