Rust: '๋งคํฌ๋กœ 1.1'์ถ”์  ๋ฌธ์ œ (RFC # 1681)

์— ๋งŒ๋“  2016๋…„ 08์›” 22์ผ  ยท  268์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-lang/rust

rust-lang / rfcs # 1681์— ๋Œ€ํ•œ ์ถ”์  ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

cc @alexcrichton

์•ˆ์ •ํ™” TODO

๋ฆฌํŠธ๋จธ์Šค ํ…Œ์ŠคํŠธ :

ํ’๋ชจ:

  • ์ƒ์ž ์ด๋ฆ„, ํ˜„์žฌ proc_macro
  • ์ƒ์ž ์œ ํ˜•, ํ˜„์žฌ proc-macro
  • #[proc_macro_derive(Foo)] ์†์„ฑ
  • proc-macro ์ƒ์ž๋ฅผ -L ๋ฐ #[macro_use] ๋กœ๋กœ๋“œํ•˜์—ฌ๋กœ๋“œ
  • ์„€๋„ ์ž‰์€ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค
  • ์œ„์ƒ์ด ์—†๋‹ค
  • ์ „์ฒด ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ํ† ํฐ ์ŠคํŠธ๋ฆผ์„ ์ „๋‹ฌํ•˜๊ณ  ๋ชจ๋‘ ๋‹ค์‹œ ๋ฐ›๊ธฐ
  • ํ™”๋ฌผ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์†์„ฑ, ํ˜„์žฌ proc-macro = true

์•Œ๋ ค์ง„ ๋ฒ„๊ทธ :

  • []-ํŒจ๋‹‰ ํŒŒ์ƒ์˜ ์ŠคํŒฌ์ด ์ž˜๋ชป๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Œ-# 36935
  • []- mod foo ํ† ํฐ ์ŠคํŠธ๋ฆผ ์‹คํŒจ-# 36691
  • []- proc_macro -# 38749์— ๋Œ€ํ•œ ๋ฌธ์„œ๊ฐ€ ๊ฒŒ์‹œ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
  • [x๋Š”] - ์—ฌ๋Ÿฌ ๋ชจ๋“œ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์ด ์–ด๋ ต๋‹ค - https://github.com/rust-lang/rust/issues/35900#issuecomment -252499766
  • [x]-proc ๋งคํฌ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œํ™”๋ฌผ ํ…Œ์ŠคํŠธ ์‹คํŒจ-# 37480
  • [X]๋Š” - ์œ„ํ•ด ์—ฌ์ „ํžˆ ์ค‘์š” - https://github.com/rust-lang/rust/issues/35900#issuecomment -252430957 (https://github.com/rust-lang/rust/pull/37067 ์˜ํ•ด fxed)
  • [X] - ์ˆ˜์—†๋Š” ๋ฌธ์„œ rustc ๋งคํฌ๋กœ ์ƒ์ž - https://github.com/rust-lang/rust/issues/36820 (# 36847 ๊ณ ์ •)
  • [X]๋Š” -ํ™”๋ฌผ ๋„ˆ๋ฌด ์ž์ฃผ ์žฌ ๊ตฌ์ถ• - https://github.com/rust-lang/rust/issues/36625 (https://github.com/rust-lang/rust/pull/36776 ๊ณ ์ •)
  • [X]๋Š” - ์ปดํŒŒ์ผ๋Ÿฌ ๋ฉ”์ดํฌ์—…์— ์˜ํ•ด ์ƒ์„ฑ ๋œ ์†์„ฑ ์ •์˜ ํŒŒ์ƒ ์ €์ž๋Š” '์–ด๋ ค์šด ์ƒํ™œ - https://github.com/rust-lang/rust/issues/35900#issuecomment -245978831

  • [x]- rustc_macro ์ƒ์ž ๋งŒ๋“ค๊ธฐ

    • [x]- libsyntax librustc_macro ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์— ๋”ฐ๋ผ librustc_macro ์—์„œ librustc_driver
    • [x]- rustc_macro ํƒœ๊ทธ๋ฅผ ํ‘œ์ค€ ํ—ค๋”์— ๋ถˆ์•ˆ์ •
    • [x]- rustc_macro ์™€ ํ•จ๊ป˜ #![crate_type = "rlib"] rustc_macro ํƒœ๊ทธ ๋งŒ dylib๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • [x]- libsyntax ์˜ TokenStream ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ libsyntax rustc_macro API ๊ตฌํ˜„
    • [x]- TokenStream lang ํ•ญ๋ชฉ์œผ๋กœ rustc_macro ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ธ์‹ํ•˜๋„๋กํ•ฉ๋‹ˆ๋‹ค.
  • [x]- rustc_macro_derive ์†์„ฑ ์ถ”๊ฐ€

    • [x]- foo(bar) ํ˜•์‹์ด ์ •ํ™•ํ•œ์ง€ ํ™•์ธํ•˜๊ณ  ๋‹ค๋ฅธ ์ธ์ˆ˜ / ํ˜•์‹์€ ์—†์Šต๋‹ˆ๋‹ค.

    • [x]-๊ธฐ๋Šฅ์—๋งŒ ์ ์šฉ๋˜๋Š”์ง€ ํ™•์ธ

    • [x]-๋ฃจํŠธ ๋ชจ๋“ˆ์˜ ํ•จ์ˆ˜์—๋งŒ ์ ์šฉ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    • [x]-์œ„์— ์ถ”๊ฐ€ ๋œ TokenStream lang ํ•ญ๋ชฉ์œผ๋กœ ์„œ๋ช…์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    • [x]- rustc_macro_derive ๋ชจ๋“  ํ•จ์ˆ˜ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ƒ ๋ชจ๋“œ์™€ ํ•จ๊ป˜ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋กœ ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.

  • [x]-๋‹ค๋ฅธ ์ƒ์ž์— rustc-macro ์ƒ์ž ์œ ํ˜• ์ถ”๊ฐ€

    • [x]-์—ฐ๊ฒฐํ•˜์—ฌ dylib ์ƒ์„ฑ

    • [x]-dylib๊ฐ€ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ ์˜ค๋Š”์ง€ ํ™•์ธ

    • [x]- rustc-macro ์ƒ์ž ๊ฐ€ dylibs๋กœ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์—†๋„๋กํ•ฉ๋‹ˆ๋‹ค.

    • [x]- #[rustc_macro_derive] ํƒœ๊ทธ๊ฐ€ ์ถ”๊ฐ€ ๋œ ํ•ญ๋ชฉ ์™ธ์— _reachable_ ํ•ญ๋ชฉ์ด ์—†๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    • [x]- cfg(rustc_macro) ๋ฅผ ๋ถˆ์•ˆ์ •ํ•œ cfg ์ง€์‹œ๋ฌธ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ณ  rustc-macro ์ƒ์ž ์œ ํ˜•์— ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    • [x]- rustc-macro ์ƒ์ž๊ฐ€ libsytnax์— ๋™์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • [x]- rustc-macro ์ƒ์ž์— ๋Œ€ํ•œ #[macro_use] ์ง€์› ์ž‘์„ฑ

    • [x]-๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋กœ๋”๋ฅผ ํ™•์žฅํ•˜์—ฌ ์ƒ์ž๋ฅผ๋กœ๋“œ ํ•  ๋•Œ ์˜ค๋Š˜ ์ถ”์  ๋œ dylib / rlib์™€ ๋ณ„๋„๋กœ rustc-macro ์ƒ์ž๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

    • [x]- rustc-macro ์ƒ์ž์˜ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์—ฌ ๊ธฐํ˜ธ / ํŒŒ์ƒ ๋ชจ๋“œ ์Œ์— ๋Œ€ํ•ด ์•Œ์•„ ๋ด…๋‹ˆ๋‹ค.

    • [x]- dlopen dylib

    • [x]-ํŒŒ์ƒ ๋ชจ๋“œ๊ฐ€ ๋‹ค๋ฅธ ๋ชจ๋“œ๋ฅผ ์„€๋„ ์ž‰ํ•˜๋ฉด ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • [x]-ํ™”๋ฌผ ์ •์ˆ˜ ์ถ”๊ฐ€

    • [x]- rustc-macro ์™€ ์œ ์‚ฌํ•œ plugin = true

    • [x]- --crate-type=rustc-macro ํ†ต๊ณผ

    • [x]-ํ”Œ๋Ÿฌ๊ทธ์ธ ํฌ๋ ˆ์ดํŠธ์— ์กด์žฌํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ํ˜ธ์ŠคํŠธ / ํƒ€๊ฒŸ ๋กœ์ง์„ rustc-macro ํฌ๋ ˆ์ดํŠธ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : ํ˜ธ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ํ•ญ์ƒ rustc-macro ํฌ๋ ˆ์ดํŠธ๋ฅผ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค)

  • [x]-ํ…Œ์ŠคํŠธ

    • [x]-rustc-macro, ๋”๋ฏธ #[derive] ํŠธ๋ ˆ์ด ํŠธ๋ฅผ ๋กœ๋”ฉํ•˜๋Š” ์—ฐ๊ธฐ ํ…Œ์ŠคํŠธ

    • [x]-์ด๋ฆ„ ์ถฉ๋Œ์€ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

    • [x]-์ž˜๋ชป๋œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์€ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

    • [x]-์ƒ์ž ์œ ํ˜• rustc-macro๋ฅผ ๋ฐฉ์ถœ ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋‹ค๋ฅธ ๊ฒƒ (์˜ˆ : rustc-macro + dylib)์€ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

    • [x]-์ŠคํŒฌ ์ •๋ณด๊ฐ€ ๋”์ฐํ•˜์ง€ ์•Š์Œ

    • [x]-๊ตฌ์กฐ์ฒด ๋ฐ ํ•„๋“œ์—์„œ ์†์„ฑ ์ œ๊ฑฐ

    • [x]-๊ตฌ์กฐ์ฒด ์˜†์— impl ์ถ”๊ฐ€

    • [x]-ํฌ๋กœ์Šค ์ปดํŒŒ์ผ์€ ํ˜ธ์ŠคํŠธ rustc-macro ํฌ๋ ˆ์ดํŠธ ์œ ํ˜•์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

    • [x]-๋ฐ”๋‹๋ผ dylib๋ฅผ rustc-macro ์ƒ์ž ์œ ํ˜•์œผ๋กœ๋กœ๋“œํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

    • [x]-rustc-macro ์ƒ์ž์—์„œ ๋งคํฌ๋กœ ํŒŒ์ƒ ๊ธฐ๋Šฅ์„ ๋„˜์–ด์„œ๋Š” ๊ณต๊ฐœ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    • [x]-ํŒŒ์ƒ ๋งคํฌ๋กœ์—๋Š” ํ•„์ˆ˜ ์„œ๋ช…์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

    • [x]-ํ•œ ๋ฒˆ์˜ ์ปดํŒŒ์ผ๋กœ ๋‘ ๊ฐœ์˜ ๋งคํฌ๋กœ ์ƒ์ž๋กœ๋“œ

B-RFC-implemented B-unstable T-lang final-comment-period

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ข‹์•„์š”, ์˜ค๋Š˜ ์ด๊ฒƒ์„ ์‚ดํŽด๋ณด๊ณ  ์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ์žˆ๋Š”์ง€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  268 ๋Œ“๊ธ€

์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…์— ๋Œ€ํ•œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋กœ ๋ฌธ์ œ ์„ค๋ช…์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ์™„์ „ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ 90 % ์ •๋„๋Š” ์–ป์„ ์ˆ˜์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ข‹์•„์š”, ์˜ค๋Š˜ ์ด๊ฒƒ์„ ์‚ดํŽด๋ณด๊ณ  ์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ์žˆ๋Š”์ง€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

# 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)]
  • ์ด๋Ÿฌํ•œ ์†์„ฑ์„ ์ƒ๋žตํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž ์ •์˜ ํŒŒ์ƒ์— ์˜์กดํ•˜์‹ญ์‹œ์˜ค.
  • ์‚ฌ์šฉ์ž ์ •์˜ ํŒŒ์ƒ์„ ๊ฐ์ง€ํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์„ ๋‚ด ๋ณด๋‚ด์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  • ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์†์„ฑ์ด ๋งํ•˜๋Š” ๋‚ด์šฉ์„ ์ „๋‹ฌํ•˜์ง€๋งŒ AST ์ž์ฒด๋ฅผ ํ†ตํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๋Ÿฌํ•œ ์†์„ฑ์„ ๋ฐฉ์ถœํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ #[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] ์˜ ํ™•์žฅ ์ˆœ์„œ๋ฅผ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ์ฒซ์งธ, ๋งคํฌ๋กœ 1.1์˜ ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ง€์ • ํŒŒ์ƒ ์†์„ฑ์ด ํ•˜๋‚˜์”ฉ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, #[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_์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋น„์œจ์ด "๋‹จ์ง€ ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ"์œผ๋กœ "๋งŽ์€ ์žฅ์‹"์ด ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋…์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—์„œ ๋ช…ํ™•ํ•œ ๊ตฌ๋ถ„์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  • ์œ ์—ฐ์„ฑ : ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์‚ฌ์šฉ์ž ์ •์˜ ํŒŒ์ƒ๋ฌผ, ์ฆ‰ ๋ณ€๊ฒฝ ๋ฐ ์žฅ์‹์„ ์ ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด๋ณด์‹ญ์‹œ์˜ค. ์–ด๋–ป๊ฒŒ ์ฃผ๋ฌธํ•˜๋“  ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณ€๊ฒฝ์ด ๋‹ค๋ฅธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ๋ฐœ์ƒํ•˜๊ณ  ๋‚˜์ค‘์— ์žฅ์‹์ด ๋ชจ๋‘ ์ ์šฉ๋˜๋ฉด๋ณด๋‹ค ์ œ์–ด ๊ฐ€๋Šฅํ•œ ๋ฐฉ์‹์œผ๋กœ ์—ฌ๋Ÿฌ ๋ณ€๊ฒฝ ๋ฐ ์žฅ์‹์„ ๊ฒฐํ•ฉ ํ•  ์ˆ˜์žˆ๋Š” ์œ ์—ฐ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ€๋…์„ฑ : ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ๊ตฌ์กฐ์ฒด์— 10 ๊ฐœ์˜ ํŒŒ์ƒ์ด ์ ์šฉ๋˜๊ณ  ๊ทธ์ค‘ ํ•˜๋‚˜๊ฐ€ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ์ด๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ๋” ๋งŽ์€ ์‹œ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ @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{ ... } ํŠธ๋ฆญ์€ ์ •์ƒ์ ์ธ ๊ฒฝ์šฐ ๋ ˆ์ด์•„์›ƒ์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐœ๊ฒฌ ํ•  ํ•„์š”๊ฐ€ ์—†๋„๋ก ์–ด๋”˜๊ฐ€์— ๋ฌธ์„œํ™”ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฟก ๋นต๋€จ

  • mh .. _custom ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ derive_ ์ „์— ์ ์šฉ๋˜์–ด์•ผํ•œ๋‹ค๋Š” ์ถ”๊ฐ€ ๊ทœ์น™์ด์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ _derives๋Š” item_์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ผ๋ฐ˜์ ์œผ๋กœ ํŒŒ์ƒ ์—ญํ•™์„ ๊ฐ•ํ™” / ์ •์ œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜์ค‘์˜ ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด _ ๊ฐœ๋ณ„์ ์œผ๋กœ _ ์‚ฌ์šฉ์ž ์ •์˜ ํŒŒ์ƒ์„ ๊ฐ•ํ™”ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. :-)

์†์„ฑ์ด ์ ์šฉ๋˜๋Š” ํ•ญ๋ชฉ์˜ ๋‚ด๋ถ€๋ฅผ ์ˆ˜์ •ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ๋ฐฉ๊ธˆ 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 ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด ๋ณ„๋„์˜ ๋ชจ๋“ˆ์—์„œ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ ๋’ค์— 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์˜ ์ธก๋ฉด์—์„œ ํŠน์„ฑ๊ณผ ๊ตฌ์กฐ์ฒด์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@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)] ๋ฅผ ๋„์ž… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”” ์ด ๊ธฐ๋Šฅ์€ ์ด ๋ฆด๋ฆฌ์Šค์ฃผ๊ธฐ๊ฐ€ ๋๋‚  ๋•Œ ์•ˆ์ •ํ™” ํ•  ๋ชฉ์ ์œผ๋กœ ์ตœ์ข… ๋Œ“๊ธ€ ๊ธฐ๊ฐ„์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค ! ๐Ÿ””

์ด์ œ ์•ˆ์ •ํ™”๋ฅผ ๊ณ ๋ คํ•˜๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ด ๊ธฐ๋Šฅ์˜ API ํ‘œ๋ฉด์€ ์„ค๊ณ„ ์ƒ _ ๋งค์šฐ ๋ณด์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ๋™์‹œ์— ์ ˆ์ฐจ ์  ๋งคํฌ๋กœ์— ๋Œ€ํ•œ ์‚ฌ์‹ค์ƒ์˜ ๊ณ„ํš๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.
  • ์ด ๊ธฐ๋Šฅ์€ Serde๋ฅผ ํ†ตํ•ด ๋น ๋ฅด๊ฒŒ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์œผ๋ฉฐ, ๊ณง Diesel์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์€ ์ฃผ๋กœ ์‚ฌ์šฉ์ž ์ง€์ • ํŒŒ์ƒ์˜ _client_์ž…๋‹ˆ๋‹ค.
  • ์ด์ œ FCP์— ๋“ค์–ด๊ฐ€๋ฉด ๊ธฐ๋Šฅ์ด ์‹ค์ œ๋กœ ์•ˆ์ •์ ์œผ๋กœ ์ถœ์‹œ๋˜๊ธฐ๊นŒ์ง€ 3 ๊ฐœ์›”์ด ๊ฑธ๋ฆฌ๋ฏ€๋กœ ๋‚จ์€ ๋ฌธ์ œ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ์ด์ „ ํ•ฉ์˜์— ๋”ฐ๋ผ ์ด๋ฆ„์ด 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.0์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  2. ์‚ฌ์šฉ์ž ์ •์˜ ํŒŒ์ƒ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์†์„ฑ ํ—ˆ์šฉ
  3. ์‚ฌ์šฉ์ž ์ง€์ • ํŒŒ์ƒ์ด ํ˜„์žฌ ํ•ญ๋ชฉ์˜ ํŠน์ • ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ์— ์†์„ฑ ์ด๋ฆ„์„ ํ‘ธ์‹œํ•˜๋„๋ก ํ—ˆ์šฉํ•˜์—ฌ ๋งคํฌ๋กœ 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๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ํŠนํžˆ, ๋‹ค๋ฅธ ๋”” ๋ผ์ด๋ฒ„์—๊ฒŒ ์ค‘์š”ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์กฐ์ฒด๋ฅผ ์ˆ˜์ •ํ•ด์„œ๋Š” ์•ˆ๋˜๋ฏ€๋กœ ์ˆœ์„œ์— ๋…๋ฆฝ์ ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํŒŒ์ƒ๋ฌผ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•˜๋Š”๊ฐ€์— ๋™์˜ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ํŒŒ์ƒ๋ฌผ์ด ๋ถ€์ฐฉ ๋œ ์œ ํ˜•์— ๋Œ€ํ•ด ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค๊ณ  ์‚ฌ๋žŒ๋“ค์ด ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์— ๋™์˜ํ•œ๋‹ค๋ฉด, ์งˆ๋ฌธ์€-์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ์‹œํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๊ฐ€ ๋…ธ์ถœํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์›ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ด๊ฒƒ์„ ์‹œํ–‰ ํ•  ์ž‘์„ฑ์ž๋ฅผ ์œ ๋„ํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ๋‚จ๊ฒจ๋‘๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์—๋Š” ๋‘ ๊ฐ€์ง€ ์ƒ์‡„ ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • derive์˜ ํ–‰๋™ ๊ณ„์•ฝ์„ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ Rust ์†”๋ฃจ์…˜๊ณผ ๋น„์Šทํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.
  • 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๋ฅผ ๋‘ ๊ฐœ๋กœ ๋ถ„ํ• ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ž…๋‹ˆ๊นŒ?

  1. ์ผ๋ฐ˜์ ์œผ๋กœ ์ปค์Šคํ…€ ์†์„ฑ์— ๋Œ€ํ•œ ํ‘œ๊ธฐ๋ฒ• ๋ฐ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” rfc (์•ˆ์ •์ ์ธ ์ƒํƒœ์—์„œ no-op ์†์„ฑ ํ—ˆ์šฉ).
  2. ์ •์˜ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ 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 ์ฃผ๋œ ํ•„์š”๋Š” ์†์„ฑ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์„ ๋ฌด์‹œํ•˜๋Š” ์‹ฌ๊ฐํ•œ ๋‹จ์ ์„ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ฃผ์š” ์†์„ฑ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ํŒŒ์ƒ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ์ ˆ์ฐจ ์  ๋งคํฌ๋กœ ํ•ดํ‚น์ด ์•„๋‹Œ ์‹ค์ œ ํŒŒ์ƒ๋˜๋Š” ๋ชจ๋“  ์‹ค์ œ ์š”๊ตฌ ์‚ฌํ•ญ์— ์ถฉ๋ถ„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜, ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•œ ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹ ์‚ฌ์ด์—์„œ ๊ฐˆ๋“ฑ์„ ๊ฒช๊ณ  ์žˆ์œผ๋ฉฐ, ๋‘˜ ๋‹ค ๋ถ„๋ช…ํ•œ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. "๋‹จ์ˆœ ํŒŒ์ƒ"์ ‘๊ทผ ๋ฐฉ์‹-์ถ”๊ฐ€ ํ•ญ๋ชฉ ๋งŒ ์ƒ์„ฑํ•˜๋„๋ก API๋ฅผ ์กฐ์ •ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ํŒŒ์ƒ์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์—ฌ์ „ํžˆ ๋ถˆ์•ˆ์ •ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ , ๋””์ ค ๋ฐ ๊ธฐํƒ€ ์ƒ์ž๊ฐ€ ์ž„์˜์˜ ์ ˆ์ฐจ ์  ๋งคํฌ๋กœ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์ ํ”„ํ•˜๋Š” ๊ตฌ๋ฉ์„ ๋‹ซ์Šต๋‹ˆ๋‹ค.
  2. "๊ณ„ํš๋œ ๋…ธํ›„ํ™”"์ ‘๊ทผ ๋ฐฉ์‹-์ด๋ฆ„ ์ง€์ •์— ๋Œ€ํ•ด ์–ธ๊ธ‰ ํ•œ Niko์™€ ๊ฐ™์€ ์ž‘์€ ์กฐ์ •์„ ํ†ตํ•ด API๋ฅผ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์•ˆ์ •ํ™”ํ•˜๊ณ  ์–ธ์  ๊ฐ€๋Š” ์‚ฌ์šฉ์„ ์ค‘๋‹จ ํ•  ์˜๋„์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ง€์ • ํŒŒ์ƒ ์ž‘์„ฑ์ž๊ฐ€ ์–ธ์  ๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผํ•˜๋ฉฐ ์ค‘๊ฐ„ ๊ธฐ๊ฐ„ ๋™์•ˆ ๋†€๋ผ์šด ๋™์ž‘์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ๊ทธ๋Ÿฌ๋‚˜ @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์ด ๊ณ„์†ํ•ด์„œ ํŠน์„ฑ์„ ๊ตฌํ˜„ํ•˜๊ณ ์ด ํŠน์„ฑ์„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ํ™•์žฅ์„ฑ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ๋งคํฌ๋กœ ์ธ ์ฃผ์„์ด ๋‹ฌ๋ฆฐ ํ•จ์ˆ˜๊ฐ€์ด ํŠน์„ฑ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ๋ก ๊ธฐ๊ด€์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ ์ด๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ์„คํƒ• ์ œ๊ฑฐ์ž…๋‹ˆ๋‹ค.
  • ๋งคํฌ๋กœ 1.1 ์ปค์Šคํ…€ ํŒŒ์ƒ์„ ์œ„ํ•ด ํŠน๋ณ„ํžˆ CustomDerive ํŠธ๋ ˆ์ด ํŠธ๋ฅผ ๋ถ„๋ฆฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ, ๋งคํฌ๋กœ ์ž‘์„ฑ์ž๋Š”์ด๋ฅผ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์€ ํ•จ์ˆ˜์— ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ํŠน์„ฑ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•  ์ˆ˜์žˆ๋Š” ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. (๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ impl์—์„œ ์†์„ฑ์„ ์žฌ์‚ฌ์šฉ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„์ด ๋“ฑ๋ก ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋…ผ์˜ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค).
  • ์šฐ๋ฆฌ๋Š” ์ถ”๊ฐ€ declare_attributes ์— ๊ธฐ๋Šฅ์„ CustomDerive ๋ฐ˜ํ™˜ Vec<String> . ๋นˆ vec๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋ณธ impl์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋งคํฌ๋กœ ์ž‘์„ฑ์ž๊ฐ€์ด ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฐ˜ํ™˜ ๋œ ๋ฌธ์ž์—ด ์ค‘ ํ•˜๋‚˜๋กœ ์ •ํ™•ํžˆ ๋ช…๋ช… ๋œ ๋ชจ๋“  ์†์„ฑ์ด ๋งคํฌ๋กœ์— ์†ํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์†์„ฑ์€ ๋งคํฌ๋กœ์ฒ˜๋Ÿผ ์กฐํšŒ๋˜์ง€ ์•Š์œผ๋ฉฐ ๋งž์ถค ์†์„ฑ lint๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์†์„ฑ์€ ํŒŒ์ƒ ํ™•์žฅ์— ์˜ํ•ด ์ฝ”๋“œ์— ๋‚จ์•„ ์žˆ์ง€๋งŒ ์‚ฌ์šฉ ๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ƒ ํ™•์žฅ์˜ ์˜ํ–ฅ์„๋ฐ›์ง€ ์•Š๋Š” ์ด๋Ÿฌํ•œ ์†์„ฑ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์†์„ฑ lint๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค (๋งž์ถค ์†์„ฑ lint๋Š” ์•„๋‹˜).
  • ์•ž์œผ๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ํŒŒ์ƒ์„ ํฌํ•จํ•œ ๋งคํฌ๋กœ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋ฒ”์œ„ ์†์„ฑ์„ ๋„์ž… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์†์„ฑ์€ 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 ํƒœ๊ทธ๋ฅผ ์ง€ ์› ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋Œ€ํ™”์˜ ์ƒํƒœ๋ฅผ ์š”์•ฝํ•˜๊ณ  ํŠนํžˆ ํ™•๊ณ ํ•œ ๊ฒฐ์ • ๋ฐ / ๋˜๋Š” ์ฝ”๋“œ ๊ธฐ์—ฌ๊ฐ€ ์—ฌ์ „ํžˆ ํ•„์š”ํ•œ ์˜ค๋ฅ˜๋ฅผ ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์งˆ๋ฌธ 1 : ์‚ฌ์šฉ์ž ์ง€์ • ํŒŒ์ƒ ๋งคํฌ๋กœ๊ฐ€ ๊ฑธ์–ด ๋‹ค๋‹ˆ๋Š” ํ•ญ๋ชฉ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๊นŒ?

  • ์•„๋ฌด๋„ ๊ทธ๋“ค์ด _ ์‹ค์ œ๋กœ _ ๋‹น์—ฐํžˆ ๊ทธ๋ ‡๊ฒŒํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • YAGNI์˜ ์ •์‹ ์œผ๋กœ ์ฒ˜์Œ์—๋Š” ๊ฑฐ๋ถ€๋˜์—ˆ๋˜ ๋˜ ๋‹ค๋ฅธ ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค.
  • ํ•„๋“œ ์ด๋ฆ„ ์„ธํŠธ ๋“ฑ์„ ๋ณ€๊ฒฝํ•˜๋Š” ํŒŒ์ƒ์€ ์ œ๋Œ€๋กœ ๊ตฌ์„ฑ๋˜์ง€ ์•Š์•„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆœ์„œ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
    ๊ทธ ์œ„ํ—˜์€ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์™„ํ™”๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ˜๋ฉด์— custom derive๋Š” ์ƒˆ๋กœ์šด impls ๋งŒ ๋ฐ˜ํ™˜ํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.

    • ์ŠคํŒฌ ์ •๋ณด๊ฐ€ ๋” ์ข‹์Šต๋‹ˆ๋‹ค

    • ์‚ฌ์šฉ์ž ์ •์˜ ํŒŒ์ƒ์€ ์ž‘์„ฑํ•˜๊ธฐ๊ฐ€ ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

  • _ ๊ทธ๋Ÿฌ๋‚˜ _ ๋งŽ์€ ์‚ฌ์šฉ์ž ์ •์˜ ํŒŒ์ƒ์€ ํ™•์žฅ์„ ์•ˆ๋‚ดํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉฐ ๊ฒฝ๊ณ  / ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    • ํ˜„์žฌ ๊ธฐ์ˆ ์€ AST์—์„œ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • _ ๋˜ํ•œ : _ ์šฐ๋ฆฌ๋Š”์ด ๋ฌผ๊ฑด์„ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์„ธ์ƒ์— ๋‚ด๋ณด๋‚ด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ธด ์‹คํ—˜์ด๋‚˜ ๊ธ‰๊ฒฉํ•œ ๋ณ€ํ™”๋ฅผ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ œ์•ˆ :

  • ๋ชจ๋“  ๊ฒƒ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ณ  ๋‚˜์ค‘์— ์ง€์› ์ค‘๋‹จ

    • ํŽธ๋ฆฌํ•˜๊ณ  ๋‹ค์†Œ ๋ถˆํ–‰ ํ•จ

  • ์†์„ฑ์˜ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๋กœ #[proc_macro] ๋ฅผ ํ™•์žฅํ•˜๊ณ  rustc์—๊ฒŒ ๊ทธ๊ฒƒ๋“ค์„ "์ค‘๊ณ "๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ๋ฌด์‹œํ•˜๋ผ๊ณ  ์ง€์‹œํ•˜์‹ญ์‹œ์˜ค.

    • ๋‹จ์ˆœํ•จ, ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€ ํฌํ•จ

    • ๊ทธ๋Ÿฌ๋‚˜ ๋ˆ„๊ตฐ๊ฐ€ ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค ( ์•„๋งˆ @keeperofdakeys! )

์งˆ๋ฌธ 2 : ์‚ฌ์šฉ์ž ์ง€์ • ํŒŒ์ƒ์ด ๋‹ค๋ฅธ ๋งคํฌ๋กœ์™€ ๋™์ผํ•œ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ๊ณต์œ ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

๋‹ค์Œ์— ๋Œ€ํ•œ ์ธ์ˆ˜ :

๋ฐ˜๋Œ€ ์ฃผ์žฅ :

์ œ์•ˆ :

  • "์‚ฌ์šฉ์ž ์ง€์ • ํŒŒ์ƒ"๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋กœ ๋ถ„ํ• 
  • ํ˜„์ƒ ์œ ์ง€

๋‹ค๋ฅธ ๊ฒƒ๋“ค?

๋‹ค๋ฅธ ๋ฏธํ•ด๊ฒฐ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋Œ์—ฐ๋ณ€์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ž ์žฌ์  ํ•ด๊ฒฐ์ฑ… :

์œ ํ˜•์ด 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์ด ์•ˆ์ •ํ™”๋˜๋Š” ๊ฒƒ์„๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ฐจ๋‹จ ๋œ ๊ฒƒ์€ ๊ถ๊ทน์ ์œผ๋กœ ์ƒ๋‹นํžˆ ์‚ฌ์†Œํ•œ ๋Š๋‚Œ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ์ •์‹ ์œผ๋กœ ๋‚ด๊ฐ€ ์„ค๋ช…ํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‚˜์˜ ๊ฒฌํ•ด :

  1. ์„ ์–ธ์  #[proc_macro] ํ™•์žฅ _or_ ์œ ํ˜•์„ Item ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์— ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ๊ฒƒ์„ ์„ ํƒํ•˜๋“  ๊ทธ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉด ๋ฏธ๋ž˜์— ๋‹ค๋ฅธ ๊ฒƒ์„ ์ž ์žฌ์ ์œผ๋กœ ์ฑ„ํƒ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. =)
  2. ์—ฌ๋Ÿฌ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ๊ด€ํ•ด์„œ๋Š” ๋‹น๋ถ„๊ฐ„ ๋™์ผํ•œ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ๋ณด๊ด€ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ €์—๊ฒŒ๋Š” ๋Œ€๋ฌธ์ž ์‚ฌ์šฉ์ด ์ด๋ฏธ "์‚ฌ์šฉ์ž ์ง€์ • ํŒŒ์ƒ"๋งคํฌ๋กœ๋ฅผ ์‹ค์ œ๋กœ ๋‹ค๋ฅธ ๊ฒƒ๋“ค๊ณผ ๊ตฌ๋ณ„ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค๊ณผ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ (์ฆ‰, ์˜ต์…˜์„ ์—ด์–ด ๋‘๋Š” ๊ฒƒ)์˜ ์กฐํ•ฉ์ด ๋งค๋ ฅ์ ์ž…๋‹ˆ๋‹ค. #[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 ํŒ€์› ์ด์ด๋ฅผ ๋ณ‘ํ•ฉ ํ•  ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋œ ๋‚˜๋จธ์ง€ ํŒ€์˜ ๊ฒ€ํ† ์ž…๋‹ˆ๋‹ค.

  • [x] @alexcrichton
  • [x] @aturon
  • [x] @brson
  • [x] @eddyb
  • [x] @japaric
  • [x] @michaelwoerister
  • [x] @nikomatsakis
  • [x] @nrc
  • [x] @pnkfelix
  • [x] @vadimcn
  • [x] @withoutboats
  • [x] @wycats

ํ˜„์žฌ ๋‚˜์—ด๋œ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฒ€ํ† ์ž๊ฐ€ ํ•ฉ์˜์— ๋„๋‹ฌํ•˜๋ฉด ์ตœ์ข… ์˜๊ฒฌ ๊ธฐ๊ฐ„์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์•„์ง ์ œ๊ธฐ๋˜์ง€ ์•Š์€ ์ฃผ์š” ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”!

ํƒœ๊ทธ ๋œ ํŒ€์›์ด ๋‚˜์—๊ฒŒ ์ค„ ์ˆ˜์žˆ๋Š” ๋ช…๋ น์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ์ด ๋ฌธ์„œ ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ๋ฑ… ๋งคํฌ๋กœ๊ฐ€ ํƒ์ƒ‰๋˜๋Š” ๊ฒƒ์„๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด์˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

@rfcbot ๊ฒ€ํ† 

ํ˜„์žฌ TokenStream์ด ๊ตฌ๋ฌธ ๋ถ„์„์— ์‹คํŒจ ํ•˜๋ฉด ๋นˆ LexError๊ฐ€ ๋ฐ˜ํ™˜ ๋ฉ๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ ๋ถ„์„์— ์‹คํŒจํ•œ ํ† ํฐ๊ณผ ๊ฐ™์€ ๋” ๋‚˜์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์—ฌ๊ธฐ์— ๋ฐ˜ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ž๋Š” ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ๋ณด๊ณ  ์‹ถ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ๋งคํฌ๋กœ ์ž‘์„ฑ์ž์—๊ฒŒ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์ŠคํŠธ๋ฆผ์„ ํŒŒ์ผ์— ๊ธฐ๋กํ•˜๊ณ  ๋†€์ดํ„ฐ์—์„œ ํ™•์ธํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งคํฌ๋กœ์— ๋Œ€ํ•ด ๋” ๋‚˜์€ ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ๋ฅผ ์ œ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž์—๊ฒŒ๋„ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/pull/38140 ์—์„œ ์‚ฌ์šฉ์ž ์ง€์ • ํŒŒ์ƒ ์„ ์–ธ์ด ๊ณต๊ฐœ๋˜๋„๋ก ๊ฐ•์ œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ก ์€ ์šฐ๋ฆฌ๊ฐ€ ์–ธ์  ๊ฐ€ ์‚ฌ์ ์ธ ํŒŒ์ƒ๋ฌผ์„ ์›ํ•  ์ˆ˜ ์žˆ๊ณ  ์ •์˜ ํ•จ์ˆ˜์˜ ๊ฐ€์‹œ์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ๋ณ„์„ํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ด๊ฒƒ์€ ๋ณด์ˆ˜์  ์ธ ์„ ํƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์•ˆ์ •ํ™”ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „์— ์‚ฌ๋žŒ๋“ค์ด ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฃจ๋‚˜ ์ดํ‹€ ๋™์•ˆ ๋‹ด๊ทธ๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

# 37480์ด ๋‹ซํžˆ๋ฉด ์ฒดํฌ๋ฆฌ์ŠคํŠธ์— ๋ฐ˜์˜๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ์ •๋œ

@pnkfelix ๋‚˜๋Š” ๋‹น์‹ ์ด PTO์— ์žˆ๊ณ  ๋‚˜๋Š” ์™„์ „ํžˆ ์„ ์ƒ์— ์žˆ๋‹ค๊ณ  ๋ฏฟ๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์‹ ์„ ์œ„ํ•ด ๋‹น์‹ ์˜ ์ƒ์ž๋ฅผ ์ฒดํฌ ํ•  ์ž์œ ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค!

: bell : ์ง€๊ธˆ์€ ์œ„ ์˜ ์— ๋”ฐ๋ผ ์ตœ์ข… ๋Œ“๊ธ€ ๊ธฐ๊ฐ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค . :๋ฒจ:

psst @nikomatsakis , final-comment-period ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•ด์ฃผ์„ธ์š”.

์ž„๋ฐ•ํ•œ ์•ˆ์ •ํ™”๋Š” ๋งจ ์œ„์—์žˆ๋Š” ์ฒดํฌ๋ฆฌ์ŠคํŠธ์˜ ๋‚˜๋จธ์ง€ ์•Œ๋ ค์ง„ ๋ฒ„๊ทธ๊ฐ€ ๋จผ์ € ์ˆ˜์ • ๋  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์•ˆ์ •ํ™”๋ฅผ ๋ง‰๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์ง€๊ธˆ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • # 36935๋Š” ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค๋Š” ๋Œ“๊ธ€์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • # 36691์€ ์ €์—๊ฒŒ ๋ฐฉํ•ด๊ฐ€๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋ฏฟ๋Š” ์–ด๋–ค ๊ฒƒ๋„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ณ  ์›ํ•œ๋‹ค๋ฉด ์–ธ์  ๊ฐ€ ์ด๊ฒƒ๋“ค์ด mod foo; ๋กœ ํ™•์žฅ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ผ! ์ด๊ฒƒ์€ RFC 1636 ๋ฌธ์„œ ๊ฐ์‚ฌ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ RFC 1636์ด ์ฑ„ํƒ ๋œ ์ดํ›„ ์•ˆ์ •ํ™”ํ•ด์•ผ ํ•  ์ฒซ ๋ฒˆ์งธ ์ฃผ์š” ๊ธฐ๋Šฅ์ด๋ฉฐ์ด ๊ฒฝ์šฐ์ด๋ฅผ ์ž˜ ๋”ฐ๋ผ์•ผํ•ฉ๋‹ˆ๋‹ค.

RFC๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ์„ ์•ˆ์ •ํ™”ํ•˜๊ธฐ ์ „์— ๊ธฐ๋Šฅ์€ ์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฌธ์„œํ™”๋ฉ๋‹ˆ๋‹ค.

  • ์–ธ์–ด ๊ธฐ๋Šฅ :

    • Rust Reference์— ๋ฌธ์„œํ™”๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

    • The Rust Programming Language์— ๋ฌธ์„œํ™”๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

    • ์˜ˆ์ œ์— ์˜ํ•ด Rust์— ๋ฌธ์„œํ™” ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์–ธ์–ด ๊ธฐ๋Šฅ๊ณผ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋ชจ๋‘ ๋‹ค์Œ์„ ํฌํ•จํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

    • ๋ณ€๊ฒฝ ๋กœ๊ทธ๋ฅผ์œ„ํ•œ ํ•œ ์ค„

    • ๊ธด ํ˜•์‹์˜ ๋ฆด๋ฆฌ์Šค ๋ฐœํ‘œ์— ๋Œ€ํ•œ ๊ธด ์š”์•ฝ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ์œ„ํ•œ ์˜ฌ๋ฐ”๋ฅธ ํ”„๋กœ์„ธ์Šค๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด ๋ฌธ์ œ์˜ ์ตœ์ƒ์œ„ ๋Œ“๊ธ€์— ์ฒดํฌ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋ฌธ์„œ ์ถ”์ ์„ ์œ„ํ•ด ์ƒˆ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๊นŒ? 1.15 ๋ฆด๋ฆฌ์Šค๊นŒ์ง€ ํŠธ๋ฆฌ์—์„œ ์ด๋Ÿฌํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ๋ฌธ์„œ๊ฐ€ ์žˆ์–ด์•ผํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

cc @ rust-lang / docs

@withoutboats ๊ฐ์‚ฌ

๋‚˜์˜ ์ƒ์ƒ์€ ํ•ญ์ƒ ์•ˆ์ •ํ™” ๊ฒฐ์ •๊ณผ ์‹ค์ œ ์•ˆ์ •ํ™”๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ์ฆ‰, @ rust-lang / lang์€ "์ด๊ฒƒ์€ ์•ˆ์ •์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฒŒ์ดํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๊ฒ ๋‹ค๋Š” ์•ฝ์†์€ ๋ฌธ์„œ๊ฐ€ ์กด์žฌ ํ•จ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ถˆ์•ˆ์ •ํ•œ ์ฑ…์ด ์กด์žฌ ํ•˜๋Š” ์„ธ์ƒ์—์„œ ์ด๊ฒƒ์€ ๋ฌธ์„œ๋ฅผ ๊ฑฐ๊ธฐ์—์„œ ์•ˆ์ •๋œ ๋ฌธ์„œ๋กœ ๋Œ์–ด ์˜ฌ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋•Œ๊นŒ์ง€๋Š” ์ƒํ™ฉ์ด ์•ฝ๊ฐ„ ์–ด์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋ฐฉ๊ธˆ ๋ฆด๋ฆฌ์Šค๋ฅผ ๋ฐ›์•˜์œผ๋ฏ€๋กœ ๋‚ด ๊ณ„ํš์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ดํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค.

  1. ์ด๊ฒƒ์ด FCP๋ฅผ ๋– ๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์‹ญ์‹œ์˜ค.
  2. ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค. (์ด ๊ฒฝ์šฐ์—๋Š” ์“ธ ๊ณ„ํš์ด์—ˆ์Šต๋‹ˆ๋‹ค)
  3. ์•ˆ์ •ํ™” PR์„ํ•ฉ๋‹ˆ๋‹ค.

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์„ ์ œ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰