Rust: RFC 1566 рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛: рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝

рдХреЛ рдирд┐рд░реНрдорд┐рдд 14 рджрд┐рд╕ре░ 2016  ┬╖  184рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rust-lang/rust

рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐

рдЕрдзрд┐рдХ рдмрд╛рд░реАрдХ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

~ рдЕрджреНрдпрддрди рд╡рд┐рд╡рд░рдг ~

рдЕрдЧрд▓рд╛ рдХрджрдо:

  • [x] [ use_extern_macros рд╕реНрдерд┐рд░ рдХрд░реЗрдВ](https://github.com/rust-lang/rust/pull/50911)

    • рдХреНрд░реЗрдЯрд░ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ

  • [ ] proc_macro рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░реЗрдВ

рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрдерд┐рд░реАрдХрд░рдг рд╢реЛрд╕реНрдЯреЙрдкрд░реНрд╕

рдореВрд▓ рд╡рд┐рд╡рд░рдг

рдЖрд░рдПрдлрд╕реА ред

рдпрд╣ RFC рд░рд╕реНрдЯ рдХреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рд╕рд┐рд╕реНрдЯрдо (рдЙрд░реНрдл рд╕рд┐рдВрдЯреИрдХреНрд╕ .) рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реИ
рдПрдХреНрд╕рдЯреЗрдВрд╢рди, рдЙрд░реНрдл тАЛтАЛтАЛтАЛрдХрдВрдкрд╛рдЗрд▓рд░ рдкреНрд▓рдЧрдЗрдиреНрд╕)ред рдпрд╣ RFC рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ
рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝, рд╕рдВрдХрд▓рдХ рдореЗрдВ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг,
рдФрд░ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╕рдВрдХрд▓рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред

рдЙрдЪреНрдЪрддрдо рд╕реНрддрд░ рдкрд░, рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рдПрдХ #[macro] рд╡рд┐рд╢реЗрд╖рддрд╛ред рдореИрдХреНрд░реЛрдЬрд╝ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЯреЛрдХрди рдХреА рд╕реВрдЪреА рдкрд░ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ
рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рдЯреЛрдХрди рдХреА рдПрдХ рд╕реВрдЪреА рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдХреНрд░реЛ рдЙрдкрдпреЛрдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо
рдЗрди рдЯреЛрдХрдиреЛрдВ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░
рд╕реБрд╡рд┐рдзрд╛рдПрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдПрд╕рдЯреА рдХреЛ рдЯреЛрдХрди рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдмрдХреНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рд░реЛрдбрдореИрдк: https://github.com/rust-lang/rust/issues/38356#issuecomment -274377210ред


рдХрд╛рд░реНрдп

  • [x] #[proc_macro_attribute] (рдкреАрдЖрд░ #38842) рд▓рд╛рдЧреВ рдХрд░реЗрдВред

    • [x] рдлрд┐рдХреНрд╕ #39347 (рдкреАрдЖрд░ #39572)ред

    • [x] рдлрд┐рдХреНрд╕ #39336 (рдкреАрдЖрд░ #44528)ред

  • [x] #[proc_macro] (PR #40129) рд▓рд╛рдЧреВ рдХрд░реЗрдВред
  • [x] proc_macro_derive s рдХреЗ рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ InvocationCollector (PR #39391) рдореЗрдВ рдкрд╣рдЪрд╛рдиреЗрдВ рдФрд░ рдПрдХрддреНрд░ рдХрд░реЗрдВред
  • [x] рдореИрдХреНрд░реЛ-рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд proc_macro_derive рдЖрдпрд╛рдд рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВред

    • рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

#[derive(Trait, OtherTrait)] struct S; // Both these derives should resolve
macro_rules! m { () => {
    #[macro_use(Trait)] extern crate derives;
    use derives::OtherTrait; // this kind of import is gated behind `#![feature(proc_macro)]`
} }
m!();
  • [ ] рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП proc_macro_derive s (PR #48465) рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдЗрдЯрдо рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВред
  • [x] рдЕрдкреНрд░рдпреБрдХреНрдд #[macro_use] рдЖрдпрд╛рдд (рдкреАрдЖрд░ #39060) рдХреЗ рд▓рд┐рдП рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВред
  • [x] рдЯреЛрдХрди рдЯреНрд░реА (PR #39118) рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд░ рдХреЛ рд░рд┐рдлрд▓реЗрдХреНрдЯрд░ рдХрд░реЗрдВред
  • [x] TokenStream рдХреЛ рдФрд░ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ (PR #39173) рдХреА рддреИрдпрд╛рд░реА рдореЗрдВ рд╕рд╛рдл рдХрд░реЗрдВред
  • [x] TokenTree::Sequence (PR #39419) рдирд┐рдХрд╛рд▓реЗрдВред
  • [x] tokenstream::TokenTree рдХреЗ Delimited рд╡реИрд░рд┐рдПрдВрдЯ (PR #40202) рдореЗрдВ Vec<TokenTree> рдмрдЬрд╛рдп TokenStream s рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
  • [x] Path s рдФрд░ TokenStream s рдХрд╛ рдЙрдкрдпреЛрдЧ ast::Attribute s (PR #40346) рдореЗрдВ рдХрд░реЗрдВред

    • [x] рд╡рд┐рд╢реЗрд╖рддрд╛/рд╡реНрдпреБрддреНрдкрдиреНрди рдореИрдХреНрд░реЛрдЬрд╝ рдореЗрдВ рдЧреИрд░-рддреБрдЪреНрдЫ рдкрдереЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ (рдЙрджрд╛рд╣рд░рдг #[foo::bar] , #[derive(foo::Bar)] )ред

  • [x] рд╕рднреА рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рд╕реНрд╡рдЪреНрдЫрддрд╛ рд╕рдВрдмрдВрдзреА рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рдкреАрдЖрд░ #40597)ред
  • [x] рдЖрд░рдПрдлрд╕реА (рдкреАрдЖрд░ #40939) рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд proc_macro::TokenStream рд▓рд┐рдП рдПрдХ рдиреНрдпреВрдирддрдо рдПрдкреАрдЖрдИ рд▓рд╛рдЧреВ рдХрд░реЗрдВред

    • [x] Token::Interpolated рдЯреЛрдХрди рдореЗрдВ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд AST рдЕрдВрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд TokenStream s рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВред

    • [x] proc_macro рдлреАрдЪрд░ рдЧреЗрдЯ рдХреЗ рдкреАрдЫреЗ TokenStream рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрди proc_macro::quote! ред

  • [x] proc_macro рд▓реЗрдЦрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдРрд╕рд╛ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ, рдЬреЛ рдореИрдХреНрд░реЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреНрд░реЗрдЯ рд░реВрдЯ рдкрд░ extern crate foo; рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдкреВрд░реНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреНрд░реЗрдЯ рдореЗрдВ рдЖрдЗрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП foo (рдкреАрдЖрд░ # 40939)ред

    • [ ] рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВред

  • [ ] AST рдореЗрдВ рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд TokenStream s рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВред
  • [ ] рд╕реНрдерд┐рд░рддрд╛ рдЬрд╛рдВрдЪ (рдЦрд░реАрдж-) рдореИрдХреНрд░реЛрдЬрд╝ (рдореБрджреНрджрд╛ #34079)ред
  • [x] proc рдореИрдХреНрд░реЛ рдХреЛ def_site рдорд╛рди (рд╕рдорд╕реНрдпрд╛ #47311) рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рдЬреА рдлрд╝реАрд▓реНрдб рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред (рдкреАрдЖрд░ #48082)
  • [x] рдкреНрд░реЛ рдореИрдХреНрд░реЛ рдореЗрдВ рдмреНрд░реЗрд╕реНрдб рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдмрдирд╛рдо рдЯрдкрд▓ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЗ рдПрдХреНрд╕реЗрд╕рд┐рдВрдЧ рдлреАрд▓реНрдб рдХреЗ рдмреАрдЪ рдЕрд╕рдВрдЧрддрд┐ (рдЕрдВрдХ #47312)ред (рдкреАрдЖрд░ #48083)
  • [ ] рдЪрд░рдг 1 (рдЕрдВрдХ #47314) рдореЗрдВ рдореИрдХреНрд░реЛ рд░реВрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд╕рдЯреАрдбреА рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдПрдВред
  • [x] proc_macro::quote! (рдЕрдВрдХ #47315) рдХреЗ рдЕрдВрджрд░ рдЕрдорд╛рдиреНрдп рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рддреНрд░реБрдЯрд┐ рд╕реБрдзрд╛рд░реЗрдВред
  • [ ] рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╡рд╛рд▓реЗ рдЯреЛрдХрдирд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдбрд┐рд╕реНрдкреНрд▓реЗ рдФрд░ рдЗрдирдЯреВрдЗрдЯрд░реЗрдЯрд░ рдХреЗ рдмреАрдЪ рдЕрд╕рдВрдЧрддрд┐ (рдореБрджреНрджрд╛ #47627)ред
  • [x] #[cfg_attr] .to_string() рдФрд░ рдЯреЛрдХрдирд╕реНрдЯреНрд░реАрдо рдХреЛ рдЕрд╕рд╣рдордд рдмрдирд╛рддрд╛ рд╣реИ (рдореБрджреНрджрд╛ #48644)ред
  • [x] libproc_macro рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ (#4786 рдореЗрдВ рдЪреЗрдХрд▓рд┐рд╕реНрдЯ)ред
A-macros A-macros-1.2 A-macros-2.0 A-plugin B-RFC-approved B-unstable C-tracking-issue T-lang T-libs finished-final-comment-period

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдареАрдХ рд╣реИ, рдпрд╣ рдореБрджреНрджрд╛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИ рдФрд░ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЦреБрд▓рд╛ рд░рдЦрдирд╛ рдФрд░ рдПрдкреАрдЖрдИ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ https://github.com/rust-lang/rust/pull/54728 рдЦреЛрд▓рд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдХрдИ рдФрд░ рдЕрдзрд┐рдХ рдмрд╛рд░реАрдХ рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ:

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдореИрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ рд╣реВрдВ рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ! рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рдФрд░ рдлреЙрд▓реЛ-рдЕрдк рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реВрдВ

рд╕рднреА 184 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╕реАрд╕реА @nrc @jseyfried

рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ #[proc_macro_attribute] рдХреЛ рдЬрд▓реНрдж рд╣реА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдФрд░ рдкрд░реАрдХреНрд╖рдг рдЙрдкрдпреЛрдЧ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдзрдорд╛рдХрд╛ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЕрднреА рддрдХ рдХреЛрдИ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИ: рдЕрдкреНрд░рдпреБрдХреНрдд::

рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк: https://github.com/abonander/anterofit/blob/proc_macro/macros/src/lib.rs
рдЙрджрд╛рд╣рд░рдг/рдкрд░реАрдХреНрд╖рдг: https://github.com/abonander/anterofit/blob/proc_macro/examples/post_service_proc_macro.rs

рдХрд╛рд░реНрдп

(dtolnay рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЪреЗрдХрд▓рд┐рд╕реНрдЯ рдХреЛ рдУрдкреА рддрдХ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛)

cc @nrc @petrochenkov @durka @Ralith

@jseyfried рдореИрдВ рдПрдХ рдРрд╕реЗ рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛, рдЬрд╣рд╛рдВ рдПрдХ рд╡рд┐рд░рд╛рд╕рдд рдореИрдХреНрд░реЛ рдФрд░ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдПрдХ рд╣реА рджрд╛рдпрд░реЗ рдореЗрдВ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рд╣рдо рдпрд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рджреЛрдиреЛрдВ рдПрдХ рд╣реА рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реЛ рд╕рдХреЗрдВ рдФрд░ рдЗрд░рд╛рджрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ?

@abonander рд╕рднреА рдореИрдХреНрд░реЛрдЬрд╝ (рдмреИрдВрдЧ, рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ, рдФрд░ рд╡реНрдпреБрддреНрдкрдиреНрди) рд╕рдорд╛рди рдирд╛рдорд╕реНрдерд╛рди рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рджрд╛рдпрд░реЗ рдореЗрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдЙрд╕ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ -- рдХреНрдпрд╛ рдЖрдк рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ?

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдореБрдЭреЗ рдкрд╛рд░реНрдЯреА рдореЗрдВ рджреЗрд░ рд╣реЛ рд░рд╣реА рд╣реИред рдореИрдВ рдПрдПрд╕рдЯреА рдХреЗ рдмрдЬрд╛рдп рдЯреЛрдХрди рдХреЛ рдмреЗрдирдХрд╛рдм рдХрд░рдиреЗ рдХреА рджрд┐рд╢рд╛ рд╕реЗ рдЦреБрд╢ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд░рдПрдлрд╕реА рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд┐рд╢рд┐рд╖реНрдЯ TokenStream рдПрдкреАрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЪрд┐рдВрддрд╛рдПрдВ рд╣реИрдВ:

pub enum TokenKind {
    Sequence(Delimiter, TokenStream),

    // The content of the comment can be found from the span.
    Comment(CommentKind),

    // `text` is the string contents, not including delimiters. It would be nice
    // to avoid an allocation in the common case that the string is in the
    // source code. We might be able to use `&'codemap str` or something.
    // `raw_markers` is for the count of `#`s if the string is a raw string. If
    // the string is not raw, then it will be `None`.
    String { text: Symbol, raw_markers: Option<usize>, kind: StringKind },

    // char literal, span includes the `'` delimiters.
    Char(char),

    // These tokens are treated specially since they are used for macro
    // expansion or delimiting items.
    Exclamation,  // `!`
    Dollar,       // `$`
    // Not actually sure if we need this or if semicolons can be treated like
    // other punctuation.
    Semicolon,    // `;`
    Eof,          // Do we need this?

    // Word is defined by Unicode Standard Annex 31 -
    // [Unicode Identifier and Pattern Syntax](http://unicode.org/reports/tr31/)
    Word(Symbol),
    Punctuation(char),
}

pub enum StringKind {
    Regular,
    Byte,
}

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдПрдкреАрдЖрдИ рдПрдХ рдкреВрд░реНрдг рдпреЛрдЬрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдереА рдЬрд┐рд╕реЗ рдЖрд░рдПрдлрд╕реА рдХреЗ рд╡рд┐рд▓рдп рдХреЗ рд╕рдордп рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╛ рдмрд╛рдж рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдЙрджрд╛рд╣рд░рдг рдерд╛ред

рдЖрдо рддреМрд░ рдкрд░, рдпрд╣ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдмрд╛рд╣рд░ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЧрдП "рд╕рд╛рдорд╛рдиреНрдп" рд░рд╕реНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд▓рдЧрддрд╛ рд╣реИред рдЬрдмрдХрд┐ рдХреБрдЫ рдореИрдХреНрд░реЛрдЬрд╝ рдХреБрдЫ рдПрдб-рд╣реЙрдХ рдбреЛрдореЗрди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рд╖рд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЕрдиреНрдп "рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬрдВрдЧ" рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВред

  1. (рдорд╛рдореВрд▓реА) рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ Eof рдЬрд░реВрд░реА рд╣реИред рдПрдХ Iterator рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрднрд╡рддрдГ TokenStream рд╕реЗ рдЕрдзрд┐рдХ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ Iterator::next рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдЕрдВрдд рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП None рд▓реМрдЯрд╛рддрд╛ рд╣реИред

  2. (рдорд╛рдореВрд▓реА) рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ Exclamation , Dollar , рдпрд╛ Semicolon рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Punctuation('!') рдкрд░ рдорд┐рд▓рд╛рди рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рдирд╣реАрдВ рд╣реИред

  3. (рдорд╛рдореВрд▓реА) рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреНрдп рдиреЗ рдЖрд░рдПрдлрд╕реА рдкреАрдЖрд░ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд╣рдо рдЙрди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝-рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реИрдВред (рдХреЛрдИ рднреА рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдЬреЛ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рд╕рдВрднрд╡рддрдГ рд╡реНрд╣рд╛рдЗрдЯрд╕реНрдкреЗрд╕ рдХреЛ рднреА рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред)

  4. рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореИрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ, рдмрд╣реБ-рдЪрд░рд┐рддреНрд░ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ (рдЬреЛ рд╢рд╛рдпрдж рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдЕрднреА рднреА рдПрдХ рдЦреБрд▓рд╛ рдкреНрд░рд╢реНрди рд╣реИред рдкреАрдЖрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЖрд░рдПрдлрд╕реА рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

  5. рд╕рдВрдЦреНрдпрд╛ рдЕрдХреНрд╖рд░ рдЧрд╛рдпрдм рд╣реИрдВред рдХреНрдпрд╛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рд╢рд╛рдмреНрджрд┐рдХ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП [Punct('1'), Punct('_'), Punct('2'), Punct('3'), Punct('4'), Punct('.'), Punct('5'), Punct('e'), Punct('6')] рдХреЛ рд╕реНрд╡рдпрдВ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рд╡реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП str::parse::<f32> рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬрд┐рд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд░рд╕реНрдЯ рд╢рд╛рдмреНрджрд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреАрдЪ рдореЗрдВ _ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред

    рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╕реНрдерд┐рд░рддрд╛ рдХреА рдЪрд┐рдВрддрд╛ рд╣реИред рдХреНрдпрд╛ рд╣рдо u128 / i128 (рдФрд░ рд╕рдВрднрд╡рддрдГ рднрд╡рд┐рд╖реНрдп рдореЗрдВ f128 , u256 ,тАж) рдЯреЛрдХрди рдПрдкреАрдЖрдИ? рдЗрд╕реЗ рд╕рдВрднрд╡ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

    struct IntegerLiteral { negative: bool, decimal_digits: String, type_suffix: Option<String> }
    impl TryInto<u32> IntegerLiteral { type Err = OutOfRange; /* тАж */ }
    // Other impls for integer types supported in this compiler version
    
    // Something similarly for floats
    

    рдпрд╛ рд╢рд╛рдпрдж рдХреБрдЫ рдФрд░ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ "рдирд╛рдЯрдХ рд╕рдВрдЦреНрдпрд╛рдПрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ" рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред

  6. // рд╢рдмреНрдж рдпреВрдирд┐рдХреЛрдб рдорд╛рдирдХ рдЕрдиреБрд▓рдЧреНрдирдХ 31 рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ -

    рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред UAX 31 рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдХреБрдЫ рднрд┐рдиреНрди рд░реВрдкреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рднреА "рд╢рдмреНрдж" рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдЬреЛ рд╕рдЯреАрдХ рднрд┐рдиреНрдирддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдЪреБрдирдирд╛ рдЗрд╕ рд╕рдордп рдЧреИрд░-ASCII рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдлреАрдЪрд░-рдЧреЗрдЯреЗрдб рдХреНрдпреЛрдВ

    рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ "рдЬреЛ рдХреБрдЫ рднреА рд╡рд░реНрддрдорд╛рди рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдпрд╛ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ" рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЬреЛ рдкреНрд░рддрд┐ # 28979 рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ)ред рд╢рд╛рдпрдж libmacro рдореЗрдВ pub fn is_identifier(&str) -> bool рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ API рдХреЗ рд╕рд╛рдеред

  7. рдпреВрдирд┐рдХреЛрдб рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдФрд░ рдмрд╛рдЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рдПрдХ рдПрдХрд▓ рдЯреЛрдХрди рд╕рдВрд╕реНрдХрд░рдг рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧрд▓рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕реНрдореГрддрд┐ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рд╣реИрдВ ( str рдмрдирд╛рдо [u8] )ред рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ text: Symbol рдШрдЯрдХ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рд╢рд╛рдмреНрджрд┐рдХ рдЯреБрдХрдбрд╝рд╛ рд╣реЛрдирд╛ рд╣реИ рдпрд╛ рдмреИрдХрд╕реНрд▓реИрд╢ рдПрд╕реНрдХреЗрдк рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореВрд▓реНрдпред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрд╛рдж рд╡рд╛рд▓рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред (рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, Char(char) рдХреЗ рдмрд╛рдж рд╕реЗ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рд╣реЛ рдЧрдпрд╛ рд╣реИ \u{A0} рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд▓реЗрддрд╛ рд╣реИ char рд╕рдЪрдореБрдЪ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред)

рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рдореИрдХреНрд░реЛрдЬрд╝ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рддрд░рд╣ рд▓рд┐рд╕реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреВрд░реЗ рдЬрдВрдЧ рдХреЗ рд▓рд┐рдП рдПрд╕-рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

@ рд╕рд╛рдЗрдорди рд╕реИрдкрд┐рди ,

рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреНрдп рдиреЗ рдЖрд░рдПрдлрд╕реА рдкреАрдЖрд░ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд╣рдо рдЙрди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝-рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реИрдВред (рдХреЛрдИ рднреА рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдЬреЛ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рд╕рдВрднрд╡рддрдГ рд╡реНрд╣рд╛рдЗрдЯрд╕реНрдкреЗрд╕ рдХреЛ рднреА рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред)

рдХреГрдкрдпрд╛ рдордд рдХрд░реЛред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ-рд╡реЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЕрд▓рдЧ рд╕рдВрдХрд▓рди рдЙрддреНрдкрд╛рдж рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рдПрдВрдЧреЗ) рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореИрдВ рдЕрдиреБрд╡рд╛рдж рдореИрдХреНрд░реЛрдЬрд╝ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдПрдХ рдЕрд▓рдЧ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдЕрдиреБрд╡рд╛рдж рд▓реЛрдб рдХрд░реЗрдЧрд╛ рдФрд░ рдореИрдВ рдбреАрдмрдЧ рдмрд┐рд▓реНрдб рдореЗрдВ рдЙрдк-рдЙрддреНрдкрд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдПрдХ рд╕реВрдЪреА рдЬреЗрдирд░реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдФрд░ рдЙрд╕ рд╕реВрдЪреА рдореЗрдВ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рд░рд╕реНрдЯ-рд▓реЛрдХреЗрд▓/рд░рд╕реНрдЯ-рд▓реЛрдХреЗрд▓ # 19)ред рддреЛ рдЯрд┐рдкреНрдкрдгреА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдФрд░ рдореИрдХреНрд░реЛ рдХреЛ рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдореИрдВ рдЙрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рдЕрдиреНрдп рдмрд┐рдВрджреБрдУрдВ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред

@ рдЬрд╛рди-рд╣реБрдбреЗрдХ
рднрд▓реЗ рд╣реА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ TokenKind::Comment , рдлрд┐рд░ рднреА рдЖрдк рд▓рдЧрд╛рддрд╛рд░ рдЯреЛрдХрди рдХреЗ рдмреАрдЪ рд╕реНрдкреИрди рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рджреЗрдЦрдХрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ TokenKind::Comment рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЪрд┐рдВрддрд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдореИрдХреНрд░реЛ рдЗрдирд╡реЛрдХреЗрд╢рди рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реЛрдВред

@ jan-hudec рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреА?

@abonander , рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддреА рд╣реИрдВред рдЕрдиреБрд╡рд╛рдж рдпреЛрдЧреНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИрдВ, рдЖрдЗрдЯрдо рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВред рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдЙрдиреНрд╣реЗрдВ рдирд┐рдХрд╛рд▓рдирд╛ рдХреЗрд╡рд▓ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ - рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рдЕрд▓рдЧ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЯреЛрдХрд░реЗ рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ _all_ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╡реГрджреНрдзрд┐рд╢реАрд▓ рд╕рдВрдХрд▓рди рдЙрд╕реЗ рддреЛрдбрд╝ рджреЗрдЧрд╛)ред

рдореИрдВ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рд╕рд░реНрдбреЗ рдХреЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ (рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕реАрдзреЗ рд╕рд░реНрдбреЗ рдЯреЛрдХрдирд╕реНрдЯреНрд░реАрдо рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ) рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╣рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдХреА рдмрдЬрд╛рдп рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрд░реНрдбреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрд╣ рдореИрдХреНрд░реЛрдЬрд╝ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдореИрдВ 'рд╕рд╛рдорд╛рдиреНрдп' рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рднреА рдЗрд╕реА рддрд░рд╣ рдХреА рдЪреАрдЬ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред

рдореЗрд░рд╛ рдПрдХрдорд╛рддреНрд░ рд╕рдорд╛рдзрд╛рди рдЕрднреА serde_derive рдХреЛ рдлреЛрд░реНрдХ рдХрд░рдирд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ rustc рд╕реЗ рд╣реИ:

error: the `#[proc_macro_derive]` attribute is only usable with crates of the `proc-macro` crate type

рдЗрд╕реЗ рд╣рдЯрд╛рдирд╛ рдФрд░ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЬрдЯрд┐рд▓рддрд╛ рднреА рд╣реИ рдЬреЛ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП - рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдХреНрд░реЗрдЯ рд╕рдВрднрд╡рддрдГ рджреЛрдиреЛрдВ рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдХреНрд░реЗрдЯ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдкреНрд░реЛ-рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╡реНрдпреБрддреНрдкрдиреНрди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ред рд╡реЛ рдХреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдЗрд╕ рд╕рдордп рднреА рдРрд╕рд╛ рд╣реА рдХреБрдЫ рд╣реИ, рдЬрд╣рд╛рдВ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЯреЛрдХрд░реЗ рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рдПрдХ рдЯреЛрдХрд░рд╛ рдХреЛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

@aidanhs

рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдХреНрд░реЗрдЯ рд╕рдВрднрд╡рддрдГ рджреЛрдиреЛрдВ рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдХреНрд░реЗрдЯ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдкреНрд░реЛ-рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╡реНрдпреБрддреНрдкрдиреНрди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рд╡реЛ рдХреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ?

рдЖрдк proc-macro рдЯреЛрдХрд░реЗ рд╕реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ (рдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА) рддрдХ рдирд╣реАрдВ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗред рдпрджрд┐ рдЖрдк TokenStream -> TokenStream рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ TokenStream -> TokenStream рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдПрдХ рдЕрд▓рдЧ, рдЧреИрд░- proc-macro рдХреНрд░реЗрдЯ рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рдПрдХ proc-macro рдЯреЛрдХрд░рд╛ рдЬреЛ рд╕рд┐рд░реНрдл рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реМрдВрдкрддрд╛ рд╣реИред

рдпрд╣ RFC рдЬреНрдпрд╛рджрд╛рддрд░ #40939 рднреВрдорд┐ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

proc_macro рд▓реЗрдЦрдХреЛрдВ рдХреЛ рдХреНрд░реЗрдЯ рд░реВрдЯ рдкрд░ extern crate foo; рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдкреВрд░реНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреНрд░реЗрдЯ рдореЗрдВ рдЖрдЗрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ foo

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдореИрдВ рдПрдХ рдПрдХрд▓ рдЯреЛрдХрд░рд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдореЗрдВ рдЧреИрд░-рдореИрдХреНрд░реЛ рдЖрдЗрдЯрдо рдФрд░ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рджреЛрдиреЛрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рдЙрдХреНрдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЬрдм #40939 рднреВрдорд┐, рдХреНрдпрд╛ рдпрд╣ рддреАрди-рдЯреЛрдХрд░рд╛ рдкреИрдЯрд░реНрди рдЗрд╕ рд▓рдХреНрд╖реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛?

  1. рд╕рднреА рдЧреИрд░-рдореИрдХреНрд░реЛ рдЖрдЗрдЯрдо foo_runtime
  2. рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рд▓рд╛рдЧреВ foo_macros , рдореЗрдВ рдкреНрд░рддреАрдХреЛрдВ рдХреА рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реБрдП foo_runtime рдЖрд╡рд╢реНрдпрдХ рдХреЗ рд░реВрдк рдореЗрдВ
  3. рдПрдХ рдЕрдВрддрд┐рдо "рдореБрдЦреМрдЯрд╛" рдЯреЛрдХрд░рд╛ рдЬреЛрдбрд╝реЗрдВ foo рдХрд┐ pub use s foo_runtime рдФрд░ foo_macros рд╕реЗ рдЖрдЗрдЯрдо рд╣реИрдВ

    • рдпрд╣ рдПрдХрдорд╛рддреНрд░ рдЯреЛрдХрд░рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реАрдзреЗ рдЖрдпрд╛рдд рдХрд░реЗрдЧрд╛

    • рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрд╡рдЪреНрдЫрддрд╛ рдкреНрд░рдгрд╛рд▓реА рдореИрдХреНрд░реЛ рдХреЛ рд╕рд╣реА рдЯреЛрдХрд░рд╛ рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд░рддреА рд╣реИ

рдореИрдВ рдкреВрдЫрддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рджреЛ рдмрдХреНрд╕реЗ рдЖрдпрд╛рдд рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдФрд░ рдпрд╣ рдкреНрд░рдпреЛрдЬреНрдп рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ рдХреЗ рд╕рд╛рде рджреВрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВред

@lрдлреЗрдпрд░реА рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ "рджреЛ-рдЯреЛрдХрд░рд╛" рдкреИрдЯрд░реНрди рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛:

  1. рд╕рднреА рдЧреИрд░-рдореИрдХреНрд░реЛ рдЖрдЗрдЯрдо foo
  2. рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рд▓рд╛рдЧреВ foo_macros , рдореЗрдВ рдкреНрд░рддреАрдХреЛрдВ рдХреА рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реБрдП foo рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреИрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ
#[proc_macro]
fn m(_: TokenStream) -> TokenStream {
    quote! {
        extern crate foo; // due to hygiene, this is never a conflict error
        foo::f();
        // --- or just --- (if/when we get the sugar)
        $universe::foo::f();
    }
}
  1. pub use рдЖрдЗрдЯрдо foo_macros рд╕реЗ foo ред

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрд╡рдЪреНрдЫрддрд╛ рдкреНрд░рдгрд╛рд▓реА рдореИрдХреНрд░реЛ рдХреЛ рд╕рд╣реА рдЯреЛрдХрд░рд╛ рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд░рддреА рд╣реИ

рдПрдХ рдЕрд▓рдЧ рдХреНрд░реЗрдЯ рдореЗрдВ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдХреЛ рдкреБрди: рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рдЗрд╕ рдмрд╛рдд рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рд╕реЗ рдирд╛рдо рдХреИрд╕реЗ рд╣рд▓ рд╣реЛрддреЗ рд╣реИрдВред

@jseyfried : рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкреБрди: рдирд┐рд░реНрдпрд╛рдд рдЪрд╛рд▓ рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░рддреА рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдЗрди рдХреНрд░реЗрдЯреЛрдВ рдореЗрдВ рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рди рдХрд░ рдкрд╛рдиреЗ рдХреА рдареАрдХ рд╡реИрд╕реА рд╣реА рд╕реАрдорд╛ рд╣реЛрддреА рд╣реИред

@ рдХреЙрд▓рд┐рди-рдХреАрдЧрд▓
рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди рдХреНрд░реЗрдЯ рдХреЗрд╡рд▓ рдореИрдХреНрд░реЛ рдХреНрд░реЗрдЯ рдХреА рдЦрд░реАрдж рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ #[proc_macro_derive] s рд╣реЛрддреЗ рд╣реИрдВред
#[feature(proc_macro)] , рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рдХреНрд░реЗрдЯреЛрдВ рдореЗрдВ рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди рдкреБрди: рдирд┐рд░реНрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдЬреИрд╕реЗ рдЖрдк рдЕрдиреНрдп рдкреНрд░реЛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдкреБрдирдГ рдирд┐рд░реНрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@jseyfried рдореИрдВ рдЗрд╕ рд╕рдордп рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЕрд╡рдЧрдд рд╣реВрдВ, рдореИрдВрдиреЗ рд╕рд╡рд╛рд▓ рдЙрдард╛рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЖрджрд░реНрд╢ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдк рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдХрд┐рд╕реА рдЕрдиреНрдп рдХреНрд░реЗрдЯ рдХреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ 'рдкреНрд░рддрд┐рдирд┐рдзрд┐'/рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореИрдХреНрд░реЛ рд▓реЗрдЦрдХ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реЗрд░реНрдбреЗ) рдХреЛ рдЕрдкрдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рджреЛ рдХреНрд░реЗрдЯ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╢реНрд╡рд╕реНрдд рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рд╖рдп рдмрди рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреА рддрд░рд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рддреЛ рдЕрдкрд╕реНрдЯреНрд░реАрдо рдХреНрд░реЗрдЯ рд▓реЗрдЦрдХ рдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЙрдирдХреЗ рдХреНрд░реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореИрдВ рд╕рдВрдЧрддрддрд╛ рдЦрддрд░реЗ рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реВрдВ - рдореИрдХреНрд░реЛ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╕рдЯреАрдХ рдЯреЛрдХрдирдЯреНрд░реА рд╕реНрдерд┐рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╕реЗрд░реНрдбреЗ рдмрджрд▓рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдкреИрдЪ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ Derive рдХреИрд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдореИрдВрдиреЗ рдПрдХ рдирд╛рдЬреБрдХ рдореИрдХреНрд░реЛ рд▓рд┐рдЦрд╛ рд╣реИ, рдореЗрд░рд╛ рдореИрдХреНрд░реЛ рдореЗрд░реЗ рдХреНрд░реЗрдЯ рдХреЗ рд╣рд░ рдПрдХ рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ (рд╡рд░реНрддрдорд╛рди рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдирд╛рдЬреБрдХ рдореИрдХреНрд░реЛ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрд╣рд╛рдВ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рдХреЗрд╡рд▓ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд▓рдЧрд╛рддрд╛рд░)ред

@jseyfried

рдХреНрдпрд╛ рдпрд╣ рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдЧреЛ рдбрд┐рдкреНрд▓рд┐рд╕реНрдЯ рд╕реЗ foo рдЦреАрдВрдЪрддрд╛ рд╣реИ? рдпрд╣ рдмреБрд░рд╛ рд▓рдЧрддрд╛ рд╣реИ (рдпрд╛рдиреА рдХреНрдпрд╛ рдпрд╣ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмреЗрд╡рдХреВрдлреА рднрд░рд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдмрд╛рдЗрдирд░реА рдореЗрдВ foo рдирд╛рдо рдХреЗ 2 рдХреНрд░реЗрдЯ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ?)

@aidanhs рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди/рдЬреЛрдбрд╝ рд╣реЛрдЧрд╛ рдЬреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЖрд░рдПрдлрд╕реА рдХреЛ рд╡рд╛рд░рдВрдЯ рдХрд░реЗрдЧрд╛ред

@ рдПрд░рд┐рдпрд▓рдм1

рдХреНрдпрд╛ рдпрд╣ рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдЧреЛ рдбрд┐рдкреНрд▓рд┐рд╕реНрдЯ рд╕реЗ foo рдЦреАрдВрдЪрддрд╛ рд╣реИ? рдпрд╣ рдмреБрд░рд╛ рд▓рдЧрддрд╛ рд╣реИ

рд╣рд╛рдБ - рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдЙрджреНрдзреГрдд extern crate рдирд╛рдо рд╕реНрд╡рдЪреНрдЫ рдирд╣реАрдВ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рд╕рдВрдХрд▓реНрдк рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдХреНрд░реЗрдЯ рдирд╛рдо рдЙрд╕ рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реИрдВ рдЬрд╣рд╛рдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдкреБрди: рдирд┐рд░реНрдпрд╛рдд рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛рдиреА foo_macros рдХреЛ foo рдкреБрди: рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рддрд╛рдХрд┐ рд╣рдо рдЬрд╛рди рд╕рдХреЗрдВ рдХрд┐ foo рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реЛрдЧрд╛), рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрд░рдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ foo рдирд╛рдо рдХреЗ рджреЛ рдХреНрд░реЗрдЯ рд╣реЛрдиреЗ рдкрд░ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рд░реБрджреНрдзред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдЪрд░рдг 1 (рдпрд╛рдиреА рд▓рдХреНрд╖реНрдп wrt рд╣реЛрд╕реНрдЯ рдмрдирд╛рдо рд▓рдХреНрд╖реНрдп) рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ Cargo.toml рд▓рд┐рдП proc-macro --target-extern рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдпрд╣ рд╣рдореЗрдВ extern crate рдирд╛рдореЛрдВ рдХреЛ quote! рджрд╛рдпрд░реЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

@jseyfried

рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░реЛ-рдореИрдХреНрд░реЛ рдХреНрд░реЗрдЯ рдХреЗ "рд▓рдХреНрд╖реНрдп" рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рд╣реЛрдЧреА, рд╣реИ рдирд╛?

@ arielb1 рд╣рд╛рдБ, рдмрд┐рд▓реНрдХреБрд▓ред

рдпрд╣ RFC рдЬреНрдпрд╛рджрд╛рддрд░ #40939 рднреВрдорд┐ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

@jseyfried рдЬреИрд╕рд╛ рдХрд┐ рдкреАрдЖрд░ рднреВрдорд┐ рдкрд░ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреНрдпрд╛ рд░рд╣реЗрдЧрд╛? рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдпрд╣ рдЕрднреА рддрдХ рдПрдХ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛ, рдЬрд╣рд╛рдВ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ 95% рд░рд╛рд╕реНрддрд╛ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ рдФрд░ рд▓реЛрдЧ рд╕рднреА рдЙрддреНрд╕рд╛рд╣рд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЪреАрдЬреЗрдВ рдПрдВрдЯреАрдХреНрд▓реЗрдореЗрдХреНрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред

рдХреЗ рд░реВрдк рдореЗрдВ, рдЬрдм рд╡рд╣ рдкреАрдЖрд░ рд▓реИрдВрдб рдХрд░рддрд╛ рд╣реИ рддреЛ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрддрд╛ рд╣реИ?

рдирд╣реАрдВ, рд╣рдо extern crate рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░реАрдХрд░рдг рдФрд░ рд╢рд╛рдпрдж рднрд╡рд┐рд╖реНрдп рдХреЗ рдкреНрд░реВрдл рд╣рд╛рдЗрдЬреАрди рд╕реЗ рдкрд╣рд▓реЗ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЕрд░реНрдерд╛рдд рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд @ рдПрд░рд┐рдпрд▓рдм1 рдиреЗ рдмрддрд╛рдпрд╛)ред

рд╣рдо рд╢рд╛рдпрдж рдЗрд╕ рдПрдкреАрдЖрдИ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ; @eddyb рдиреЗ рд╕рднреА рдЯреЛрдХрди рдЯреНрд░реА рдХреЗ рд▓рд┐рдП OpKind рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡/рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред рд╕рд╛рде рд╣реА, рд╣рдо рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ, рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдЕрдХреНрд╖рд░ рдЖрджрд┐ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВред рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдЗрд╕ рдкреАрдЖрд░ рдореЗрдВ рдПрдкреАрдЖрдИ рдЕрднреА рддрдХ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдкрд░рд┐рдкрдХреНрд╡ рдирд╣реАрдВ рд╣реИред

@bstree рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдЖрд░рдПрдлрд╕реА https://github.com/rust-lang/rfcs/ рдкреБрд▓/1913

@ est31 рд╕реНрдердЧрд┐рдд, рдФрд░ рдЕрдзрд┐рдХ рдкрд╕рдВрдж - рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЕрдиреБрднрд╡ рдХреЗ рдмрд╛рдж рд╣рдо рдПрдХ рд╕рдмрд╕реЗрдЯ рдкрд░ рд╕рд╣рдордд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рд╕реНрдерд┐рд░ рдХреЛ рдлрд╛рд╕реНрдЯ-рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

String -рдЖрдзрд╛рд░рд┐рдд API рдШреЛрд╖рдгрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ 2.0 рдХреЗ рд╕рд╛рде рдмреБрд░реА рддрд░рд╣ рд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдЬ рдореИрдХреНрд░реЛрдЬрд╝ 2.0 рдХреЗ рдмрд┐рдирд╛ рдФрд░ рдХреЗрд╡рд▓ #[derive] s рдХреЗ рд╕рд╛рде рднреА рд╕реАрдорд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред рд╣рдо String рдЖрдзрд╛рд░рд┐рдд API рдХреЗ рдкреНрд░рд╕рд╛рд░ рд╕реЗ рдпрдерд╛рд╕рдВрднрд╡ рдмрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдореИрдХреНрд░реЛрдЬрд╝ 2.0 рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗред

рдореИрдВрдиреЗ #[proc_macro_attribute] рд▓рд┐рдП рдПрдХ рдореБрджреНрджрд╛ рдЦреЛрд▓рд╛ рд╣реИ рдЬреЛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ (рд╢рд╛рдпрдж рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЖрдЗрдЯрдо?)

рдЪреВрдВрдХрд┐ рдпрд╣ рдЕрдм proc_macro рдХреНрд░реЗрдЯ рдФрд░ рдЗрд╕рдХреЗ рдирдП рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдореИрдВ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рднреА рд▓рд┐рдЦреВрдВрдЧрд╛ред рдореИрдВрдиреЗ proc-macro2 рдирд╛рдордХ рдПрдХ рдЯреЛрдХрд░рд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп proc_macro рдХреНрд░реЗрдЯ рдЗрди-рдЯреНрд░реА рдХреЗ рд╕рдорд╛рди рд╣реЛрдирд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рд╕реНрдерд┐рд░ рдЬрдВрдЧ рдкрд░ рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдмреЗрд╣рддрд░ рдЕрд╡рдзрд┐ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рд▓рд╛рдн рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рдд рдХреЗ рдЬрдВрдЧ рдкрд░ рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднреА рд░рдЦрддрд╛ рд╣реИред рдЙрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп syn рдЬреИрд╕реЗ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдиреАрдВрд╡ рдмрдирдирд╛ рд╣реИ, рдФрд░ syn рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╣рдореЗрдВ рдХреБрдЫ рдХрдорд┐рдпрд╛рдВ рдорд┐рд▓реАрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рд╕реАрдзреЗ proc_macro рдореЗрдВ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

  • рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢рд╛рдмреНрджрд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ Literal рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧреАрдХрд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рдмрд╛рдж рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЗрдиреНрд╣реЗрдВ рд╕реАрдзреЗ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

    • рдХрдЪреНрдЪреЗ рддрд╛рд░ - r###" foo "###

    • рдХрдЪреНрдЪреЗ рдмрд╛рдЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ - rb#" foo "#

    • рдмрд╛рдЗрдЯ рд╢рд╛рдмреНрджрд┐рдХ - b'x'

    • рдбреЙрдХреНрдЯрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ - рдпреЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ Literal рдЯреЛрдХрди рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпреА рдЬрд╛рддреА рд╣реИрдВред

  • Literal рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдХрд╛ рдореВрд▓реНрдп рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдЕрднреА рд╣рдо to_string рд╢рд╛рдмреНрджрд┐рдХ рдХреНрд░реЗрдЯ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Literal рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ рдФрд░ рдпрд╣ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЗрд╕ рддрдХ рдкрд╣реБрдВрдЪреЗрдВред
  • рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЯреЛрдХрди рдХреА рдореИрдкрд┐рдВрдЧ рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН рдЕрднреА рдбреЙрдХреНрдЯрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ Literal рдкреНрд░рдХрд╛рд░ рдкрд░ рдореИрдк рдХрд░рддреА рд╣реИрдВред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╕реЗ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЬрдм рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдореИрдВ рдПрдХ рдЯреВрдЯрдирд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ #![feature(proc_macro)] рд╣реИ рдХрд┐ рдХрд╕реНрдЯрдо рдХреА рд╡реНрдпреБрддреНрдкрддреНрддрд┐ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ #[proc_macro_derive(foo, attributes(foo))] ред рдпрд╛рдиреА, рдПрдХ рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдирд╛рдо рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИред рдРрд╕рд╛ рд╣реА рдПрдХ рдЯреЛрдХрд░рд╛ рд╣реИ рдореЗрд░рд╛ - рд╡реНрдпреБрддреНрдкрдиреНрди-рддреНрд░реБрдЯрд┐-рд╢реНрд░реГрдВрдЦрд▓рд╛, рдЬрд┐рд╕рдореЗрдВ #[derive(error_chain)] #[error_chain(...)] struct ErrorKind { ... } ред рджреВрд╕рд░рд╛ рд╡реНрдпреБрддреНрдкрдиреНрди-рдирдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ #[derive(new)] #[new] struct S; ред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпрд╛ рдЕрдиреНрдп рд╣реИрдВред

рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП, рдХрдВрдкрд╛рдЗрд▓рд░ рджреВрд╕рд░реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ "foo" is a derive mode ред рдХреНрдпрд╛ рдпрд╣ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╣реИ рдпрд╛ рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдЕрдЧрд░ рдЬрд╛рдирдмреВрдЭрдХрд░ рдореБрдЭреЗ рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ ErrorChain рдпрд╛ рдХреБрдЫ рдФрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

@ рдЕрд░реНрдирд╡рд┐рдпрди
рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рдерд╛ - рдЪреВрдВрдХрд┐ proc_macro_attribute s рдХреЛ рд╡реНрдпреБрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрджрд┐ new proc_macro_attribute рддреЛ рд╡рд┐рд╕реНрддрд╛рд░ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ new рдХреЛ proc_macro_derive рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИ (рднрд╡рд┐рд╖реНрдп-рд╕рдВрдЧрддрддрд╛ рдЦрддрд░рд╛ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред

рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рдерд╛ - рдЪреВрдВрдХрд┐ proc_macro_attributes рдХреЛ рд╡реНрдпреБрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрджрд┐ new proc_macro_attribute рддреЛ рд╡рд┐рд╕реНрддрд╛рд░ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ред

рдареАрдХ рд╣реИ, рдореИрдВ рдирд╛рдо рдмрджрд▓рдиреЗ рдЬрд╛рдПрдЧрд╛ #[derive(error_chain)] рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП #[derive(ErrorChain)] ред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ new рдХреЛ proc_macro_derive рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИ (рднрд╡рд┐рд╖реНрдп-рд╕рдВрдЧрддрддрд╛ рдЦрддрд░рд╛ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред

рдЬрд╝рд░реВрд░, рдореИрдВ рд╕реНрдкреЗрд╢рд▓-рдХреЗрд╕ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП new рдирд╣реАрдВ рдорд╛рдБрдЧ рд░рд╣рд╛ рдерд╛ред рдпрд╣ рджреЛ proc_macro_derive s рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рд╕рд┐рд░реНрдл рдПрдХ рдЙрджрд╛рд╣рд░рдг рдерд╛ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдЯреВрдЯ рдЧрдпрд╛ рд╣реИред

@Arnavion рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореЗрд░реА рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдереА - рдореЗрд░рд╛ рдорддрд▓рдм рд╡рд┐рд╢реЗрд╖-рдорд╛рдорд▓рд╛ new рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди #[derive(some_macro)] #[some_attr] struct S; рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдм some_attr рдПрдХ proc_macro_derive рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИ some_attr рд╕рдорд╛рдзрд╛рди proc_macro_attribute , рддреЛ рдпрд╣ рдПрдХ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП; рдЖрдЬ, рдпрд╣ рдПрдХ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рддреНрд░реБрдЯрд┐ рд╣реИ рдпрджрд┐ some_attr рдХрд┐рд╕реА рднреА рдореИрдХреНрд░реЛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рдВ, рдореБрдЭреЗ рдпрд╣ рдорд┐рд▓ рдЧрдпрд╛ред

( рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╢реНрди рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рд╣реА рдЬрдЧрд╣ рд╣реИред )

рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИ?

  • [ ] proc_macro рд▓реЗрдЦрдХреЛрдВ рдХреЛ рдПрдХ рдкреВрд░реНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреНрд░реЗрдЯ рдореЗрдВ рдЖрдЗрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд╛рд╕реНрддрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ foo рдореИрдХреНрд░реЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреНрд░реЗрдЯ рд░реВрдЯ рдкрд░ extern crate foo; рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ (рдкреАрдЖрд░ #40939 )

рдкреАрдЖрд░ рдЙрддрд░ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмреЙрдХреНрд╕ рдЕрднреА рднреА рдЪреЗрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред @jseyfried рдиреЗ рдпрд╣рд╛рдВ рдХреБрдЫ use рд╕рд╛рде рдмрд┐рд▓реНрдХреБрд▓ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ:

let call_site_self = TokenTree {
    kind: TokenNode::Term(Term::intern("self")),
    span: Span::call_site(),
};
quote! {
    extern crate foo; // due to hygiene, this is never a conflict error

    // Neither of those works    
    use foo::f;
    use self::foo::f;
    use $call_site_self::foo:f;
}

рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рднреВрд▓ рд░рд╣рд╛ рд╣реВрдБ? рдореИрдХреНрд░реЛ рдореЗрдВ рдЖрдпрд╛рдд рдХрд┐рдП рдЧрдП рдмрд╛рд╣рд░реА рдХреНрд░реЗрдЯ рд╕реЗ use рдкреНрд░рддреАрдХреЛрдВ рдХрд╛ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ?

рдЖрдк use рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ https://github.com/rust-lang/rfcs/issues/959 рджреЗрдЦреЗрдВред рд▓реЗрдХрд┐рди рдореИрдХреНрд░реЛ рдХреЗ рд▓рд┐рдП рд╣рд░ рдмрд╛рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпреЛрдЧреНрдп рдкрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рд╣реИред (рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ)

@parched рдЗрд╕ рдЕрдиреНрдп рдореБрджреНрджреЗ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдерд╛:

рдЕрдкрдиреЗ рдореИрдХреНрд░реЛ рдореЗрдВ рдореИрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдореИрдЪ-рдореИрдЪрд░ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ Term рд▓рд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдпрд╛ рддреЛ рдПрдХ рдПрдирдо рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЪрд░ рдирд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдорд┐рд▓рд╛рди рдореВрд▓реНрдп рдХреЛ рдмрд╛рдВрдзрддрд╛ рд╣реИред macro_rules! рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЫрджреНрдо рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП:

macro_rules foo {
    ($matcher:ident) => {
        match something() {
            $matcher => {}
            _ => {}
        }
    }
}

рдЕрдм рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗрд╡рд▓ рдПрдирдо рдирд╛рдо рдХреЗ рдмрд┐рдирд╛ рднрд┐рдиреНрди рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдореИрдВ рдЬреЗрдирд░реЗрдЯ рдХреЛрдб рдореЗрдВ use my_crate::AnEnum::*; рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдбрд╛рд▓реВрдВрдЧрд╛ред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ (рдЕрднреА), рдореБрдЭреЗ рдЦреБрдж рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ $matcher рдПрдирдо рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореЗрд░реА рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╕рдордЭ рдореЗрдВ рдЖ рд░рд╣реА рд╣реИред рдореИрдВ рдореИрдХреНрд░реЛ-рдЬреЗрдирд░реЗрдЯреЗрдб рдХреЛрдб рдореЗрдВ use рд▓рд┐рдП рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗрд╕ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

@LukasKalbertodt рдХреНрдпрд╛ рдЖрдк my_crate::AnEnum::$matcher => {} рдореЗрдВ match ?
рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ, рдореИрдВ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рд╣реВрдВ -- рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ https://github.com/rust-lang/rfcs/issues/959 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

@jseyfried No: $matcher рдпрд╛ рддреЛ рдПрдХ рднрд┐рдиреНрди рдирд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдХрд░реЗрдЧрд╛) рдпрд╛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЪрд░ рдирд╛рдо рдЬреИрд╕реЗ match x { simple_var_name => {} } ред рдмрд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ AFAICT рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред (рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ use рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ)

@jseyfried

рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рдерд╛ - рдЪреВрдВрдХрд┐ proc_macro_attributes рдХреЛ рд╡реНрдпреБрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрджрд┐ new proc_macro_attribute рддреЛ рд╡рд┐рд╕реНрддрд╛рд░ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ред

рдареАрдХ рд╣реИ, рдореИрдВ рдирд╛рдо рдмрджрд▓рдиреЗ рдЬрд╛рдПрдЧрд╛ #[derive(error_chain)] рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП #[derive(ErrorChain)] ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ macro_rules рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд╕рд╛рде рднреА рд╡рд┐рд░реЛрдз рдХрд░рддреА рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЬреИрд╕реЗ рдХрд┐ рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди рдЖрдпрд╛рдд рдЖрджреЗрд╢ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдпрд╣ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ:

#![feature(proc_macro)]
#[macro_use] extern crate error_chain; // macro_rules! error_chain
#[macro_use] extern crate derive_error_chain; // #[proc_macro_derive(error_chain, attributes(error_chain))]

#[derive(error_chain)] // No error. Resolves to custom derive
enum ErrorKind {
    /*#[error_chain]*/ // (1) As discussed above, can't use this any more since it conflicts with the name of the custom derive
    Foo,
}

рдпрд╣ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рд░ рдЬрдВрдЧ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдХрд┐ (1) рд╕реНрдерд┐рд░ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВ рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдмрдзрд╛рдИ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП #[macro_use] рдХреЗ рд╕рд╛рде error-chain рдЯреЛрдХрд░рд╛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА derive-error-chain ред

рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЕрдЧрд░ рдореИрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдирд┐рдХрд╛рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдирд╛рдо рдмрджрд▓рдиреЗ ErrorChain рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП (1) рдХреЗ рд╕рд╛рде рдХрд╛рдо proc_macro рд╕реБрд╡рд┐рдзрд╛ (рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд┐рд░ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛ рддреЛрдбрд╝рдиреЗ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ):

#![feature(proc_macro)]
#[macro_use] extern crate error_chain; // macro_rules! error_chain
#[macro_use] extern crate derive_error_chain; // #[proc_macro_derive(ErrorChain, attributes(error_chain))]

#[derive(ErrorChain)] // Unique name, so no error
enum ErrorKind {
    #[error_chain] // (2)
    Foo,
}

рдпрд╣ рдЕрднреА рднреА рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - (2) рдкрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИ: macro `error_chain` may not be used in attributes рдХреНрдпреЛрдВрдХрд┐ macro_rules рдореИрдХреНрд░реЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдб рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди рджреНрд╡рд╛рд░рд╛ рдкрдВрдЬреАрдХреГрдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реИ рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВред

рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди рдФрд░ рдЗрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рджреЛрдиреЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди (рдкреНрд░рддреНрдпреЗрдХ рдПрдирдо рдкрд░ рдПрдХ) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ (рдПрдирдо рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдПрдХ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдореЗрд░реА рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рдПрдХ рдмрдбрд╝рд╛ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рдЕрдкрдиреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рд╕реНрдерд┐рддрд┐ рд╣реИ (рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди рдФрд░ рдЗрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП macro_rules рдореИрдХреНрд░реЛ рдХреЗ рдирд╛рдо рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛), рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдХреЛрдб рд╣реИ рдЬреЛ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди рдереЗ рд╕реНрдерд┐рд░ рд╣реЛ рдЧрдпрд╛, рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рдерд╛ рдХрд┐ рдЫрд╣ рдорд╣реАрдиреЗ рдмрд╛рдж рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреАред

рдХреНрдпрд╛ рдЗрд╕реЗ рд╢рд╛рдпрдж рдЗрд╕рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ macro_rules рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рджреЗрдВ рдЬреИрд╕реЗ рдХрд┐ рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди рд╕реНрд╡рдпрдВ macro_rules рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИ? рдЕрд╕рд▓ рдореЗрдВ рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЙрдирдХреЗ рдмреАрдЪ рдХреЛрдИ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреИрд╕реЗ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╣реА рдХрд╛рд░рдг рд╣реИ рдЬрдм рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗ рдмрд╛рдж macro_rules рдореИрдХреНрд░реЛ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдХрд┐ рд╕рднреА рдореИрдХреНрд░реЛрдЬрд╝ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд╡реЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореИрдХреНрд░реЛ рд╣реИрдВ, рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рдорд╛рди рдирд╛рдорд╕реНрдерд╛рдиред

рдХреНрдпрд╛ рдкреНрд░реЛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрдо рдФрдкрдЪрд╛рд░рд┐рдХ "рд╕реНрдерд╛рди" рд╣реИ? рдПрдХ #rust-proc-macro рдЖрдИрдЖрд░рд╕реА рдЪреИрдирд▓ рдХреА рддрд░рд╣? рдореИрдВ рд╕рдордп-рд╕рдордп рдкрд░ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЫреЛрдЯреЗ-рдЫреЛрдЯреЗ рдкреНрд░рд╢реНрди рдкреВрдЫрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рд╕реНрдкреИрдо рдХрд░рдирд╛ рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИ: рджреЗрдЦреЗрдВ_рдиреЛ_рдИрд╡рд┐рд▓: рдФрд░ #rust рдЪреИрдирд▓ рдореЗрдВ, рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧреЛрдВ рдиреЗ рдкреНрд░реЛ-рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирдпрд╛ proc_macro рдПрдкреАрдЖрдИ (рдЪреВрдВрдХрд┐ рдпрд╣ рдЕрд╕реНрдерд┐рд░ рдФрд░ рд╕рднреА рд╣реИ)ред рддреЛ: рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

@LukasKalbertodt #rust-internals , рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдмрд╕ /r/ rust рдкрд░ рдПрдХ рдирдпрд╛ рдзрд╛рдЧрд╛ рд╢реБрд░реВ рдХрд░реЗрдВред

TokenStream::from_str рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдХреЗ рдмрд╛рд╣рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдШрдмрд░рд╛рд╣рдЯ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд┐рд▓реНрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ):

thread 'main' panicked at 'proc_macro::__internal::with_sess() called before set_parse_sess()!', /checkout/src/libproc_macro/lib.rs:758:8

рдХреНрдпрд╛ рдЗрд╕ рдШрдмрд░рд╛рд╣рдЯ рдХреЛ рдПрдХ рдбрдореА "рд╕рддреНрд░" рдмрдирд╛рдиреЗ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡/рд╡рд╛рдВрдЫрдиреАрдп рд╣реЛрдЧрд╛? рдпрд╛ рд╢рд╛рдпрдж рдПрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ (рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рдкрде рдХреЗ рд╕рд╛рде) рдЬреЛрдбрд╝реЗрдВ?

рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ рдЕрдиреНрдп рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рдореИрдХреНрд░реЛрдЬрд╝ рдкрд░ рд╕рд╛рд╣рд┐рддреНрдп рдХреЛ рджреЗрдЦрд╛ рд╣реИ? рдореИрдВ рдЗрд╕ рдкрд░ рд▓реЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдпрд╣рд╛рдВ рд╕реНрдХреАрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрд╕рд╕реЗ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдкрд░рд┐рдЪрд┐рдд рд╣реВрдВред

рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ R7RS рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП syntax-rules рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ syntax-case рдЕрд╕реНрд╡рдЪреНрдЫ рдФрд░ рд╕реНрд╡рдЪреНрдЫ рдореИрдХреНрд░реЛ рд╕рд┐рд╕реНрдЯрдо ( defmacro рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ syntax-rules )ред рдЬреАрдПрдирдпреВ рдЧреБрдЗрд▓ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред syntax-case рдлреЗрдВрдбрд░ рдХреЗ рд▓рд┐рдП рднреА рд╕рдорд░реНрдерди рд╣реИ рдЬреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реВрдЪрд┐рдпреЛрдВ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдзреЗрдп рд╕рддреНрдпрд╛рдкрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдпрд╛, рдпреЛрдЬрдирд╛ рдореЗрдВ TokenStream рдХреА рддрд░реНрдЬ рдкрд░ рдХреБрдЫ)ред рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ Mark рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджрд╛рдпрд░реЗ рдХреЗ рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИред

рд╕рд╛рде рд╣реА, рдХреНрдпрд╛ рд╣рдореЗрдВ рдпрд╣ рднреА рдЪрд░реНрдЪрд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдордирдорд╛рдиреА рдЧрдгрдирд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рд░реИрдХреЗрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдкреВрд░реНрдг "рдЪрд░рдг" рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓реЗрддрд╛ рд╣реИ, рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, begin-for-syntax рдореИрдХреНрд░реЛ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рджреМрд░рд╛рди рд╕рдВрдХрд▓рди-рд╕рдордп рд╕реНрддрд░ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдФрд░ рдЧрдгрдирд╛ (?) рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред .

рдпреЛрдЬрдирд╛ рдореЗрдВ (datum->syntax <thing-to-copy-scope-from> <thing-to-apply-scope-to>) рд╕рд╛рде рд╕реНрд╡рдЪреНрдЫрддрд╛ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдмрд╣реБрдд рд╕рдВрднрд╡ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдореИрдХреНрд░реЛ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рддрддреНрдХрд╛рд▓ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рджрд╛рдпрд░рд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдж рд╕реНрдХреАрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ, рддреАрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рд▓реЗрдВред рдЖрд░. рдХреЗрдВрдЯ рдбрд╛рдЗрдмрд╡рд┐рдЧ рджреНрд╡рд╛рд░рд╛ (рдЪреЗрдЬрд╝ рд╕реНрдХреАрдо, рдЕрдм рд╕рд┐рд╕реНрдХреЛ рд╕рд┐рд╕реНрдЯрдореНрд╕ рдореЗрдВ): http://www.scheme.com/tspl3/syntax.html ред рдЙрджрд╛рд╣рд░рдг (include "filename.scm") рдХреЛ syntax-case рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдФрд░ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкрдврд╝рдиреЗ рдФрд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдЧрд╣рд░рд╛ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдореИрдХреНрд░реЛ-рдореИрдХреНрд░реЛ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдореИрдХреНрд░реЛ-рд╡рд┐рд╕реНрддрд╛рд░ рд╕рдордп рдкрд░ рдРрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдлрд╝рд╛рдЗрд▓ рдЖрдпрд╛рдд рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдЬреИрд╕реЗ рд╕рдВрдХрд▓рди-рд╕рдордп рдЧрдгрдирд╛рдУрдВ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдкреНрд░рддреНрдпрдХреНрд╖ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ)ред

рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рд╕реАрдорд╛рдПрдВ рдХреНрдпрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдВрдЧ, рдЗрд╕рдХреЗ рд╕рдВрдХрд▓рди рд╕рдордп рдореЗрдВ рдХрдЯреМрддреА рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рд╕рдВрдХрд▓рди-рд╕рдордп рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ (рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдирдВрдд рд▓реВрдк рд╕реЗ рдмрдЪреЗрдВ)ред рд░реИрдХреЗрдЯ рдиреЗ рдЫреЛрдЯреЗ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рд▓рд┐рд╕реНрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдЪрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде "рддреИрдпрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░рдХреЛрдВ рдХрд╛ рдЯреЙрд╡рд░" рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рд┐рдпрд╛ рд╣реИред рдХреНрдпрд╛ рд╣рдо рдлрд╝рд╛рдЗрд▓ I/O рдФрд░ рд╕реАрдорд┐рдд рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди-рд╕рдордп API рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рд╣рдореЗрдВ рдРрд╕реА рдЪреАрдЬреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рд╕реАрдПрд╕рд╡реА рд╕реНрдкреНрд░реЗрдбрд╢реАрдЯ рд╕реНрдкреЗрдХреНрд╕ рдХреЛ рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВ?

рдореБрдЭреЗ рдЕрдиреНрдп рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛! рдореИрдВрдиреЗ рд╕реБрдирд╛ рд╣реИ рдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдПрдПрд╕рдЯреА рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ, рдФрд░ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЖрд▓рд╕реНрдп рдирд┐рдпрдВрддреНрд░рдг рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдХрдИ рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдореИрдВ рд▓рд╛рдЗрди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд░рд╣рд╛ рд╣реВрдБред

рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рд╕реАрдорд╛рдПрдВ рдХреНрдпрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП?

рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд▓рд┐рдП, рдХреЛрдИ рдирд╣реАрдВ . рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИред рдпрд╣ рдХреБрдЫ рд╕реА ++ рдХреЛрдб рд▓реЗ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рдХреНрд▓реИрдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдореА рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрдХрд▓рди рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рдПрд╕рдХреНрдпреВрдПрд▓ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ, рд╕рдВрдмрдВрдзрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд░ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдкреВрдЫрддрд╛рдЫ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдЪрд┐рдд рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬреЛ рд▓реЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ!

рдзреНрдпрд╛рди рджреЗрдВ, рдХрд┐ рд░рд╕реНрдЯ рдореЗрдВ рдПрдХ рдФрд░ рдореИрдХреНрд░реЛ рд╕рд┐рд╕реНрдЯрдо рд╣реИред рдпрд╣ рдЕрджреНрдпрддрди RFC 1584 рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ https://github.com/rust-lang/rust/issues/39412 рджреНрд╡рд╛рд░рд╛ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

@VermillionAzure , рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднрд┐рдд рдпреЛрдЬрдирд╛ рдкреНрд░рдкрддреНрд░реЛрдВ рдХреЛ рддреНрд╡рд░рд┐рдд рд░реВрдк рд╕реЗ рджреЗрдЦрдиреЗ рд╕реЗ:

macro_rules , рдФрд░ рдЙрдирдХрд╛ рдЕрджреНрдпрддрди рдкреНрд░рддрд┐ RFC 1584 , syntax-rules ред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрдиреНрд╣реЗрдВ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрдЭрд╛рд╡ рд╣реИрдВ, рддреЛ https://github.com/rust-lang/rust/issues/39412 рд╢рд╛рдпрдж рдЙрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рд╣реИред

рдкреНрд░реЛ-рдореИрдХреНрд░реЛрдЬрд╝, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рдореБрджреНрджрд╛ рд╣реИ, define-syntax рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдХреА рддрд░рд╣ рд╣реИрдВред рдФрд░ рдпрд╣ RFC ( 1566 ) рдЬрд╛рдирдмреВрдЭрдХрд░ syntax-case рдЬреИрд╕реА рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЯреЛрдХрди рд╕реНрдЯреНрд░реАрдо рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ syntax-case рдЬреИрд╕рд╛ рдХреБрдЫ рдПрдХ рдЕрд▓рдЧ рдХреНрд░реЗрдЯ (рд▓рд╛рдЗрдмреНрд░реЗрд░реА) рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд░рд╛рджрд╛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░рдирд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрддрдиреЗ рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ, рддреЛ рдмреЗрдЭрд┐рдЭрдХ рдЗрдзрд░-рдЙрдзрд░ рдЦреЗрд▓реЗрдВред рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рдпрд╛ рдХрдард┐рди рд╣реИ, рдЗрд╕ рдкрд░ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдФрд░ рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реНрд╡рд╛рдЧрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдерд╛, рдореИрдХреНрд░реЛрдЬрд╝ рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛, рдЬреИрд╕реЗ рдХрд┐ рд▓рд┐рд╕реНрдк рдореЗрдВ, рд▓реЗрдХрд┐рди рдореИрдХреНрд░реЛ рд╣реЛрдиреЗ рдкрд░, рдЬреЛ рдореИрдХреНрд░реЛ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬреЛ macro_rules! рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред

рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдордХрдХреНрд╖ рд╣реЛрдЧрд╛:

    macro_rules! foo {/*define macro here*/}
#[proc_macro]
pub fn foo(tokens: TokenStream) -> TokenStream {
    macro_case! tokens {/*define macro here*/} //takes `tokens` as first argument, returns a `TokenStream`
}

рдЗрд╕ рддрд░рд╣ syntax-rules рдФрд░ syntax-case рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВред

@VermillionAzure
рдХреНрдпрд╛ рдпрд╣ рд╣реИ, рдЖрдк рдХреНрдпрд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ?

@porky11 рдирд╣реАрдВ, рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ред рдореИрдВ рд╕рд┐рд░реНрдл рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпреЛрдЬрдирд╛ рдореИрдХреНрд░реЛ рдПрдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╡рд┐рдЪрд╛рд░ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ - рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реЛ рдХреЗ рдмрд╛рдж рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдХрд░рдирд╛ рд╣реИ syntax-case рдпреЛрдЬрдирд╛ рдореЗрдВ рдореИрдХреНрд░реЛ рдкреНрд░рдгрд╛рд▓реА рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рдореВрд▓реА рдмрд╛рдд рд╣реИ рдпрд╣рд╛рдВ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдордирдорд╛рдиреА рд╢рдХреНрддрд┐ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рднреА рдореИрдХреНрд░реЛ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

@ jan-hudec рдХреНрдпрд╛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдЧрд╛рд░рдВрдЯреА рдХреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рднреА рдордирдорд╛рдиреА рдЧрдгрдирд╛ рдХреЛ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдмреБрджреНрдзрд┐рдорд╛рдиреА рд╣реИ? рдореИрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реВрдВ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдпрд╣рд╛рдВ рдЗрддрдиреЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд░рд╕реНрдЯ рдХреЗ рдХреЛрдИ рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕реЗ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд╣рд▓реВ рдорд╛рдиреЗрдВрдЧреЗ? рдореИрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рднреАрддрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЬрдВрдЧ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рд╣рдорд▓реЗ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдпрджрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдХреЛрдИ рдмрдЧ рд╣реЛрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЦрд░рд╛рдм рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ segfault), рддреЛ рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ segfault рдЯреНрд░рд┐рдХрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЙрдЪрд┐рдд рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рдлрд▓ рдХрд░ рджреЗрдЧрд╛?

рдХреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдорд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рд╕рдВрдХрд▓рдХ рдХреЗ рдХрд┐рд╕реА рдЕрдиреНрдп рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рди рдХрд░реЗ?

рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░: рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдХрдм рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ? рдпрджрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдЙрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреЗрдЯрдлреБрд▓ рдмрд╛рд╣рд░реА рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рдирд╛, рдмрд╛рд╣рд░реА SQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдмрджрд▓рдирд╛, рдмрд╛рд╣рд░реА рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд╛ рдХреБрдВрдЬреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛), рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рд╕рдВрдХрд▓рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ?

@VermillionAzure рдХрд╛рд░реНрдЧреЛ рдкреИрдХреЗрдЬ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд┐рд▓реНрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬреЛ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдордирдорд╛рдиреА рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдЙрд╕ рдореЛрд░реНрдЪреЗ рдкрд░ рдЪреАрдЬреЛрдВ рдХреЛ рдФрд░ рдЦрд░рд╛рдм рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ: рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреА рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред (рдпрд╣ crates.io рджреНрд╡рд╛рд░рд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп/рдПрдкреЗрдВрдб-рдУрдирд▓реА рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдХреБрдЫ рдЖрд╕рд╛рди рдмрдирд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рд╣реЛ рд░рд╣реА рд╣реИ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ Cargo.lock рдлрд╝рд╛рдЗрд▓ рд╣реИ: рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред) рдФрд░ рднрд▓реЗ рд╣реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рди рдХрд┐рдпрд╛ рд╣реЛ рдореМрдЬреВрдж рд╣реИрдВ, рдЖрдкрдХреА рдирд┐рд░реНрднрд░рддрд╛ рдЕрднреА рднреА рд╕реНрд╡рднрд╛рд╡ рд╕реЗ рд░рди-рдЯрд╛рдЗрдо рдкрд░ рдордирдорд╛рдирд╛ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИред рдХреНрдпрд╛ рд╕рдВрдХрд▓рди-рд╕рдордп рдмрд╣реБрдд рдЦрд░рд╛рдм рд╣реИ?

рдпрд╣ рдЪрд░реНрдЪрд╛ рдореБрдЭреЗ рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд, рд▓реЗрдХрд┐рди рдЕрд▓рдЧ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдкрд░ рдордЬрдмреВрд░ рдХрд░рддреА рд╣реИред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ рдЯреЛрдХрд░рд╛ рджреЛ рдкреНрд░реЛ рдореИрдХреНрд░реЛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ: foo!() рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдФрд░ bar!() рдЙрд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИред рдЗрд╕ рдЯреЛрдХрд░реЗ рдХрд╛ рдПрдХ рдЙрдкрднреЛрдХреНрддрд╛ рдПрдХ рд╣реА рдореЙрдбреНрдпреВрд▓ рдореЗрдВ foo!() рдФрд░ bar!() рджреЛрдиреЛрдВ рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░, рд╕рдВрдХрд▓рди рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреМрди рд╕рд╛ foo!() рдпрд╛ bar!() рдкрд╣рд▓реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЖрджреЗрд╢ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ, рдФрд░ рдпрджрд┐ рдкрд░реНрдпрд╛рдкреНрдд рд▓реЛрдЧ рдЗрд╕ рддрд░рд╣ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдирдХ рдмрди рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдмрдбрд╝рд╛ рдореБрджреНрджрд╛ рд╣реИред рдмрд╕ рдЗрд╕ рдмрд╛рдд рдХреЛ рд▓реЗрдХрд░ рдЪрд┐рдВрддрд┐рдд рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рд╢реИрдиреИрдирд┐рдЧрдиреНрд╕ рдХреЛ рдСрд░реНрдбрд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдлреАрд▓реНрдб рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣реЛрдЧреАред

@SimonSapin

рдЬрдмрдХрд┐ рдореИрдВ рдЖрдкрдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рдореБрдЭреЗ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдВрдХрд▓рди-рд╕рдордп рдирд┐рд╖реНрдкрд╛рджрди рдФрд░ рд░рдирдЯрд╛рдЗрдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмреАрдЪ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд╣реИ:

рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдЦрддрд░рд╛ рдореЙрдбрд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЪреАрдЬреЛрдВ рдХреЛ рдПрдХ рдмрд╛рд░ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдХрдИ рдорд╢реАрдиреЛрдВ рдкрд░ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рд┐рдирдХреНрд╕ рдбрд┐рд╕реНрдЯреНрд░реЛ рдмрд┐рд▓реНрдб рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рдЕрдиреБрд░рдХреНрд╖рдХ рдЕрд╕рд╛рд╡рдзрд╛рдиреА рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕реИрдВрдбрдмреЙрдХреНрд╕рд┐рдВрдЧ рдХреА рдХрдореА рдХрд╛ рд╢реЛрд╖рдг рдХрд░рдирд╛ред)

@lрдлреЗрдпрд░реА рд╣рд╛рдВ, рдпрд╣ рдареАрдХ рд╡рд╣реА рдореБрджреНрджрд╛ рд╣реИ рдЬреЛ рд░реИрдХреЗрдЯ рдХреЗ рдкрд╛рд╕ рдПрдХ рджрд╢рдХ рдкрд╣рд▓реЗ 2002 рдореЗрдВ рдерд╛ред рд░реИрдХреЗрдЯ рдХреЗ рд╕рд░реНрд╡реЛрдЪреНрдЪ рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛ рдореИрдереНрдпреВ рдлреНрд▓реИрдЯ рдиреЗ "рдХрдореНрдкреЛрдЬрд╝реЗрдмрд▓ рдПрдВрдб рдХрдВрдкрд╛рдЗрд▓реЗрдмрд▓ рдореИрдХреНрд░реЛрдЬрд╝: рдпреВ рд╡рд╛рдВрдЯ рдЗрдЯ рд╡реНрд╣реЗрди? " рдирд╛рдордХ рдПрдХ рдкреЗрдкрд░ рдмрдирд╛рдпрд╛ред рдЖрд░ рдХреЗрдВрдЯ рдбрд╛рдпрдмрд╡рд┐рдЧ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЪреЗрдЬрд╝ рдпреЛрдЬрдирд╛ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛, рдЙрдиреНрд╣реЛрдВрдиреЗ "рдЖрд░6рдЖрд░рдПрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдЪрд░рдг" рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп/рдореЙрдбреНрдпреВрд▓ рдХреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдореЗрдВ рдЪрд░рдгреЛрдВ рдкрд░ рдПрдХ рдкреЗрдкрд░ рднреА рд▓рд┐рдЦрд╛ред

@SimonSapin рд╕рдВрдХрд▓рди-рд╕рдордп рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдмрд╣реБрдд рдЦрд░рд╛рдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рд╢рд░реНрдд рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдПрдХ рд╡рд┐рд╢рд╛рд▓ Reddit рдкреЛрд╕реНрдЯ рд▓рд┐рдЦрдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рд╢реАрд░реНрд╖рдХ рд╣реЛрдЧрд╛ "рд░рд╕реНрдЯ рдХреЗ рдореЙрдбреНрдпреВрд▓ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВ" рдпрд╛ рдРрд╕рд╛ рдХреБрдЫред

@VermillionAzure , рдореИрдВрдиреЗ рд▓реЗрдЦреЛрдВ рдХреЛ рдмрд╣реБрдд рдзреНрдпрд╛рди рд╕реЗ рдирд╣реАрдВ рдкрдврд╝рд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡реЗ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЬрдВрдЧ рдХреЗ рд╕рд╛рдордиреЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдореБрджреНрджреЗ рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рдордиреЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдореБрджреНрджреЛрдВ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИрдВред

рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдореИрдХреНрд░реЛрдЬрд╝ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреМрди рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрдХрд▓рди-рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд░рди-рдЯрд╛рдЗрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдВрдЧ рдореЗрдВ рдПрдХ рдЯреЛрдХрд░рд╛ рдпрд╛ рддреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ, рдпрд╛ рд░рдирдЯрд╛рдЗрдо рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд┐рднрд╛рдЬрди (рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП) рд╕реНрдкрд╖реНрдЯ рд╣реИред

(рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд░рдирдЯрд╛рдЗрдо рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЯреЛрдХрд░рд╛ рдирд┐рдпрдо-рдЖрдзрд╛рд░рд┐рдд (рд╕реНрд╡рдЪреНрдЫ) рдореИрдХреНрд░реЛрдЬрд╝ рднреА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рд░рд╕реНрдЯ рдореЗрдВ рдЕрд▓рдЧ рддрдВрддреНрд░ рд╣реИрдВ)

@lрдлреЗрдпрд░реА рдЬрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рд╡рд╣ рд╡рд┐рд╕реНрддрд╛рд░рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдЖрджреЗрд╢ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЬрдВрдЧ рдореЗрдВ, рд╕рдВрдХрд▓рди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╡реГрджреНрдзрд┐рд╢реАрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░рдХреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдХреНрд░рдо рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рджреЛрдиреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд▓реЗрдЦ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИ? рдореИрдВрдиреЗ рдЗрд╕реЗ рдирд╣реАрдВ рджреЗрдЦрд╛ред

@ рдЬрд╛рди-рд╣реБрдбреЗрдХ рд╣рд╛рдБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреБрдо рд╕рд╣реА рд╣реЛред рд▓реЗрдХрд┐рди рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд╛ рдХреНрд░рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдорд╛рдпрдиреЗ рд░рдЦреЗрдЧрд╛ рдпрджрд┐ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рд╕рд╛рдЗрдб-рдЗрдлреЗрдХреНрдЯреНрд╕ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореЙрдбреНрдпреВрд▓ рд╕рд╛рдЗрдб-рдЗрдлреЗрдХреНрдЯреНрд╕ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдПрдХ рдореЙрдбреНрдпреВрд▓ "рдЯрд╛рдЗрдк-рд╕рдХреНрд╖рдо?"

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ "рд╢рд╛рдпрдж рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП" рдХреЗ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╣реЛрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рд╡рд┐рд╡рд░рдг (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ) рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рднрд╛рд╖рд╛ рдореЗрдВ рдЯрд╛рдЗрдк-рд╕рд┐рд╕реНрдЯрдо рдЬреИрд╕реА рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдордЬрдмреВрд░ рдХрд░ рд╕рдХреЗред рдХрд╛рд░реНрдпрд╛рддреНрдордХред

рдЗрди рд╡рд┐рд╡рд░рдгреЛрдВ рдореЗрдВ рдЕрдиреНрдп рдкреНрд░реЛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдФрд░ рд╕рдореЗрдХрди рдХрд╛ рдХреНрд░рдо рд╢рд╛рдорд┐рд▓ рд╣реИ, рдФрд░ рдХреНрдпрд╛ рдПрдХ рдкреНрд░реЛ-рдореИрдХреНрд░реЛ рдХреЛ рдПрдХ рд╡реГрджреНрдзрд┐рд╢реАрд▓ рдмрд┐рд▓реНрдб рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд╛рдж рдХреЗ рд▓рд┐рдП рд╣рдо рдмрд┐рд▓реНрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ rerun-if-changed рд╕рдорд╛рди рдирд┐рд░реНрднрд░рддрд╛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдмрд┐рд▓реНрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рддрд░рд╣ рдпреЗ рдШреЛрд╖рдгрд╛рдПрдВ рдЕрдзреВрд░реА рдпрд╛ рдЫреЛрдЯреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рд╣рдо рд╕рднреА рдмрдЧ рдХреЛ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд░реЛрдХ рд╕рдХрддреЗред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╛рдиреА рдкреНрд░реЛ рдореИрдХреНрд░реЛ рдХреНрд░реЗрдЯ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, рди рд╣реА рдЙрдиреНрд╣реЗрдВ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдкреБрди: рдЯреНрд░рд┐рдЧрд░ рд╣реЛрдиреЗ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡реЗ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ ( рддреЛ, рдХреЛрдИ рд╡реИрд╢реНрд╡рд┐рдХ рд░рд╛рдЬреНрдп рдирд╣реАрдВ)ред

рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдиреЗ-рдЕрдЧрд░-рдмрджрд▓реЗ рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╕реЗ рдЖрд░рд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

(рдореЗрд░реЗ рдкрд╛рд╕ рдЕрд░реНрдз-рдмреЗрдХреНрдб рд╕рд╛рдорд╛рдиреНрдп рдмрд┐рд▓реНрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ/рдкреНрд░реЛ рдореИрдХреНрд░реЛ рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ рдЬреЛ рдпрд╣рд╛рдВ рдХреБрдЫ рд╣рдж рддрдХ рдорджрдж рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрднреА рддрдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рд╣реИ)

рдЖрдИрдПрдордУ рдкреНрд░реЛ рдореИрдХреНрд░реЛрдЬрд╝/рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЛ рдХрд┐рд╕реА рднреА рдЖрдИ/рдУ рдпрд╛ рдмрд╛рд╣рд░ рдХреЗ рдЕрдиреНрдп рдХрдиреЗрдХреНрд╢рди рдХреЗ рдмрд┐рдирд╛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╡рд╛рд▓реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдорд┐рд░реА рджреНрд╡рд╛рд░рд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╢рд╛рдпрдж рдХреНрд░реЗрдирд▓рд┐рдлреНрдЯ рдЬреЗрдЖрдИрдЯреА рдХреЗ рд╕рд╛рдеред

@ est31 рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рд▓реЗрдХрд┐рди рдбреАрдЬрд▓ infer_schema рдЬреИрд╕реА рдЪреАрдЬреЗрдВ! рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
рдореМрдЬреВрдж рд╣реИ, рдмрд╛рдЗрдВрдбрдЬреЗрди рдХреЛ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ! рддрдерд╛
рдкрд░реНрдпрд╛рд╡рд░рдг рдЖрдИ/рдУ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

9 рдирд╡рдВрдмрд░, 2017 06:19 рдкрд░, "est31" [email protected] рд▓рд┐рдЦрд╛ рд╣реИ:

IMO рдкреНрд░реЛ рдореИрдХреНрд░реЛрдЬрд╝ / рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╡рд╛рд▓реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
рдмрд┐рдирд╛ рдХрд┐рд╕реА I/O рдпрд╛ рдмрд╛рд╣рд░ рдХреЗ рдЕрдиреНрдп рдХрдиреЗрдХреНрд╢рди рдХреЗ рдмрд┐рдирд╛ рдФрд░ рджреНрд╡рд╛рд░рд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
рдорд┐рд░реА, рд╢рд╛рдпрдж рдПрдХ рдХреНрд░реЗрдирд▓рд┐рдлреНрдЯ рдЬреЗрдЖрдИрдЯреА рдХреЗ рд╕рд╛рдеред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/38356#issuecomment-343124957 ,
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AAC3n5VOPdKBsu81Sp3tp2XlIQ05L865ks5s0t_PgaJpZM4LMWlc
.

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ #40939 рдФрд░ #44528 рдкрд╣рд▓реЗ рд╣реА рдорд░реНрдЬ рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВ... @jseyfried рдХреНрдпрд╛ рдЖрдк рдЪреЗрдХрд▓рд┐рд╕реНрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@ рдорд╛рд░реНрдХ-рдЖрдИрдПрдо рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рдХреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@VermillionAzure рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ рдХрд┐ рд╡реЗ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХреЗред рдпрджрд┐ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, "рд░рди-рдЯрд╛рдЗрдо" рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рддрд░рд╣, рдЙрдиреНрд╣реЗрдВ рдЙрди рдХреНрд░реЗрдЯреЛрдВ рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

syn рдореЗрдВ рд╣рдо рдЖрдЬ proc_macro::TokenNode рдХреА рдПрдХ рд╕реАрдорд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдП - рдмреНрд▓реЙрдХ рд╕реАрдорд╛рдВрдХрдХ { ... } рдЗрдирдкреБрдЯ рдЯреЛрдХрдирд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдкреИрди рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рддреНрд░реБрдЯрд┐ рдЬреЛ рдХреЗрд╡рд▓ рдмрдВрдж рд╣реЛрдиреЗ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреА рд╣реИ } ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Rustc рдореЗрдВ рдпрд╣ рд╕реАрдорд╛ рдирд╣реАрдВ рд╣реИред

mod m {
    type T =
}
error: expected type, found `}`
 --> src/main.rs:3:1
  |
3 | }
  | ^

рдПрдХ рдкреНрд░реЛ рдореИрдХреНрд░реЛ рдореЗрдВ рд╣рдо рдЬреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдЪреАрдЬреЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗ рд╣реИрдВ рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рдЕрдВрддрд┐рдо рдЯреЛрдХрди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛, рдкреВрд░реЗ рдмреНрд▓реЙрдХ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛, рдпрд╛ рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рдж рдЕрдЧрд▓реЗ рдЯреЛрдХрди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛, рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЖрдк рдКрдкрд░ рдХреА рддрд░рд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ Span::start рдФрд░ Span::end рд╡рд╛рдкрд╕реА рдПрдХ 1-рдЪрд░рд┐рддреНрд░ Span рдХреЗ рдмрдЬрд╛рдп рдПрдХ LineColumn рдХреЗ рд░реВрдк рдореЗрдВ рд╡реЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд╛рд╕реНрддрд╛ рдмреЗрдирдХрд╛рдм Span рд╕реЗ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐/рдЕрд╡рдзрд┐ рдХреЗ рд╕реНрддрдВрдн рдкрд░ рдЬрд╛рдПрдВред

sp.begin().line // before
sp.line() // after

sp.end().line // before
sp.end().line() // after

sp.end() // after, not possible before

@abonander рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ

рд╕реНрдкреИрди :: рд╕реНрдЯрд╛рд░реНрдЯ рдФрд░ рд╕реНрдкреИрди :: рдПрдВрдб рд▓рд╛рдЗрди рдХреЙрд▓рдо рдХреЗ рдмрдЬрд╛рдп 1-рдХреИрд░реЗрдХреНрдЯрд░ рд╕реНрдкреИрди рд▓реМрдЯрд╛рдПрдВ рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╕реНрдкреИрди рд╕реЗ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐/рд╕реНрдкреИрди рдХреЗ рдХреЙрд▓рдо рддрдХ рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдмреЗрдирдХрд╛рдм рдХрд░реЗрдВред

рдЗрд╕рд╕реЗ рд╕реНрдкреИрди рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдкрдирд╛рдПрдЧрд╛ рдЬрд┐рд╕рдХреА рд╕реАрдорд╛рдВрдХрд┐рдд рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рд╕рднреА рд╕реНрдкреИрди рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рд╣реЛрдЧрд╛ред рдЖрдо рддреМрд░ рдкрд░ рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рд╕реЗ foo(hi) рдЬреИрд╕реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрд╡рдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЕрдм рдЖрдк foo рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ sp.begin() , рд▓реЗрдХрд┐рди sp.begin() рдХреЗрд╡рд▓ foo рдХреЗ рдкрд╣рд▓реЗ рд╡рд░реНрдг рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рджреЛ рд╕реНрдкреИрди рдХреЛ proc_macro::TokenNode::Group рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ рдпрд╛ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╕реНрдкреИрди рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗред

Span::begin / end рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрджрд▓рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ: https://github.com/rust-lang/rust/pull/43604#issuecomment -327643229

рдореИрдВ Span::def_site() рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдореЗрд░реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдХреНрдпрд╛ рдореИрдВ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рд▓рдЧрднрдЧ рд╡рд╣реА рдХреЛрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдореИрдВ Span::call_site() рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ MySend main.rs рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ def_site() рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

#![feature(proc_macro)]

extern crate proc_macro;

use std::marker::Send as MySend;
use proc_macro::{TokenStream, TokenTree, TokenNode, Term, Delimiter, Span};

#[proc_macro]
pub fn impl_mysend_for(tokens: TokenStream) -> TokenStream {
    let span = Span::def_site();
    let ident = tokens.into_iter().next().unwrap();
    vec![
        TokenTree { span, kind: TokenNode::Term(Term::intern("unsafe")) },
        TokenTree { span, kind: TokenNode::Term(Term::intern("impl")) },
        TokenTree { span, kind: TokenNode::Term(Term::intern("MySend")) },
        TokenTree { span, kind: TokenNode::Term(Term::intern("for")) },
        ident,
        TokenTree { span, kind: TokenNode::Group(Delimiter::Brace, TokenStream::empty()) }
    ].into_iter().collect()
}
#![feature(proc_macro)]

extern crate mac;

struct S;
mac::impl_mysend_for!(S);

fn main() {}
error[E0405]: cannot find trait `MySend` in this scope
 --> src/main.rs:6:1
  |
6 | mac::impl_mysend_for!(S);
  | ^^^^^^^^^^^^^^^^^^^^^^^^^ did you mean `Send`?

рдЗрд╕реЗ рд╕рд┐рди рд╕рд╛рдЗрдб рдкрд░ рдЯреНрд░реИрдХ рдХрд░рдирд╛: https://github.com/dtolnay/syn/issues/290ред

@dtolnay
рдпрд╣рд╛рдВ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ MySend рдХреЛ рдЪрд░рдг 0 рдореЗрдВ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд рдХреНрд░реЙрд╕ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рд╣реЛрд╕реНрдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП), рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЪрд░рдг 1 рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ (рдЕрд░реНрдерд╛рдд рд▓рдХреНрд╖реНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╕рдордп)ред

рдпрд╣рд╛рдВ рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░реЛ-рдореИрдХреНрд░реЛ рдХреНрд░реЗрдЯ рдХреЛ рдЪрд░рдг 1 (рд▓рдХреНрд╖рд┐рдд рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░) рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдП рддрд╛рдХрд┐ рд╣рдо рдЪрд░рдг 1 рдЖрдЗрдЯрдо рдХреЛ рджрд╛рдпрд░реЗ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░ рд╕рдХреЗрдВред

рдЖрдЬ, рдПрдХ рдХрд╛рдордХрд╛рдЬ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реИ:

quote! { // n.b. non-interpolated tokens from `quote!` have `Span::def_site()`
    mod dummy {
        extern crate std;
        use self::std::marker::Send as MySend;
        unsafe impl MySend for $ident {} // this line is equivalent to what you have above
    }
} 

рдЖрдк рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ quote! рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХреЗ рдХрд╛рд░рдг, dummy / std / MySend рдХрднреА рднреА рджрд╛рдпрд░реЗ рдореЗрдВ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬ рд╕реЗ рдирд╣реАрдВ рдЯрдХрд░рд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЗрд╕ рдореИрдХреНрд░реЛ рдХрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, ident рд▓рд┐рдП "MySend", рдЖрджрд┐ рд╣реЛрдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред

рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде mod dummy рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдФрд░ рд╕рдорд╛рдзрд╛рди рдХреЛ https://github.com/rust-lang/rust/issues/45934#issuecomment -344497531 рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдлрд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдЬрдм рддрдХ рдЪрд░рдг 1 рдХреА рдирд┐рд░реНрднрд░рддрд╛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреА, рдпрд╣ рдЕрд░рд╛рдЬрдХреАрдп рд╣реЛрдЧрд╛ред

рдзрдиреНрдпрд╡рд╛рдж @jseyfried! рдпрд╣ рдЪрд▓рдиреЗ рд▓рдЧрд╛ред рдХреБрдЫ рдЕрдиреБрд╡рд░реНрддреА рдкреНрд░рд╢реНрди:

  • рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдХреЛрдб рдореЗрдВ, рдЕрдЧрд░ рдореИрдВ рдмрджрд▓ impl_mysend_for рдХреЗ рд▓рд┐рдП рдПрдХ impl рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Send рдХреЗ рдмрдЬрд╛рдп MySend рддрдм рд╕рдм рдХреБрдЫ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрд┐рд╕ Send рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдпрд╣ рдЪрд░рдг 0 рдмрдирд╛рдо рдЪрд░рдг 1 рднреЗрдж рдХреЛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рдЬрд╛рдирдмреВрдЭрдХрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрд╛ рджреБрд░реНрдШрдЯрдирд╛ рд╕реЗ?

  • рдореЗрд░реЗ def_site() рдЯреЛрдХрди рдЬреИрд╕реЗ Send рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдФрд░ рдХреНрдпрд╛ рд╣реИ?

  • рдпрджрд┐ MySend рдХреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдЖрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЬреИрд╕реЗ рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдо serde::Serialize рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ) рддреЛ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрднреА рднреА рдЕрдкрдиреЗ Cargo.toml рдореЗрдВ serde рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╣рдо рди рдХрд░реЗрдВ рдЙрдиреНрд╣реЗрдВ extern crate serde рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рдПрдЧрд╛ extern crate рдПрдХ рд╕рд╛рде def_site() рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдХрд╛ Cargo.toml рдХреЗ рдЦрд┐рд▓рд╛рдл рдЕрдзреНрдпрдХреНрд╖ рд╕рдВрдХрд▓реНрдк, рдФрд░ extern crate рдПрдХ рд╕рд╛рде call_site() рдмрд╣рд╛рд╡ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЕрдзреНрдпрдХреНрд╖ рд╕рдВрдХрд▓реНрдк рдХрд╛рд░реНрдЧреЛ рдЯреАрдУрдПрдордПрд▓?

рдмрд╛рд╣рд░реА рдмрдХреНрд╕реЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреНрд░реЗрдЯреНрд╕ рдХреЛ рдкреНрд░реЛ рдореИрдХреНрд░реЛ рджреНрд╡рд╛рд░рд╛ рдЪрд░рдг 1 рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

#[proc_macro_derive(Serialize, attributes(serde), crates(serde))]

@dtolnay

рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдХреЛрдб рдореЗрдВ, рдпрджрд┐ рдореИрдВ MySend рдХреЗ рдмрдЬрд╛рдп рднреЗрдЬреЗрдВ рдХреЗ рд▓рд┐рдП рдПрдХ impl рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП impl_mysend_for рдмрджрд▓рддрд╛ рд╣реВрдВ рддреЛ рд╕рдмрдХреБрдЫ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХрд┐рд╕рд╕реЗрдВрдб рдХреЛ рд╣рд▓ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдпрд╣ рдЪрд░рдг 0 рдмрдирд╛рдо рдЪрд░рдг 1 рднреЗрдж рдХреЛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рдЬрд╛рдирдмреВрдЭрдХрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрд╛ рджреБрд░реНрдШрдЯрдирд╛ рд╕реЗ?

рдЕрдЪреНрдЫрд╛ рдкреНрд░рд╢реНрдиред рдЕрднреА, рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реНрдерд▓ рдкрд░ рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рдкреНрд░реЛ-рдореИрдХреНрд░реЛ рдХреНрд░реЗрдЯ #![no_implicit_prelude] ) рдФрд░ рдпрд╣ рдПрдХ рджреБрд░реНрдШрдЯрдирд╛ рд╣реИ (рдХреБрдЫ рдЕрд░реНрдереЛрдВ рдореЗрдВ) рдЪрд░рдг 0 рдмрдирд╛рдо рдЪрд░рдг 1 рднреЗрдж рдХреЗ рдХрд╛рд░рдг рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ .

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЪрд░рдг 1 рдореЗрдВ рдкреНрд░реЛ-рдореИрдХреНрд░реЛ рд░реВрдЯ рдкрд░ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ std рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рддрд╛рдХрд┐ рдЖрдк рд╣рдореЗрд╢рд╛ quote!(use std::...); ) рдФрд░ рд╕реБрд╡рд┐рдзрд╛/рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рдХрд░ рд╕рдХреЗрдВ рдФрд░ рдЪреВрдВрдХрд┐ рдпреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рд╣рд┐рдд рд╣реИрдВ рдЪрд░рдг 0 рдореЗрдВред рдЪрд░рдг 1 рдореЗрдВ рдЬрд▓реНрдж рд╣реА рд░реВрдЯ рдкрд░ std рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рд╣реЛрдЧрд╛ред

рджрд╛рдпрд░реЗ рдореЗрдВ рдФрд░ рдХреНрдпрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореЗрд░реЗ def_site() рдЯреЛрдХрди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рднреЗрдЬреЗрдВ?

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рдФрд░ (рдЬрд▓реНрдж рд╣реА) std рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪрд░рдг 1 рдореЗрдВ рджрд╛рдпрд░реЗ рдореЗрдВ рдХреЗрд╡рд▓ рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рд╕реНрд╡рдпрдВ рдкреНрд░реЛ-рдореИрдХреНрд░реЛрдЬрд╝ рд╣реИрдВ (рдкреНрд░реЛ-рдореИрдХреНрд░реЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдирд╣реАрдВ , рдЬреЛ рдЪрд░рдг 0 рд╣реИрдВ)ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,

#[proc_macro]
fn f(input: TokenStream) -> TokenStream { ... }

#[proc_macro]
fn g(_input: TokenStream) -> TokenStream {
    quote! {
        f!(); ::f!(); // These both resolve to the above proc macro
        f(); // This doesn't resolve since the function is in phase 0
    }
}

рдХреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдХреЗ Cargo.toml рдХреЗ рдЦрд┐рд▓рд╛рдл def_site() рдкрд╣рдЪрд╛рди рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдмрд╛рд╣рд░реА рдХреНрд░реЗрдЯ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдФрд░ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо Cargo.toml рдХреЗ рд╡рд┐рд░реБрджреНрдз call_site() рдкрд╣рдЪрд╛рди рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдмрд╛рд╣рд░реА рдХреНрд░реЗрдЯ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛?

рд╣рд╛рдВ, рд╕рд┐рд╡рд╛рдп рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ Span::def_site() рд╕рд╛рде рдПрдХ рдмрд╛рд╣рд░реА рдЯреЛрдХрд░рд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдХреЗ Cargo.toml рдХреЗ рдЪрд░рдг 1 (рд▓рдХреНрд╖рд┐рдд) рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рдЖрдЬ рдХреЗ рдЪрд░рдг 0 рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣реЛрд╕реНрдЯ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИрдВ . рдЪреВрдВрдХрд┐ рдЪрд░рдг 1 рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдЕрднреА рддрдХ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ, рдмрд╛рд╣рд░реА рдХреНрд░реЗрдЯ рдХрд╛ рдирд╛рдо рдЕрд╕реНрд╡рдЪреНрдЫ рд░реВрдк рд╕реЗ рд╣рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИред

рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЪрд░рдг 1 рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ extern crate s рдЙрджреНрдзреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдХрдо рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдореЗрдВ рдЕрднреА рднреА рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рд╡рд░реНрддрдорд╛рди рдпреЛрдЬрдирд╛ рдкрд╣рд▓реЗ рдкреНрд░реЛ-рдореИрдХреНрд░реЛ рдХреНрд░реЗрдЯ рдХреА рд▓рдХреНрд╖реНрдп рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдордВрдерди рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реЗ рдЪреЗрддрд╛рд╡рдиреА рдЪрдХреНрд░ рдХреЗ рд╕рд╛рде рдЕрд╕реНрд╡рдЪреНрдЫ рд╕рдорд╛рдзрд╛рди рдкрд░ рд╡рд╛рдкрд╕ рдЖрдирд╛ рд╣реИред

рдмрд╛рд╣рд░реА рдмрдХреНрд╕реЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреНрд░реЗрдЯреНрд╕ рдХреЛ рдкреНрд░реЛ рдореИрдХреНрд░реЛ рджреНрд╡рд╛рд░рд╛ рдЪрд░рдг 1 рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
#[proc_macro_derive(Serialize, attributes(serde), crates(serde))]

рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рд╣рдо рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЪрд░рдг 1 рдХреНрд░реЗрдЯ рдХреЛ рдкреНрд░реЛ-рдореИрдХреНрд░реЛ рдХреНрд░реЗрдЯ рд░реВрдЯ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП #[phase(1)] extern crate foo; ) рдкрд░ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рддрд╛рдХрд┐ рдпрд╣ рд╕рднреА рдкреНрд░реЛ рдореИрдХреНрд░реЛрдЬрд╝ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП quote!(use foo::bar); ) рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реЛред рдЪреВрдВрдХрд┐ extern crate рд╡реИрд╕реЗ рднреА рдмрд╛рд╣рд░ рдЖ рд░рд╣рд╛ рд╣реИ, рд╣рдо рдЪрд░рдг 1 рдХреНрд░реЗрдЯ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ - Cargo.toml рд╕реЗ рд╕рднреА рд▓рдХреНрд╖реНрдп рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдЪрд░рдг 1 рдореЗрдВ proc-macro рдХреНрд░реЗрдЯ рд░реВрдЯ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реЛрдВрдЧреАред

рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдореИрдВ рджреЛ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкреИрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ: рдирд╛рдо рд╕рдорд╛рдзрд╛рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдХреНрдпрд╛ рдпреЗ рджреЛрдиреЛрдВ рдЕрд╡рд┐рднрд╛рдЬреНрдп рд░реВрдк рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ, рдпрд╛ рдХреНрдпрд╛ рдПрдХ рдЕрд╡рдзрд┐ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдЬреЛ рдПрдХ рдЕрд▓рдЧ рдЕрд╡рдзрд┐ рдХреЗ рд▓рд╛рдЗрди/рдХреЙрд▓ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд╡рдзрд┐ рдХреЗ рдирд╛рдо рд╕рдорд╛рдзрд╛рди рдкрд╣рд▓реВ рдХреЛ рдорд┐рд╢реНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ? рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░реЗ рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗ def_site рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд▓рд╛рдпрд╛ рдЧрдпрд╛ рдЧреБрдг рд╣реИ рдФрд░ рдореИрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрджрд┐ рдлрд╝реАрд▓реНрдб рдкреНрд░рдХрд╛рд░ рд╕рд╣реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдлрд╝реАрд▓реНрдб рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░реЗред

рдореИрдВ def_site рдЕрд╡рдзрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐ рдХреЙрд▓ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдЪрд▓рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╣рдореЗрд╢рд╛ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рд╣рдордиреЗ рдореИрдХреНрд░реЛрдЬрд╝ 1.1 рдХреЗ рд╕рд╛рде рджреЗрдЦрд╛ рдерд╛ред

  |
4 | #[derive(HeapSize)]
  |          ^^^^^^^^

рдпрд╛ рдореИрдВ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдлрд╝реАрд▓реНрдб рдХреА рдкрд╣рдЪрд╛рди рдпрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдорд╛рди рдЕрд╡рдзрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐ рдХреЙрд▓ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬреЛ рд╕рд╣реА рд░реЗрдЦрд╛рдВрдХрди рджрд┐рдЦрд╛рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореЗрд░реЗ def_site рдкрд░ рджрд╛рдпрд░реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред

  |
7 |     bad: std::thread::Thread,
  |     ^^^^^^^^^^^^^^^^^^^^^^^^

рдореИрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдкрдиреА рдЗрдЪреНрдЫрд╛рдиреБрд╕рд╛рд░ рдХреИрд╕реЗ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реВрдВ?

@dtolnay рдпрд╣ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдмрд┐рдВрджреБ рд╣реИ, рдзрдиреНрдпрд╡рд╛рджред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ https://github.com/rust-lang/rust/issues/46489 рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдЙрдЪрд┐рдд рддрд░реАрдХрд╛ рдЗрд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП #[derive(тАж)] рдЯреЛрдХрди рдореЗрдВ рдирд╛рдо-рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди-рд╕реНрдкреИрди рд╣реЛ рд╕реНрдХреЛрдк рдЯрд╛рдЗрдк рдбреЗрдлрд┐рдирд┐рд╢рди рдХреЗ рд░реВрдк рдореЗрдВ, рдФрд░ рддреНрд░реБрдЯрд┐-рд╕рдВрджреЗрд╢-рд╕реНрдкреИрди quote! {} рдореИрдХреНрд░реЛ рдЗрдирд╡реЛрдХреЗрд╢рди рдкрд░ рдЬрд┐рд╕рдиреЗ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдпрд╛ред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд╣рд╛рдиреА рд╣реИ? рдореЗрд░реЗ рдкрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдХреА рддрд░рд╣ рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ (4 рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ) рд▓реЗрдХрд┐рди рдЬрдВрдЧ 1.24.0-рд░рд╛рдд (рдмреА 65f0bedd 2018-01-01) рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рддрд░реНрдХ рджрд╛рдпрд░реЗ рдореЗрдВ рдирд╣реАрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдкрд╣рд▓реЗ рд╕рдорд╕реНрдпрд╛ рдЯреНрд░реИрдХрд░ рдХреА рдЦреЛрдЬ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдереА, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА https://github.com/rust-lang/rust/issues/46489 рдорд╛рд░рд╛ рд╣реИ

рдореИрдВрдиреЗ #47311 рджрд╛рдпрд░ рдХрд┐рдпрд╛ рдЬреЛ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡реНрдпреБрддреНрдкрдиреНрди (Deserialize) рдХреЗ рд╕рд╣реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдПрдХ рдРрд╕реА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдирд┐рдЬреА рдХреНрд╖реЗрддреНрд░ рд╣реЛрдВред

рджрд╛рдпрд░ рдПрдХ рдФрд░, # 47,312 рдЬреЛ рдХреА рддрд░рд╣ рдПрдХ рдЕрдирд╛рдо рдЯрдкрд▓ struct рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдореЗрдВ self.0 рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рд╣реИ . рдХреА рддрд░рд╣ рдПрдХ рдирд╛рдо рджрд┐рдпрд╛ struct рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЯреЛрдХрди self.x .

47311 рдФрд░ #47312 рдХреНрд░рдорд╢рдГ #48082 рдФрд░ #48083 рдореЗрдВ рддрдп рд╣реИрдВред

рдореЗрд░реЗ рдкрд╛рд╕ рдЙрдкрд░реЛрдХреНрдд рджреЛ рдкреАрдЖрд░ рд╕рдореАрдХреНрд╖рд╛/рдЯрд┐рдкреНрдкрдгреА рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ https://github.com/rust-lang/rust/pull/41029 рдЕрдм рд╣реЛ рдЧрдпрд╛ рд╣реИ?

рдЙрд╕ рдкреАрдЖрд░ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд▓реЗрдХрд┐рди рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ # 48465 рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрд╛ред рдлрд┐рд▓рд╣рд╛рд▓ рдХреНрд░реЗрдЯрд░ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реИред

@petrochenkov @nrc

syntax::ext::expand , рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ proc_macro_attribute s рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрдИ рд╕рдВрджрд░реНрднреЛрдВ (рдЧреИрд░-рд╕рдВрдкреВрд░реНрдг) рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ:

  • рдмреНрд▓реЙрдХ рдкрд░ ( fold_block() рдПрдХ рдиреЛрдк рд╣реИ)
  • рдмрдпрд╛рдиреЛрдВ/рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдкрд░ (#41475, #43988)
  • extern {} рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ (#48747)

RFC 1566 рд╡рд┐рд╢рд┐рд╖реНрдЯ AST рдиреЛрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рди рдкрд░ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реБрдП рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдпрд╣ рдереЛрдбрд╝рд╛ рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЬрд╣рд╛рдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдЕрдиреБрдорддрд┐ рдХрднреА рдирд╣реАрдВ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ (#43988)

@abonander рдЗрд░рд╛рджрд╛ рдпрд╣ рд╣реИ рдХрд┐

@nrc рдХрд╣реАрдВ рднреА рд╣реИ рдЬреЛ рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрджрд░реНрдн рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдХрд┐рд╕реА рднреА рдЖрдЗрдЯрдо рдкрд░ рд▓рд╛рдЧреВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рд▓рд┐рдВрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдмреНрд▓реЙрдХ рдФрд░ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдкрд░ рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@nrc рдХрд╣реАрдВ рднреА рд╣реИ рдЬреЛ рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрджрд░реНрдн рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдХрд┐рд╕реА рднреА рдЖрдЗрдЯрдо рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рд▓рд┐рдВрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдмреНрд▓реЙрдХ рдФрд░ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдкрд░ рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

afaik рдирд╣реАрдВ рд╣реИ - рдХрд┐рд╕реА рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡реАрдХреГрдд рдЖрд░рдПрдлрд╕реА рдФрд░ рдПрдХ рдЕрд╕реНрдерд┐рд░ рдлреАрдЪрд░ рдзреНрд╡рдЬ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдХреЗрд╡рд▓ рдмрдпрд╛рди рдФрд░ рдмреНрд▓реЙрдХ рдкрд░ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рд╣реИред рд╕рдВрджрд░реНрдн рдбреЗрдЯрд╛ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред

рдпрд╣ рдореБрджреНрджрд╛:

рд╕реНрдерд┐рд░рддрд╛ рдЬрд╛рдВрдЪ (рдЦрд░реАрдж-) рдореИрдХреНрд░реЛрдЬрд╝ (рдореБрджреНрджрд╛ #34079)ред

рдЕрдм WRT proc-macros рдмрдВрдж рд╣реЛ рдЧрдпрд╛ рд╣реИред рдореЗрд░реЗ рдкреАрдЖрд░ рдиреЗ рдореИрдХреНрд░реЛрдЬрд╝ 2.0 рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░рддрд╛-рдЬрд╛рдВрдЪ рдХреЛ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдЕрднреА рднреА рдЦреБрд▓рд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред

@rfcbot fcp рдорд░реНрдЬ

рдореИрдВ рд░рд╕реНрдЯ 1.28 рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛрдЬрд╝ 2.0 рдХрд╣рд╛рдиреА рдХреЗ рдПрдХ рд╕рдмрд╕реЗрдЯ рдХреЛ рдореИрдХреНрд░реЛрдЬрд╝ 1.2 рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд░рд╕реНрдЯ 1.28 10 рдордИ, 2018 рдХреЛ рд░рд╛рдд рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ (рдЗрд╕ рд▓реЗрдЦрди рд╕реЗ ~2.5 рд╕рдкреНрддрд╛рд╣) рдФрд░ 2 рдЕрдЧрд╕реНрдд, 2018 рдХреЛ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ FCP 10 рдордИ рдХреЗ рдХрдЯрдСрдл рд╕реЗ рдкрд╣рд▓реЗ 1.27 рдмреАрдЯрд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЙрд╕ рдХрдЯрдСрдл рдХреЗ рд╣реЛрдиреЗ рддрдХ рдпрд╣рд╛рдВ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЛ рдмрдВрдж рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ 1.28 рд░рд┐рд▓реАрдЬ рддрдХ рд╡рд┐рд▓рдВрдмрд┐рдд рдХрд░реЗрдВред

рдЗрд╕ рдкрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ @petrochenkov рджреНрд╡рд╛рд░рд╛ рдкрдВрдЬреАрдХреГрдд рдХрдИ рдореБрджреНрджреЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реНрдирд▓ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ рдФрд░ рдЬрд┐рд╕реЗ рдЕрднреА рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рд░рд╛рдд рдореЗрдВ рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдпрд╣рд╛рдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдареЛрд╕ рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗрдЯ рд╣реИ рдЬрд┐рд╕реЗ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдмрд╕реЗрдЯ рд╣реИ ред рдпрд╣рд╛рдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЧрд╛рдпрдм рд╣реЛрдиреЗ рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрднреА рднреА рд╕реНрдерд┐рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрд╛ рд╕рдВрдХрд▓рдХ рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛ред рдмрд▓реНрдХрд┐ рдмрд╛рдж рдХреА рддрд╛рд░реАрдЦ рдореЗрдВ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд╛рд╕ рдХреЗ рдмрд╛рдж рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЕрд╕реНрдерд┐рд░ рд░рд╣реЗрдЧреАред

рдореИрдХреНрд░реЛрдЬрд╝ рдФрд░ рдореЙрдбреНрдпреВрд▓ рд╕рд┐рд╕реНрдЯрдо

рдореБрдЦреНрдп рд░реВрдк рд╕реЗ https://github.com/rust-lang/rust/issues/35896 рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдЕрдм
рдЕрдкрдиреЗ FCP рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк use рдХрдердиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдореИрдХреНрд░реЛ рдЖрдпрд╛рдд рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЗрд╕ рддрд░рд╣:

use some_proc_macro_crate::bar;

#[bar]
fn baz() {}

рдпрд╛

use some_proc_macro_crate::bar;
bar!();

рдпрд╛ рдФрд░ рднреА

pub use some_proc_macro_crate::bar; // reexport an attribute or macro

рдпрд╣ рдЬрдВрдЧ рдореЗрдВ рдПрдХ рддреАрд╕рд░рд╛ рдирд╛рдорд╕реНрдерд╛рди рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ (рдорд╛рди/рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд
рдиреЗрдорд╕реНрдкреЗрд╕), рдореИрдХреНрд░реЛ рдиреЗрдорд╕реНрдкреЗрд╕ред рдЧреБрдг, macro_rules, рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ
рдореИрдХреНрд░реЛрдЬрд╝ рд╕рднреА рдорд╛рд░реЛ рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВред

рдкреВрд░реНрдг рд╡рд┐рдХрд╕рд┐рдд рдореЙрдбреНрдпреВрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ-рддрддреНрд╡ рдкрдереЛрдВ рдХреЛ рдЖрд╣реНрд╡рд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдПрдЧреАрдореИрдХреНрд░реЛрдЬрд╝ ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП #[foo::bar] рдпрд╛ ::bar::baz!() рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЬрд╛рдПрдЧреАред рдЗрд╕
рдкреНрд░рддрд┐рдмрдВрдз рдПрдХ рджрд┐рди рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд░реВрдврд╝рд┐рд╡рд╛рджреА рдорд╛рд░реНрдЧ рд╣реИ
рдХреЗ рд╕рд╛рде рд╢реБрд░реВред

рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╣рд╛рдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рдЧреБрдг рдХреЗрд╡рд▓ рдЧреИрд░-рдореЙрдбреНрдпреВрд▓ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВрдЖрдЗрдЯрдо ред
рдпрд╣рд╛рдВ "рдЖрдЗрдЯрдо" рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЖрдЗрдЯрдо, рдЗрдВрдкреНрд▓рд╛рдВрдЯ рдЖрдЗрдЯрдо рдФрд░ рд╡рд┐рджреЗрд╢реА рдореЙрдбреНрдпреВрд▓ рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ
рдЖрдЗрдЯрдоред рд╣рд╛рдЗрдЬреАрди рдФрд░ . рдХреЗ рдХрд╛рд░рдг рдореЙрдбреНрдпреВрд▓ рд╡рд┐рд╕реНрддрд╛рд░ рдЕрднреА рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рднрд╛рд╡ред рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ a . рдкрд░ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдмрд╛рдж рдХреА рддрд┐рдерд┐ред

рд╕реНрдЯреЗрдЯрдореЗрдВрдЯреНрд╕ рдФрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдПрдЯреНрд░реАрдмреНрдпреВрдЯ рдореИрдХреНрд░реЛрдЬрд╝ рдЕрднреА рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдпрд╣ рд╣реИ
рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕реНрддрд░ рдкрд░ рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг (рдЬреИрд╕реЗ
рдЖрдЗрдЯрдо рд╕реНрддрд░ рдХреЗ рд╡рд┐рдкрд░реАрдд)ред рдЗрд╕реЗ рдмрд╛рдж рдХреА рддрд╛рд░реАрдЦ рдореЗрдВ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдВрдд рдореЗрдВ, рд╡рд┐рд╢реЗрд╖рддрд╛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдЕрдВрджрд░ рддрд░реНрдХ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПрд╕реАрдорд╛рдВрдХрдХ ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП #[foo] , #[foo(bar)] , рдФрд░ #[foo { bar baz ... @ | ^ hello }]
рд╡реИрдз рдЖрд╣реНрд╡рд╛рди рд╣реИрдВред #[foo = "baz"] , #[foo bar] , рдпрд╛ . рдЬреИрд╕реЗ рдЖрдордВрддреНрд░рдг
#[foo ... = ( baz )] рд╢реБрд░реВ рдореЗрдВ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ?

рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди рдХреА рддрд░рд╣, рдЙрдиреНрд╣реЗрдВ proc-macro рдЯреЛрдХрд░рд╛-рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдХреНрд╕реЗ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

extern crate proc_macro;
use proc_macro::TokenStream;

/// Invoked as `foo!()`
///
/// When invoked as `foo!(a b ( c ))` then the `TokenStream`
/// here will be `a b ( c )`.
///
/// The invocation is replaced with the `TokenStream` returned
#[proc_macro]
pub fn foo(a: TokenStream) -> TokenStream {
    // ...
}

/// Invoked as `#[bar]`
///
/// The first argument, `attr`, is the token stream inside of the attribute
/// itself. The second argument, `item`, is the token stream corresponding to
/// the item the attribute is attached to.
///
/// An attribute of the form `#[bar ( a b [ c ] )]` will have the `attr`
/// argument look like `a b [ c ]`. Note the lack of delimiters passed to
/// `attr`! An API may later be added to learn what delimiter a macro was
/// invoked with.
///
/// The `item` here is a tokenified version of the original item.
///
/// The return value here will contain all non-expanded attributes as well for
/// this attribute to inspect. The return value replaces the original item.
#[proc_macro]
pub fn bar(attr: TokenStream, item: TokenStream) -> TokenStream {
    // ...
}

рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

рдКрдкрд░ рдпрд╣ рджреЗрдЦрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдХрд╕реНрдЯрдо рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдХреЗрд╡рд▓ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдЖрдЗрдЯрдо рд╕рдВрджрд░реНрдн, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рдирдП рдПрдПрд╕рдЯреА рдиреЛрдбреНрд╕ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЬреЛ рдЖрдЗрдЯрдо рд╣реИрдВред рдЗрд╕
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдирдП рдПрдПрд╕рдЯреА рдЖрдЗрдЯрдо рдмрдирд╛рдиреЗ рдХреА рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ
рдиреЛрдбреНрд╕ред

рдирдИ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд╡рд╣реА рд╕реНрд╡рдЪреНрдЫрддрд╛ рд╣реЛрдЧреА рдЬреЛ рдЖрдЬ macro_rules! рд╣реИред рд╡реЗ рд╣реЛрдВрдЧреЗ
рд╣рд╛рдЗрдЬреАрдирд┐рдХ рди рд╣реЛред рдПрдПрд╕рдЯреА рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдирдП рдЖрдЗрдЯрдо рдЙрд╕реА рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░реЗрдВрдЧреЗ рдЬреИрд╕реЗ
рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЕрдиреНрдп рдЖрдЗрдЯрдоред

proc_macro рдПрдкреАрдЖрдИред

рдпрд╣ рд╕рдм рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рддрд╣ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
proc_macro рдЯреЛрдХрд░рд╛:

pub struct TokenStream(_);

impl TokenStream {
    pub fn empty() -> TokenStream;
    pub fn is_empty(&self) -> bool;
}

impl Clone for TokenStream { ... }
impl Debug for TokenStream { ... }
impl Display for TokenStream { ... }
impl FromStr for TokenStream { ... }
impl From<TokenTree> for TokenStream { ... }
impl FromIterator<TokenTree> for TokenStream { ... }
impl FromIterator<TokenStream> for TokenStream { ... }
impl !Send for TokenStream { ... }
impl !Sync for TokenStream { ... }

impl IntoIterator for TokenStream {
    type Item = TokenTree;
    type Iter = token_stream::IntoIter;
}

pub mod token_stream {
    pub struct IntoIter(_);

    impl Iterator for IntoIter {
        type Item = ::TokenTree;
    }
}

pub enum TokenTree {
    Op(Op),
    Term(Term),
    Literal(Literal),
    Group(Group),
}

impl TokenTree {
    pub fn span(&self) -> Span;
    pub fn set_span(&mut self, span: Span);
}

impl Clone for TokenTree { ... }
impl Debug for TokenTree { ... }
impl Display for TokenTree { ... }
impl From<Op> for TokenTree { ... }
impl From<Term> for TokenTree { ... }
impl From<Literal> for TokenTree { ... }
impl From<Group> for TokenTree { ... }
impl !Send for TokenTree { ... }
impl !Sync for TokenTree { ... }

pub struct Span(_);

impl Span {
    pub fn call_site() -> Span;
}

impl Clone for Span { ... }
impl Copy for Span { ... }
impl Debug for Span { ... }
impl !Send for Span { ... }
impl !Sync for Span { ... }

pub struct Group(_);

pub enum Delimiter {
    Parenthesis,
    Brace,
    Bracket,
    None,
}

impl Group {
    pub fn new(delimiter: Delimiter, stream: TokenStream) -> Group;
    pub fn stream(&self) -> TokenStream;
    pub fn delimiter(&self) -> Delimiter;
    pub fn span(&self) -> Span;
    pub fn set_span(&mut self, span: Span);
}

impl Clone for Group { ... }
impl Debug for Group { ... }
impl Display for Group { ... }
impl !Send for Group { ... }
impl !Sync for Group { ... }

impl Copy for Delimiter { ... }
impl Clone for Delimiter { ... }
impl Debug for Delimiter { ... }
impl PartialEq for Delimiter { ... }
impl Eq for Delimeter { ... }

pub struct Term(_);

impl Term {
    pub fn new(s: &str, span: Span) -> Term;
    pub fn span(&self) -> Span;
    pub fn set_span(&mut self, span: Span);
}

impl Copy for Term { ... }
impl Clone for Term { ... }
impl Debug for Term { ... }
impl Display for Term { ... }
impl !Send for Term { ... }
impl !Sync for Term { ... }

pub struct Op(_);

pub enum Spacing {
   Alone,
   Joint,
}

impl Op {
    pub fn new(op: char, spacing: Spacing) -> Op;
    pub fn op(&self) -> char;
    pub fn spacing(&self) -> Spacing;
    pub fn span(&self) -> Span;
    pub fn set_span(&mut self, span: Span);
}

impl Debug for Op { ... }
impl Display for Op { ... }
impl Clone for Op { ... }
impl Copy for Op { ... }
impl !Send for Op { ... }
impl !Sync for Op { ... }

impl Copy for Spacing { ... }
impl Clone for Spacing { ... }
impl Debug for Spacing { ... }
impl PartialEq for Spacing { ... }
impl Eq for Spacing { ... }

pub struct Literal(_);

impl Literal {
  // panic on infinity and NaN
  pub fn f{32,64}_{un,}suffixed(f: f{32,64}) -> Literal;

  pub fn i{8,16,32,64,128,size}_{un,}suffixed(n: i{8,16,32,64,128,size}) -> Literal;
  pub fn u{8,16,32,64,128,size}_{un,}suffixed(n: u{8,16,32,64,128,size}) -> Literal;

  pub fn string(s: &str) -> Literal;
  pub fn character(c: char) -> Literal;
  pub fn byte_string(b: &[u8]) -> Literal;

  pub fn span(&self) -> Span;
  pub fn set_span(&mut self, span: Span) -> Span;
}

impl Clone for Literal { ... }
impl Debug for Literal { ... }
impl Display for Literal { ... }
impl !Send for Literal { ... }
impl !Sync for Literal { ... }

рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдСрдирд▓рд╛рдЗрди рдпрд╛ рдореВрд▓ рдореЗрдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ

рдкрд░реАрдХреНрд╖рдг рд░рдгрдиреАрддрд┐

рдореИрдХреНрд░реЛрдЬрд╝ 1.1 рдФрд░ рдореИрдХреНрд░реЛрдЬрд╝ 2.0 рд╕рд┐рд╕реНрдЯрдореНрд╕ рдХреЛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдбреЙрдЧрдлрд╝реВрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдХрд╛рдлреА рд╕рдордп рд╕реЗ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣ рдкреВрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рднреА рд╣реИ
рдХреЗ рд░реВрдк рдореЗрдВ proc-macro2 рдЯреЛрдХрд░рд╛ рдХреЗ 0.3 рд░рд┐рд▓реАрдЬ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛
рд╕рд╛рде рд╣реА syn рдЯреЛрдХрд░рд╛ ред рдкреВрд░реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдХрдИ рдмрдЧ рдкрд╛рдП рдЧрдП рд╣реИрдВ
рдкрд╣рдЪрд╛рдирд╛ рдФрд░ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдгрд╛рд▓реА рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдареЛрд╕ рдорд╣рд╕реВрд╕ рдХрд░рддреА рд╣реИ
рд╕реНрдерд┐рд░ред (рдпрд╣ рдирд╣реАрдВ рдХрд╣рдирд╛ рдХрд┐ рдпрд╣ рдмрдЧ-рдореБрдХреНрдд рд╣реИ!)

рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдп @alexcrichton рдиреЗ рдЗрд╕реЗ рдорд░реНрдЬ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ рд╣реИред рдЕрдЧрд▓рд╛ рдЪрд░рдг рдмрд╛рдХреА рдЯреИрдЧ рдХреА рдЧрдИ рдЯреАрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдореАрдХреНрд╖рд╛ рд╣реИ:

  • [x] @рдХрд┐рдореБрдВрдбреА
  • [ ] @SimonSapin
  • [рдПрдХреНрд╕] @ рдПрд▓реЗрдХреНрд╕рдХреНрд░рд┐рдЪрдЯрди
  • [x] @ рдПрдЯреНрдпреВрд░реЙрди
  • [рдПрдХреНрд╕] @ рдХреНрд░реИрдорд░реНрдЯрдЬ
  • [x] @dtolnay
  • [x] @eddyb
  • [x] @joshtriplett
  • [x] @nikomatsakis
  • [рдПрдХреНрд╕] @ рдПрдирдЖрд░рд╕реА
  • [ ] @pkfelix
  • [x] @scottmcm
  • [x] @sfackler
  • [x] @ рдирд╛рд╡реЛрдВ рдХреЗ рдмрд┐рдирд╛

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЛрдИ рдЪрд┐рдВрддрд╛ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рд╣реИред

рдПрдХ рдмрд╛рд░ рдЬрдм рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдореАрдХреНрд╖рдХреЛрдВ рдиреЗ рд╕реНрд╡реАрдХреГрддрд┐ рджреЗ рджреА (рдФрд░ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ), рддреЛ рдпрд╣ рдЕрдкрдиреА рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдЕрд╡рдзрд┐ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЛ рдХреЛрдИ рдмрдбрд╝рд╛ рдореБрджреНрджрд╛ рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрд┐рд╕реА рднреА рдмрд┐рдВрджреБ рдкрд░ рдирд╣реАрдВ рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдмреЛрд▓реЗрдВ!

рдЯреИрдЧ рдХреА рдЧрдИ рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдп рдореБрдЭреЗ рдХреНрдпрд╛ рдЖрджреЗрд╢ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП

cc @ rust-lang/compiler, рдЖрдк рд╕рднреА рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рднреА рдмрд╣реБрдд рд░реБрдЪрд┐ рд╣реИ рдФрд░ рдХреГрдкрдпрд╛ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдХреЛрдИ рдЕрд╡рд░реЛрдзрди рдЖрдкрддреНрддрд┐ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕реЗ рдЖрдкрдХреЗ рд▓рд┐рдП рднреА рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдкреНрд░реЛ рдореИрдХреНрд░реЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреЛрдХрди рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЗрдирдкреБрдЯ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рддрд╣реА рд╕реНрддрд░ рдкрд░ рднреА рдЯреЛрдХрди рдХреА рдПрдХ рдзрд╛рд░рд╛ рдХрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдирд┐рд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Literal Eq рдпрд╛ PartialEq рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреА рдХреЛрдИ рдЦрд╛рд╕ рд╡рдЬрд╣? (рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдореВрд▓реНрдп рдирд┐рдХрд╛рд▓рдиреЗ рдФрд░ рдЗрд╕реЗ рдХреЛрдб рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реНрдерд┐рд░ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред)

рдПрдХ рдкреНрд░реЛ рдореИрдХреНрд░реЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЕрдВрджрд░, TokenStream , рдПрдХ рдкреНрд░реЛ рдореИрдХреНрд░реЛ рдПрдХ рд╢рд╛рдмреНрджрд┐рдХ рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдпрд╛, рдЙрд╕ рдмрд╛рдд рдХреЗ рд▓рд┐рдП, рдПрдХ рдХрд╛ рдорд╛рди рдирд┐рдХрд╛рд▓реЗрдВ? рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рддрдХ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ? рдХреНрдпрд╛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ?

(рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ; рдореИрдВ рдмрд╕ рдЙрд╕ рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдФрд░ рдЙрд╕рдХреА рдЗрдЪреНрдЫрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред)

@alexcrichton рдирдИ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ
рд╣рд╛рдЗрдЬреАрдирд┐рдХ рди рд╣реЛред рдПрдПрд╕рдЯреА рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдирдП рдЖрдЗрдЯрдо рдЙрд╕реА рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░реЗрдВрдЧреЗ рдЬреИрд╕реЗ
рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЕрдиреНрдп рдЖрдЗрдЯрдоред

рдореИрдВ рд░рд╕реНрдЯ рдХреЛрд░ рдЯреАрдо рдореЗрдВ рдирд╣реАрдВ рд╣реВрдВ, рдФрд░ рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реА рд╕рднреА рдЪрд░реНрдЪрд╛рдУрдВ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рдмрд╣реБрдд рдмреБрд░рд╛ рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореИрдХреНрд░реЛ рд╕рд╣рд╛рдпрдХ рдЖрдЗрдЯрдо рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреЗрд╡рд▓ рдореИрдХреНрд░реЛ рджреНрд╡рд╛рд░рд╛ рд╣реА рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреВрд░реНрдг 100% рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЪрд░ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪреНрдЫрддрд╛ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдСрдкреНрдЯ-рдЖрдЙрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред

@joshtriplett рдЖрдк рд▓рд┐рдЯрд░рд▓ рдХреЗ рд▓рд┐рдП рдбрд┐рд╕реНрдкреНрд▓реЗ

@joshtriplett рд╣рд╛рдБ рдЬреИрд╕рд╛ рдХрд┐ @dtolnay рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЖрдк Display рдЬреЛ рдХрд┐ рдПрдХ рдЯреЛрдХрд░рд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рд▓рд┐рдЯрд░рд▓рдЯреЗрдХреНрд╕реНрдЯ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдо рддреМрд░ рдкрд░ рдПрдкреАрдЖрдИ рдХрд╛ рдЗрд░рд╛рджрд╛ "рдиреНрдпреВрдирддрдо" рд╣реЛрдирд╛ рд╣реИ, рди рдХрд┐ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдПрдкреАрдЖрдИ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдШрдВрдЯрд┐рдпрд╛рдВ рдФрд░ рд╕реАрдЯреА рд╣реИрдВред рд╡реЗ рд╢рд╛рдпрдж рдмрд╛рдж рдореЗрдВ рдЖрдПрдВрдЧреЗ!

рд╕реНрдерд┐рд░реАрдХрд░рдг рдХрд╛ рдпрд╣ рджреМрд░ рдЗрд╕ рдЕрд░реНрде рдореЗрдВ "рдЕрдзрд┐рдХрддрдо рдиреНрдпреВрдирддрдо" рд╣реЛрдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рднреА рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ (рдЙрд░реНрдл Display Literal рдФрд░ рдЗрд╕рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдХреБрдЫ рдирд╣реАрдВ )

@Pauan рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рдпрд╣ рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕реЗ macro_rules! рдЬреЛ рдЕрдм рд╡рд░реНрд╖реЛрдВ рд╕реЗ рд╕реНрдерд┐рд░ рд╣реИ рдФрд░ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рд╣рдо рдпрд╣рд╛рдВ рд╣рд╛рдЗрдЬреАрди рдФрд░ рдмреЗрд╣рддрд░ рдЗрд▓рд╛рдЬ рдХреЛ рд╕рдХреНрд╖рдо рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рд╣рдо рдЕрднреА рдкреВрд░реА рддрд░рд╣ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред Span::call_site() рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдпрд╣рд╛рдВ рд▓рд┐рдВрдЪрдкрд┐рди рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк "рдХреЛрдИ рд╕реНрд╡рдЪреНрдЫрддрд╛ рдирд╣реАрдВ" рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЕрдВрддрдд: рд╣рдо рдФрд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░реЗрдВрдЧреЗред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ "рдкреВрд░реНрдг 100% рд╕реНрд╡рдЪреНрдЫрддрд╛" рд╡рд░реНрд╖реЛрдВ рджреВрд░ рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЬрдВрдЧ 2018 рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реНрдерд┐рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ

@alexcrichton рддреЛ рдХреНрдпрд╛ рдЕрдм рдЗрд╕реЗ рдПрдХ рд╕реНрд╡рдЪреНрдЫрддрд╛ рдЫреЗрдж рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдХреБрдЫ рдпреБрдЧ/рдпреБрдЧ/рд╕рдВрд╕реНрдХрд░рдг рдмрд╛рдж рдореЗрдВ рдЙрд╕ рд╕реНрд╡рдЪреНрдЫрддрд╛ рдЫреЗрдж рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ?

рдЪреВрдВрдХрд┐ Span::call_site() рдореМрдЬреВрдж рд╣реИ, рддреЛ рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЕрднреА рдЗрд╕рдореЗрдВ рдкреВрд░реНрдг рд╕реНрд╡рдЪреНрдЫрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рдЬрдирд╢рдХреНрддрд┐/рд╕рдордп рдХреА рдХрдореА рд╣реИ, рдпрд╛ рдХреНрдпрд╛ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ/рдЕрд░реНрдердкреВрд░реНрдг рдЪрд┐рдВрддрд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрднреА рднреА рдЖрд░рдПрдлрд╕реА рдореЗрдВ рджреВрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

@Pauan рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ "рдЫреЗрдж" рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдЬ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИред macro_rules! рдФрд░ рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗ рд╕рд╛рде рдпрд╣ рдареАрдХ рд╡реИрд╕реА рд╣реА рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХрд╣рд╛рдиреА рд╣реИред рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдЙрд╕реА рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ, рдХреБрдЫ рдирдпрд╛ рдкреЗрд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдПрдХ "рдкреВрд░реНрдг рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХрд╣рд╛рдиреА" рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рд╣рдо рд╣рдореЗрд╢рд╛ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рд░реВрдк рдореЗрдВ рдСрдкреНрдЯ-рдЖрдЙрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд╣ рдСрдкреНрдЯ-рдЖрдЙрдЯ Span::call_site() (рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ) рд╣реИред рдХреЗрд╡рд▓ рдпрд╣ рд╕реНрдерд┐рд░ рдХрд░рдХреЗ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХреЗ рд▓рд┐рдП рдСрдкреНрдЯ-рдЖрдЙрдЯ рддрдВрддреНрд░ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЕрдВрддрддрдГ рд╣рдо рдЬрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рдЪреНрдЫ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░реЗрдВрдЧреЗред

рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рдмрд╣реБрдд рджреВрд░ рд╣реИред (AFAIK) рдЕрдирд╕реБрд▓рдЭреЗ рд╢реЛрдз рдкреНрд░рд╢реНрди рд╣реИрдВ, рдпрд╣ рдЬрдирд╢рдХреНрддрд┐ рдХрд╛ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рд╣реИред

@dtolnay рдЖрд╣, рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдБред рддреЛ, рдЖрдк рдЯреЗрдХреНрд╕реНрдЯ рдЬреЗрдирд░реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рджреЛрдмрд╛рд░рд╛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдлрд┐рд▓рд╣рд╛рд▓ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

cc @ rust-lang/compiler, рдЖрдк рд╕рднреА рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рднреА рдмрд╣реБрдд рд░реБрдЪрд┐ рд╣реИ рдФрд░ рдХреГрдкрдпрд╛ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдХреЛрдИ рдЕрд╡рд░реЛрдзрди рдЖрдкрддреНрддрд┐ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕реЗ рдЖрдкрдХреЗ рд▓рд┐рдП рднреА рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ

рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдФрд░ рдпреБрдЧрд▓ рдкреНрд░реЛ-рдореИрдХреНрд░реЛ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдПрдХ рдкреАрдЖрд░ рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИред

рдпрд╣ рдореИрдХреНрд░реЛ_рд░реВрд▓реНрд╕ рдХреЗ рд╕рд╛рде рдареАрдХ рд╡реИрд╕реА рд╣реА рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХреА рдХрд╣рд╛рдиреА рд╣реИ! рдФрд░ рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрдиред

рдЬрд╝рд░реВрд░, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рд▓рдХреНрд╖реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдмреЗрд╣рддрд░ рдореИрдХреНрд░реЛ рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдирд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореМрдЬреВрджрд╛ (рдЯреВрдЯреА рд╣реБрдИ рдФрд░ рд╕реАрдорд┐рдд) рдкреНрд░рдгрд╛рд▓реА рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реИред

рдПрдХ "рдкреВрд░реНрдг рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХрд╣рд╛рдиреА" рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рд╣рдо рд╣рдореЗрд╢рд╛ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рд░реВрдк рдореЗрдВ рдСрдкреНрдЯ-рдЖрдЙрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред

рдмрд┐рд▓реНрдХреБрд▓, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдХрд╣рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЪреВрдВрдХрд┐ рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП Span::call_site() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ (рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ macro_rules! рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ) рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрд╡рдЪреНрдЫ рдмрдирд╛рдХрд░ рдЖрдк рд╕реНрд╡рдЪреНрдЫрддрд╛ рдФрд░ рджреЛрдиреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЧреИрд░-рд╕реНрд╡рдЪреНрдЫрддрд╛ред рдЬрдмрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЧреИрд░-рд╕реНрд╡рдЪреНрдЫрддрд╛ рд╕реЗ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдХреЗрд╡рд▓ рдЧреИрд░-рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХреЗ рд╕рд╛рде рдлрдВрд╕ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдВрддрддрдГ рд╣рдо рдЬрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рдЪреНрдЫ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░реЗрдВрдЧреЗред

рдпрд╣ рдХрд╛рдлреА рдХрд╖реНрдЯрдкреНрд░рдж (рдФрд░ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛) рдмреИрдВрдб-рд╕рд╣рд╛рдпрддрд╛ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ: рдкреНрд░реЛрдХ рдореИрдХреНрд░реЛрдЬрд╝ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реНрдерд┐рддрд┐рдпреЛрдВ (рд▓реЗрдХрд┐рди рдЖрдЗрдЯрдо рдирд╣реАрдВ) рдореЗрдВ рд╣рд╛рдЗрдЬреАрдирд┐рдХ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдк рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪреНрдЫрддрд╛ рдореЗрдВ рдСрдкреНрдЯ-рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдореИрдВ рдпрд╣ рд╕рд╣реА рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдБ?

(AFAIK) рдЕрдирд╕реБрд▓рдЭреЗ рд╢реЛрдз рдкреНрд░рд╢реНрди рд╣реИрдВ, рдпрд╣ рдЬрдирд╢рдХреНрддрд┐ рдХрд╛ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рд╣реИред

рдареАрдХ рд╣реИ, рдпрд╣ рдХрд╛рдлреА рдЙрдЪрд┐рдд рд╣реИред рдореИрдВ рд╕рдореАрдЪреАрдирддрд╛ рдФрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХрддрд╛ рдХреА рдЗрдЪреНрдЫрд╛ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВред рдЬрдм рддрдХ рдпреЛрдЬрдирд╛ рдЕрдВрддрддрдГ рдПрдХ рдмрд╛рдж рдпреБрдЧ / рдпреБрдЧ / рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдареЛрд╕ рд╕реНрд╡рдЪреНрдЫрддрд╛ рд╣реИ рдХреЗ рд░реВрдк рдореЗрдВ, рддреЛ рдореИрдВ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЦрд╝рд░рд╛рдм рд╕реНрд╡рдЪреНрдЫрддрд╛ рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдБред рдореИрдВ рдмрд╕ рдпрд╣ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рд╣рдо рдХреБрдЫ рдРрд╕рд╛ рд╕реНрдерд┐рд░ рдХрд░реЗрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдкрдЫрддрд╛рдирд╛ рдкрдбрд╝реЗред

рдПрдХ рдорд╛рдпрдиреЗ рдореЗрдВ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА "рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрд╡рдЪреНрдЫ рд╣реИ," рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрднреА рддрдХ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред Span::call_site рдСрдкреНрдЯ рдЖрдЙрдЯ рд╣реИред :)

@Pauan @alexcrichton рдиреЗ рдЬреЛ рдХрд╣рд╛, рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП:

рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Span рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реНрд╡рдЪреНрдЫрддрд╛ рд╕рдВрдмрдВрдзреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИред (рджреЗрдЦреЗрдВ Term::new )

рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╣рдо Span s рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ Span::call_site рдкрд░реНрджрд╛рдлрд╛рд╢ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдХреЙрд▓рд░ рдХрд╛ рджрд╛рдпрд░рд╛ рд▓реЗрддрд╛ рд╣реИред

рдЗрд╕ рддрд░рд╣, рд╣рдо рдмрд╛рдж рдореЗрдВ рд╕реНрд╡рдЪреНрдЫрддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЦреБрд▓рд╛ рд░рдЦрддреЗ рд╣реБрдП рдкреВрд░реА рд╕реНрд╡рдЪреНрдЫрддрд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рддреБрд░рдВрдд рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЪрддреБрд░ рдЪрд╛рд▓ рд╣реИ!

@rpjohnst рддреЛ рдЖрдкрдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ Span::call_site ?

рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рд╣реА рд▓рдЧрддрд╛ рд╣реИ: рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрд╡рдЪреНрдЫ рдФрд░ рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рддрд░реАрдХреЗ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@lрдлреЗрдпрд░реА рдЖрд╣, рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рдирд╣реАрдВ рд╣реБрдЖ рдерд╛ рдХрд┐ Span::call_site рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд░реВрд░реА рдерд╛, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрд╕реНрдкрд╖реНрдЯ рджрд╛рдпрд░рд╛ рдерд╛ред рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЪрддреБрд░ рдЪрд╛рд▓ рд╣реИред

рдРрд╕реЗ рдореЗрдВ рдореБрдЭреЗ рдЕрдм рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИред

@рдПрд▓реЗрдХреНрд╕рдХреНрд░рд┐рдЪрдЯрди

рдЧреБрдг, macro_rules, рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ
рдореИрдХреНрд░реЛрдЬрд╝ рд╕рднреА рдорд╛рд░реЛ рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВред

рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдореИрдВрдиреЗ #[feature(proc_macro)] рд╕рд╛рде рдЬрд╛рдБрдЪ рдХреА, рдЗрд╕рдореЗрдВ рд╡реНрдпреБрддреНрдкрдиреНрди-рддреНрд░реБрдЯрд┐-рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреНрд░реЗрдЯ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рдХреЛрдб рдореЗрдВ рдПрдХ рдкрд┐рдЫрдбрд╝рд╛-рдЕрд╕рдВрдЧрдд рдкрд░рд┐рд╡рд░реНрддрди рдерд╛ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд

@ рдЕрд░реНрдирд╡рд┐рдпрди рдУрд╣ рдкреНрд░рд┐рдп, рдпрд╣ рдмреБрд░рд╛ рд▓рдЧрддрд╛ рд╣реИ! рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдмрдбрд╝рд╛ рдкрд┐рдЫрдбрд╝рд╛-рдЕрд╕рдВрдЧрдд рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реАрдХрд╛ рдирд┐рдХрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ред #[derive] рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рдмрд╛рдж рддрдХ "рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рд╣реИ" рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рдирд╛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛ред

рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ #48644 рдФрд░ #47786 рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВред рдХреНрдпрд╛ рдХреЛрдИ рдУрдкреА рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

@alexcrichton рдХреНрдпрд╛ Literal рдФрд░ рджреЛрд╕реНрддреЛрдВ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдкрд░ рдХреЛрдИ рдЪрд░реНрдЪрд╛ рд╣реБрдИ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдкреАрдЫреЗ рдХреА рд╕рдВрдЧрддрддрд╛ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдм рдФрд░ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Literal рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

    impl Literal {
        pub fn as_str(&self) -> Option<&str> {}
        pub fn to_int(&self) -> Option<i64> {}
        pub fn to_uint(&self) -> Option<u64> {}
        pub fn to_float(&self) -> Option<f64> {}
    }

рд╡рд┐рднрд┐рдиреНрди рд╢рд╛рдмреНрджрд┐рдХ рдЙрдкрдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ TryFrom impls рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@abonander рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рд╖реНрдХрд░реНрд╖ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рдкрд╣рд▓реЗ рдкрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдмрд╛рдж рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ Display рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде crates.io рдкрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рд╣реИ

:рдШрдВрдЯреА: рдЙрдкрд░реЛрдХреНрдд рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдЕрдм рдЕрдкрдиреА рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдЕрд╡рдзрд┐ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ ред рдШрдВрдЯреА:

@рдПрд▓реЗрдХреНрд╕рдХреНрд░рд┐рдЪрдЯрди
!Send рдФрд░ !Sync proc рдореИрдХреНрд░реЛ рдПрдкреАрдЖрдИ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИрдВред
рдХреБрдЫ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ (рдЬреИрд╕реЗ Op ) рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорд╛рдирд┐рдд рдЗрдореНрдкреНрд▓рд╛рдВрдЯ https://github.com/rust-lang/rust/issues/38356#issuecomment -383693017 рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реЗ рднрд┐рдиреНрди рд╣реИред
рдЗрдореНрдкреНрд▓рд╛рдВрдЯреНрд╕ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рд╢рд╛рдпрдж рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдЙрдлрд╝ рд╣рд╛рдБ рд╕рдЪ рдореЗрдВ! рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП https://github.com/rust-lang/rust/pull/50453 рдЦреЛрд▓рд╛ рд╣реИ

@alexcrichton рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Term::as_str рд╕рд╛рде рдПрдХ рдмреБрд░рд╛ рдореБрджреНрджрд╛ рд╣реИ: рдореИрдВ рдПрдХ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рд╕рдмреВрдд рдХреЛ рд╕реНрдХреЗрдЪ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╕рдЦреНрдд рджрд╛рдпрд░реЗ рдХреЗ рдХрд╛рд░рдг, &'a Term -> &'a str рдХреЛ рдХреБрдЫ рд╕реНрдХреЛрдкреНрдб рдЗрдВрдЯрд░реНрдирд░ рдореЗрдВ рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ 'a рдХрднреА рднреА рдЖрдВрддрд░рд┐рдХ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЬреЛ рдХреЗрд╡рд▓ рддрднреА рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рдЬрдм рдлрд╝рдВрдХреНрд╢рди рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рдпрд╛рдиреА рдЕрдЧрд░ рдЗрд╕реЗ рдЙрд╕ рджрд╛рдпрд░реЗ рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рджреМрд░рд╛рди рдЗрдВрдЯрд░реНрдирд░ рд▓рд╛рдЗрд╡ рд╣реЛрддрд╛ рд╣реИ)ред

AFAICT, Term::as_str рдзреНрд╡рдирд┐ рд╣реИ , рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ 'a рд╢рд░реНрддред

рдЬрд┐рд╕реЗ thread_local! рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐, рдЬрдмрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ Term рдореВрд▓реНрдп рд╕реЗ рдмрдЪрдиреЗ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рдмрд╣реБрдд рд╣реА рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ 'a s рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдпрджрд┐ Term::as_str рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рдЖрдВрддрд░рд┐рдХ рджрд╛рдпрд░реЗ рд╕реЗ рд╕рдЦреНрддреА рд╕реЗ рдЫреЛрдЯрд╛ рд╣реЛрддрд╛ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ proc_macro рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдХреНрдпреЛрдВрдХрд┐ Term рдереНрд░реЗрдб-рд▓реЛрдХрд▓ рд╣реИ, Term рдмрдЪрдиреЗ рдХреЗ рдмрд╣реБрдд рдХрдо рддрд░реАрдХреЗ рд╣реИрдВ Term , рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ thread_local! рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдПрдХрдорд╛рддреНрд░ рдерд╛ред

рд▓реЗрдХрд┐рди Box::leak рднреА рдореМрдЬреВрдж рд╣реИ! рдпрд╣ рдЕрднреА рднреА рдЕрд╕реНрдерд┐рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЬ, Box::leak(Box::new(term)).as_str() &'static str рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ Box::leak (cc @RalfJung) рджреНрд╡рд╛рд░рд╛ рддреЛрдбрд╝реЗ рдЧрдП рдЕрдиреНрдп рд╕рд╛рд░ рддрддреНрд╡ рд╣реИрдВ

OTOH, рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдЬрдЯрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ Term рд╕реНрдЯреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдХрд╛ рд╕реНрд╡рд╛рдореА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ Copy ред
рдЕрдЧрд░ рд╣рдо Copy рдХреЛ Term Copy рдкрд░ рд╣рдЯрд╛ рджреЗрдВ, рддреЛ рд╣рдо рд╡рд╣рд╛рдВ рдПрдХ рдЖрд▓рд╕реА Option<Cell<Rc<String>> рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

@eddyb oh Term::as_str рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рд╕реНрдерд┐рд░реАрдХрд░рдг рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЪрд┐рдВрддрд╛ рдХреА рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИ! рдпрд╣ рдмрд╕ рдЗрдзрд░-рдЙрдзрд░ рдЪрд┐рдкрдХрд╛ рд╣реБрдЖ рд╣реИ рдЗрд╕рд▓рд┐рдП рд╣рдо proc-macro2 рдирд╣реАрдВ рддреЛрдбрд╝рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдпрд╣ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рдиреЗ рдкрд░ рд╣рдо proc-macro2 рд▓рд┐рдП рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдЬрд╛рд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

@eddyb рдореИрдВ рдпрд╣рд╛рдБ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рд▓реЗрдХрд┐рди Box::leak рдореЗрд░реЗ рдФрдкрдЪрд╛рд░рд┐рдХ рдореЙрдбрд▓ рдореЗрдВ рдЙрдЪрд┐рдд рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реНрдореГрддрд┐ (рдпрд╛рдиреА, рдПрдХ рдмреЙрдХреНрд╕ рдореЗрдВ) рд╣реИ, рддреЛ рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдХреЛрдИ рдЬреАрд╡рдирдХрд╛рд▓ рд╣реИред

рдореЗрд░реЗ рдХреБрдЫ рдкреНрд░рд╢реНрди рд╣реИрдВ:

  1. рдХреНрдпрд╛ quote! рдХреЛ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ?
  2. рдХреНрдпрд╛ quote! рдореЗрдВ proc_macro_non_items рдлреАрдЪрд░ рдЧреЗрдЯ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛? рдХрдорд┐рдЯ 79630d4fdfc775b241cae0a209edec2687a29f0f рдХреЛ рдЕрдм рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди quote! рдЕрднреА рднреА #[unstable(feature = "proc_macro" ... рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИред
  3. рдХреНрдпрд╛ proc_macro_path_invoc , proc_macro_mod , proc_macro_expr , рдФрд░ proc_macro_non_items рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛рдПрдВ рджрд░реНрдЬ рдХреА рдЬрд╛рдПрдВрдЧреА?

рдЕрд╕рдВрдмрдВрдзрд┐рдд рдкрдХреНрд╖ рдкреНрд░рд╢реНрди: quote! рдХрд╣рд╛рдБ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?

@mjbshaw Sooo рдордЬрд╝рд╛ рдХрд╣рд╛рдиреА: рдпрд╣ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ proc_macro::quote ред
rustc_metadata рджрд┐рдЦрд╛рд╡рд╛ рдХрд┐рд╕реА рднреА рдЯреЛрдХрд░рд╛ рдирд╛рдорд┐рдд рдХрд┐ proc_macro рдирд╛рдо рдХреЗ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рд╢рд╛рдорд┐рд▓ quote рдЙрд╕ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рд╣реИ proc_macro rustc_metadata рдХреЗ рдЦрд┐рд▓рд╛рдл рд▓рд┐рдВрдХред

рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдФрд░ рдпреБрдЧрд▓ рдкреНрд░реЛ-рдореИрдХреНрд░реЛ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдПрдХ рдкреАрдЖрд░ рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИред

рдкреАрдЖрд░ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВ: https://github.com/rust-lang/rust/pull/50473

1.2 API рдХреЗ рд▓рд┐рдП рдлрд╝реАрдЪрд░ рдЕрдиреБрд░реЛрдз: рдХреЛрдг рдХреЛрд╖реНрдардХ ( < / > ) рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реАрдорд╛рдВрдХрдХ рдЬреЛрдбрд╝реЗрдВ рддрд╛рдХрд┐ <T> ( fn foo<T>() {} ) рдЬреИрд╕реА рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдЗрд╕ рд░реВрдк рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдПрдХ Group ред рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рд╕реЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╣реЛ рдЬрд╛рддреА рд╣реИ рдЬреИрд╕реЗ рдЬреЗрдирд░рд┐рдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ред

@mjbshaw рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЛрдХрди рд╕реНрддрд░ рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рджреЛ < > рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдореВрд╣реАрдХреГрдд рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореИрдХреНрд░реЛ рдЗрдирдкреБрдЯ рдореЗрдВ:

m!($A<$B, $C>=$D);

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджреЛ рдмреВрд▓рд┐рдпрди рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд╣реИрдВ $A < $B рдФрд░ $C >= $D , рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдо рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП type $A <$B,$C> = $D; рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ред

assert_both!(a<AMAX, b>=BMIN);

define_type_alias!(SwappedResult<E, T>=std::result::Result<T, E>);

рдореИрдВрдиреЗ рдУрдкреА рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрд╡рдЪреНрдЫрддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд╢реЛрд╕реНрдЯреЙрдкрд░ рдмрдЧ рдХреА рддрд░рд╣ рдореБрдЭреЗ рдХреНрдпрд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ:

рдЗрд╕ рдереНрд░реЗрдб рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдХреЛ рдореВрд▓ FCP рдЯрд┐рдкреНрдкрдгреА рд╕реЗ https://github.com/rust-lang/rust/pull/50473 рдореЗрдВ @petrochenkov рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдЕрдм рддрдХ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рд╣реИ:

  • Term::new рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ Term::ident рдФрд░ рдЗрдирдкреБрдЯ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ
  • Term::lifetime рдФрд░ рдЗрдирдкреБрдЯ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ
  • Term::raw_ident рдФрд░ рдЗрдирдкреБрдЯ рдорд╛рдиреНрдп рдХрд░реЗрдВ
  • Op рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ Punct
  • Punct::new рдкрд░ рдЗрдирдкреБрдЯ рдорд╛рдиреНрдп рдХрд░реЗрдВ
  • Op::op рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ Punct::as_char

рдПрдХ рдЫреЛрдЯрд╛ рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдз рдЬреЛ рдореИрдВ рдХрд░реВрдВрдЧрд╛ (рд╕рдВрднрд╡рддрдГ #50473 - @petrochenkov рдореЗрдВ) рдЯреЛрдХрди рдХреЛ рдЯреЛрдХрдирд╕реНрдЯреНрд░реАрдо рдкрд░ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИред рд╕рдВрднрд╡рддрдГ:

impl Extend<TokenTree> for TokenStream

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ quote::Tokens рдкреНрд░рдХрд╛рд░ (рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ Vec<TokenTree> ) рдХреЛ рдЦрддреНрдо рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдФрд░ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдкреНрд░рд╕рд╛рд░ рдХреЛ рдХрдо рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ "рдХреБрдЫ рдЯреЛрдХрди" - https рдореЗрдВ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛

@ dtolnay рдХреЗ рдЙрдкрд░реЛрдХреНрдд рд╕реБрдЭрд╛рд╡ рдкрд░ +1ред

рдЙрдкрд░реЛрдХреНрдд рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╡рд┐рд▓рдп рдХреЗ рд╕реНрд╡рднрд╛рд╡ рдХреЗ рд╕рд╛рде рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдЕрд╡рдзрд┐ рдЕрдм рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реИ ред

рдореЗрд░реЗ рджреЛ рдкреНрд░рд╢реНрди рд╣реИрдВ:

  1. рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдпрд╣рд╛рдВ рдкреВрдЫрд╛ рдЧрдпрд╛ quote! рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ? рдЕрдВрддрд┐рдо TokenStream рдмрдирд╛рдиреЗ рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреНрдпрд╛ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрд╛ рдХрд┐рд╕реА рдХреЛ quote рдЯреЛрдХрд░рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреНрдпрд╛ proc_macro::quote! рдХреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

  2. рдХреНрдпрд╛ рдореЗрд░реА рд╕рдордЭ рдореЗрдВ рдпрд╣ рд╕рд╣реА рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди-рдЬреИрд╕реЗ рдореИрдХреНрд░реЛ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛-рдЬреИрд╕реА рдореИрдХреНрд░реЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдХреЗрд╡рд▓ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ? рдЕрд░реНрдерд╛рдд:

    /// Invoked as `foo!()`
    #[proc_macro]
    pub fn foo(a: TokenStream) -> TokenStream {
        // ...
    }
    
    /// Invoked as `#[bar]`
    #[proc_macro]
    pub fn bar(attr: TokenStream, item: TokenStream) -> TokenStream {
        // ...
    }
    

    рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ TokenStream рд▓реЗрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рджреВрд╕рд░рд╛ рджреЛ рд▓реЗрддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдереЛрдбрд╝рд╛ рд╕реВрдХреНрд╖реНрдо рдирд╣реАрдВ рд╣реИ? рдЗрд╕рдХреЗ рдмрдЬрд╛рдп #[proc_macro_attribute] рдФрд░ #[proc_macro_function_like] рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВ? рдХреНрдпрд╛ рдЗрд╕ рдкрд░ рдХрд╣реАрдВ рдЪрд░реНрдЪрд╛ рд╣реБрдИ рд╣реИ? рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдЕрдЧрд░ рдХреЛрдИ рдЪрд░реНрдЪрд╛ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХреЗред

рдЗрд╕ рдкрд░ рдЖрдкрдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! :)

@LukasKalbertodt рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╡рд░реНрддрдорд╛рди рдореЗрдВ #[proc_macro_attribute] рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХреА рдЧрдИ рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХрд╛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЗрд░рд╛рджрд╛ рд╣реИ рдпрд╛ рдЕрдЧрд░ рдпрд╣ рдПрдХ рдЯрд╛рдЗрдкреЛ рд╣реИ рддреЛ FCP рдкреНрд░рд╕реНрддрд╛рд╡ред

рд╕рдорд╕реНрдпрд╛: рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд┐рдП рдЧрдП рдЯреЛрдХрди рдХреЛ Span::call_site рд╕реНрдкреИрди рдирд╣реАрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ: https://github.com/rust-lang/rust/issues/50050#issuecomment -390520317ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдХреЙрд▓-рд╕рд╛рдЗрдЯ рд╕реНрдкреИрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛ рдмреИрдХрдЯреНрд░реЗрд╕, рдХреНрд▓рд┐рдкреА рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрд╡рдЪреНрдЫрддрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Span::call_site рд░рд┐рдЯрд░реНрди рдХреЛ рднреА рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред

@LukasKalbertodt proc_macro рдЯреЛрдХрд░рд╛ рдореЗрдВ quote! рдореИрдХреНрд░реЛ рдХреЛ рдЗрд╕ FCP рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди Crates.io рдкрд░ quote рдЯреЛрдХрд░рд╛ рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдкреАрдЖрдИ рдкрд░ рдмрдирд╛рддрд╛ рд╣реИред рд╕рд╛рде рд╣реА @abonander рдиреЗ рдмрддрд╛рдпрд╛ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ #[proc_macro_attribute] рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ #[proc_macro] рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ foo!() -рд╕реНрдЯрд╛рдЗрд▓ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╣реИ

рдХреНрдпрд╛ #[proc_macro_attribute] рдХрд╛ рдирд╛рдо #[proc_attribute_macro] рдпрд╛ #[attribute_proc_macro] ?

@Zoxc рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА #[proc_macro_derive] рд╕реНрдерд┐рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдкрд╛рд▓рди рди рдХрд░рдирд╛ рдЕрдЬреАрдм рд╣реЛрдЧрд╛ред

рдХреНрдпрд╛ рд╣рдо PartialEq<char> рдФрд░ PartialEq<Punct> рд▓рд┐рдП Punct ( Ident рдХреЗ PartialEq рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдорд╛рди) рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдХрд╛рдлреА рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдкреАрдЖрд░ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛ рд░рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдирд╛ рд╣реЛред

@mjbshaw рдХреНрдпрд╛ PartialEq<Punct> рднреА рд╕реНрдкреИрди рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдЧрд╛? PartialEq<char> рдареАрдХ рд▓рдЧрддрд╛ рд╣реИ, рдУрдЯреАрдУрдПрдЪред

@eddyb PartialEq Ident рд▓рд┐рдП рд╕реНрдкреИрди рдХреА рддреБрд▓рдирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ proc-macro2 рд╕реНрд░реЛрдд рд╣реИ рди рдХрд┐ proc-macro рд╕реНрд░реЛрдд)ред рдореИрдВ рдЗрд╕ рдмрд╛рдд рдХреЛ рд▓реЗрдХрд░ рджреБрд╡рд┐рдзрд╛ рдореЗрдВ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рд╕реНрдкреИрди рдХреЛ рддреБрд▓рдирд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Punct рдФрд░ Ident рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВред Punct рднреА рдЕрдкрдирд╛ Spacing , рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреБрд▓рдирд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╢рд╛рдпрдж рдЕрдиреНрдп рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╕реЛрдЪрддреЗ рд╣реИрдВ)ред

рдореИрдВ рдЕрднреА рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ PartialEq<char> рдХреЛ Punct рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдареАрдХ рд╣реВрдВред PartialEq<Punct> рдХреЛ рдмрд╛рдж рдореЗрдВ рд╣реИрд╢ рдЖрдЙрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@mjbshaw proc-macro2 рдХреНрд░реЗрдЯ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреА рд╕реНрд╡рддрдВрддреНрд░рддрд╛ proc_macro рдЕрдкрд╕реНрдЯреНрд░реАрдо рд╣реИ рдФрд░ рд╣рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЯреНрд╡реАрдХреНрд╕ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреБрдЫ рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ crates.io рдкрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рддреЛ рд╣рдо рдЗрд╕реЗ proc_macro рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкреАрдЫреЗ рдХреА рдУрд░ рд╣реИ- proc_macro рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧрдд рд╣реИ рдЗрд╕рд▓рд┐рдП рд╣рдо рдирдВрдЧреЗ рдиреНрдпреВрдирддрдо рд╕реЗ рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдПрдХ рдмрд╛рд░ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдкрд░ рд╣рдо рд╡рд╣рд╛рдВ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдЧрдиреЛрдо-рдХреНрд▓рд╛рд╕ proc_macro2/syn/quote рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рдЯреВрдЯ рдЧрдпрд╛, рд╕рд╛рде рд╣реА proc рдореИрдХреНрд░реЛ рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлреАрдЪрд░ рдЧреЗрдЯред рдпрд╣ рдЕрдм рддрдп рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд╕реМрднрд╛рдЧреНрдп рд╕реЗред

рдЗрд╕ рдЫреЛрдЯреЗ рд╕реЗ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ рд╢реАрд░реНрд╖ рдкрд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдХрд┐рди рдЪреАрдЬреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП?

@federicomenaquintero рдпрджрд┐ рдЖрдк рдЕрд╕реНрдерд┐рд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдирд┐рдпрдорд┐рдд рд╕реАрдЖрдИ рдиреМрдХрд░реА (рджреИрдирд┐рдХ, рд╕рд╛рдкреНрддрд╛рд╣рд┐рдХ, рдЬреЛ рднреА рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ) рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдирд╡реАрдирддрдо рдирд╛рдЗрдЯрд▓реА рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рдЖрдкрдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред (рдЯреНрд░реИрд╡рд┐рд╕-рд╕реАрдЖрдИ рдЕрдкрдиреА рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ "рдХреНрд░реЙрди рдЬреЙрдм" рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред)

@SimonSapin рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рд╣рдо рдЙрди рдХреНрд░реЗрдЯреЛрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдЕрдкрдиреЗ Cargo.toml рдореЗрдВ рдкрд┐рди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реЛ рдФрд░ рдХрд╛рд░реНрдЧреЛ рдХреЛ рдирд╡реАрдирддрдо рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рджреЗрдВред рдХреНрдпрд╛ рдпрд╣ рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИ?

@federicomenaquintero рдпрд╣ рддреЗрдЬреА рд╕реЗ рдСрдл-рдЯреЙрдкрд┐рдХ рд╣реИ рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдХрд╣реАрдВ рдФрд░ рдХрд░реЗрдВ рдЬреИрд╕реЗ рдХрд┐ IRC рдпрд╛ http://users.rust-lang.org/ рдкрд░ , рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рдлрд╛рд░рд┐рд╢ рдпрд╣ рд╣реИ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рдЬреИрд╕рд╛ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд) рдХреЛ рдЕрдкрдиреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде Cargo.lock рд╢рд┐рдк рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдкрд┐рди рдХрд░рддрд╛ рд╣реИред Cargo.toml , foo = "1.2.3" рдЬреИрд╕реА рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд░реНрде рд╣реИ "рд╡рд╣ рд╕рдВрд╕реНрдХрд░рдг рдпрд╛ рдмрд╛рдж рдореЗрдВ, рдпрджрд┐ SemVer рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдВрдЧрдд рд╣реИ"ред

рддреЛ, рдореИрдВрдиреЗ рдЕрднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдПрдХ рдХреНрд░реЗрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдирд┐рдореНрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

#[my_attribute]
struct MyStruct {
  #[other_attribute]
  field: String,
}

рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ proc_macro рдФрд░ custom_attributes рджреЛрдиреЛрдВ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░реЛ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рд╕реНрдерд┐рд░реАрдХрд░рдг рдлреАрдЪрд░ рдлрд╝реНрд▓реИрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛?

рджреВрд╕рд░реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ #[my_attribute] рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ #[other_attribute] рдХреЛ рдХрднреА рднреА рдЪрд▓рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ "рдмрд╛рд╣рд░реА" рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░, рдореИрдВ рдЖрдВрддрд░рд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ #[derive(Foo)] рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рдбрдореА рд╕рддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

рдХреНрдпрд╛ рдЗрд╕ рдШрдмрд░рд╛рд╣рдЯ рдХреЛ рдПрдХ рдбрдореА "рд╕рддреНрд░" рдмрдирд╛рдиреЗ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡/рд╡рд╛рдВрдЫрдиреАрдп рд╣реЛрдЧрд╛? рдпрд╛ рд╢рд╛рдпрдж рдПрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ (рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рдкрде рдХреЗ рд╕рд╛рде) рдЬреЛрдбрд╝реЗрдВ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбрдореА рд╕рддреНрд░ рдХрд░рдирд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред proc-macro рдмрдХреНрд╕реЗ рдХреЗ рд▓рд┐рдП рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдЕрд╕рдВрднрд╡ рд╣реИ рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдмрд╣реБрдд рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рди рдХреЗрд╡рд▓ TokenStream::from_str , рдмрд▓реНрдХрд┐ рдПрдХ рд╕рддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рдХрд╛рд░реНрдп рднреА рд╣реИрдВред

@рдПрд▓реЗрдХреНрд╕рдХреНрд░рд┐рдЪрдЯрди

рдореИрдВрдиреЗ рдореИрдХреНрд░реЛрдЬрд╝ 1.2 рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдмрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЯреНрд░рд╛рдЗрдПрдЬ рдХрд╛рд░реНрдп рдХрд┐рдпрд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдмрдЧ рдХреЛ "рдЧрдВрднреАрд░ рдмрдЧ" рдпрд╛ "рд╕рднреА рдЕрд╡рдзрд┐ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдмрдЧ" рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ https://github.com/rust-lang/rust/issues/50504 рдХреЛ "рдЧрдВрднреАрд░" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рд╡рд░реНрдгрд┐рдд рдореЙрдбреНрдпреВрд▓ рд╕рдорд╕реНрдпрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЧрд╣рд░реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд▓рдХреНрд╖рдг рд╣реИ - рдкреНрд░реЛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░ рдЖрдИрдбреА рдирд╣реАрдВ рдареАрдХ рд╕реЗ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХреЗ рдФрд░ рдХреНрдпрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдкреАрдЖрд░ рд╣реИ (https://github.com/rust-lang/rust/pull/51952), рд▓реЗрдХрд┐рди рдлрд┐рдХреНрд╕ рд╕реЗ рдкреНрд░рддрд┐рдЧрдорди рд╣реИрдВ рдФрд░ рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдЙрдирдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИред

рдореИрдВрдиреЗ https://github.com/rust-lang/rust/pull/52081 рдкрд░ рдЕрдзрд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ

@petrochenkov рдореБрдЭреЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ, рдореИрдВ PR . рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░реВрдВрдЧрд╛

рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА рдореИрдХреНрд░реЛ рдиреЗрдорд┐рдВрдЧ рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЗ рдкрд░ proc_macro_derive рдЪрд╛рдЗрд▓реНрдб рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдореБрджреНрджреЛрдВ рдФрд░ рд╡реЗ рдирд╛рдордХрд░рдг рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИред рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ proc_macro_derive рдЪрд╛рдЗрд▓реНрдб рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯреНрд╕ рд╕реНрдХреЛрдкрд┐рдВрдЧ рдФрд░ рдирд╛рдордХрд░рдг рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕рдореЗрдВ рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд▓рдЧрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рдкрде рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ #[derive(foo::Parent)] рдореЗрдВ рдПрдХ рдЪрд╛рдЗрд▓реНрдб рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ #[foo::Child] , рд▓реЗрдХрд┐рди рд╡реНрдпреБрддреНрдкрддреНрддрд┐ рдореИрдХреНрд░реЛ рдХрд╛ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЗрд╕рдХреЗ рдЪреЗрд╣рд░реЗ рдкрд░, рдкрд╣рдЪрд╛рдиреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЪрд╛рдЗрд▓реНрдб рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕рдХрд╛ рдЕрдкрдирд╛ рдмрдЪреНрдЪрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд╛рдо рд▓реБрдХрдЕрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдЖрд╕рд╛рди рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдЕрдиреНрдпреЛрдиреНрдпрд╛рд╢реНрд░рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рд░рдбрд╛рд░ рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП; рдРрд╕рд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ proc_macro_attribute рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрд╛рддрдЪреАрдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреА рд╣реИрдВ рдЬреЛ рд╕рдорд╛рди рд▓реБрдХрдЕрдк рдореБрджреНрджреЛрдВ рдореЗрдВ рдЪрд▓рддреА рд╣реИрдВред

рдореИрдВрдиреЗ рдЖрдЬ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЯреВрдЯрд╛ рд╣реБрдЖ рд╣реИ рдЬреЛ рд╢рд╛рдпрдж рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рд╕рднреА рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ рд╕рдВрджреЗрд╢ рдерд╛: "(рд╕рдорд╕реНрдпрд╛ # 38356 рджреЗрдЦреЗрдВ)"ред рдЗрд╕ рддрд░рд╣ рдореИрдВ рдпрд╣рд╛рдВ рдкрд╣реБрдВрдЪрд╛ред
рдореИрдВ рдпрд╣рд╛рдВ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдорд┐рд▓реЗ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ рдЕрдкрдирд╛ Cargo.toml рднреА рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реВрдВред

рдореБрдЭреЗ рдпрд╣ рдмрд╣реБрдд рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░рд╕реНрдЯ рдирд╛рдЗрдЯрд▓реА рд╕рдВрд╕реНрдХрд░рдг (рд░рд╕реНрдЯрд╕реА 1.29.0-рдирд╛рдЗрдЯрд▓реА (9bd8458c9 2018-07-09)) рдкрд░ рдкрд┐рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпрд╛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ? рд╕рдВрднрд╡рддрдГ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЧрдпрд╛?

Cargo.toml

[[bin]]
name = "main"
path = "src/bin/main.rs"

[dependencies]
log = "0.4"
pretty_env_logger = "0.2"

rand = "0.4"
ring = "=0.13.0-alpha"
untrusted = "0.6"

bytes = "0.4"
futures = "0.1"
tokio-io = "0.1"
tokio-core = "0.1"
futures-await = "0.1"

capnp = "0.8"
rusqlite = "0.13"

async_mutex = { git = "https://github.com/realcr/async_mutex", rev = "a1d973ed7" }

num-bigint = "0.2.0"
num-traits = "0.2.4"

[dev-dependencies]

[dependencies.byteorder]
version = "1.1"
features = ["i128"]

[build-dependencies]
capnpc = "0.8"

[profile.release]
debug = true

рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпрд╛рдВ

$ cargo test
    Updating git repository `https://github.com/realcr/async_mutex`
   Compiling proc-macro2 v0.4.8                                                                                                                                                                                    
   Compiling cswitch v0.1.0 (file:///home/real/projects/d/cswitch)                                                                                                                                                 
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)8: proc-macro2                                                                                                                        
  --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:33:40
   |
33 |     let works = panic::catch_unwind(|| proc_macro::Span::call_site()).is_ok();
   |                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:213:13
    |
213 |     Nightly(proc_macro::token_stream::IntoIter),
    |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:438:11
    |
438 | impl From<proc_macro::Span> for ::Span {
    |           ^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:284:13
    |
284 |     Nightly(proc_macro::SourceFile, FileName),
    |             ^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:332:13
    |
332 |     Nightly(proc_macro::Span),
    |             ^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:461:13
    |
461 |     Nightly(proc_macro::Ident),
    |             ^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:523:13
    |
523 |     Nightly(proc_macro::Literal),
    |             ^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:116:47
    |
116 |                     Delimiter::Parenthesis => proc_macro::Delimiter::Parenthesis,
    |                                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:117:43
    |
117 |                     Delimiter::Bracket => proc_macro::Delimiter::Bracket,
    |                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:118:41
    |
118 |                     Delimiter::Brace => proc_macro::Delimiter::Brace,
    |                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:119:40
    |
119 |                     Delimiter::None => proc_macro::Delimiter::None,
    |                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:122:33
    |
122 |                 let mut group = proc_macro::Group::new(delim, tt.stream.inner.unwrap_nightly());
    |                                 ^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:128:39
    |
128 |                     Spacing::Joint => proc_macro::Spacing::Joint,
    |                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:129:39
    |
129 |                     Spacing::Alone => proc_macro::Spacing::Alone,
    |                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:131:30
    |
131 |                 let mut op = proc_macro::Punct::new(tt.as_char(), spacing);
    |                              ^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:113:17
    |
113 |         let tt: proc_macro::TokenTree = match token {
    |                 ^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:238:13
    |
238 |             proc_macro::TokenTree::Group(tt) => {
    |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:240:21
    |
240 |                     proc_macro::Delimiter::Parenthesis => Delimiter::Parenthesis,
    |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:241:21
    |
241 |                     proc_macro::Delimiter::Bracket => Delimiter::Bracket,
    |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:242:21
    |
242 |                     proc_macro::Delimiter::Brace => Delimiter::Brace,
    |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:243:21
    |
243 |                     proc_macro::Delimiter::None => Delimiter::None,
    |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:250:13
    |
250 |             proc_macro::TokenTree::Punct(tt) => {
    |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:252:21
    |
252 |                     proc_macro::Spacing::Joint => Spacing::Joint,
    |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:253:21
    |
253 |                     proc_macro::Spacing::Alone => Spacing::Alone,
    |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:259:13
    |
259 |             proc_macro::TokenTree::Ident(s) => ::Ident::_new(Ident::Nightly(s)).into(),
    |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:260:13
    |
260 |             proc_macro::TokenTree::Literal(l) => ::Literal::_new(Literal::Nightly(l)).into(),
    |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:289:20
    |
289 |     fn nightly(sf: proc_macro::SourceFile) -> Self {
    |                    ^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:339:27
    |
339 |             Span::Nightly(proc_macro::Span::call_site())
    |                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:347:27
    |
347 |             Span::Nightly(proc_macro::Span::def_site())
    |                           ^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:369:30
    |
369 |     pub fn unstable(self) -> proc_macro::Span {
    |                              ^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:430:32
    |
430 |     fn unwrap_nightly(self) -> proc_macro::Span {
    |                                ^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:439:24
    |
439 |     fn from(proc_span: proc_macro::Span) -> ::Span {
    |                        ^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:468:48
    |
468 |             Span::Nightly(s) => Ident::Nightly(proc_macro::Ident::new(string, s)),
    |                                                ^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:475:48
    |
475 |             Span::Nightly(s) => Ident::Nightly(proc_macro::Ident::new_raw(string, s)),
    |                                                ^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:495:32
    |
495 |     fn unwrap_nightly(self) -> proc_macro::Ident {
    |                                ^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:583:30
    |
583 |             Literal::Nightly(proc_macro::Literal::f32_unsuffixed(f))
    |                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:591:30
    |
591 |             Literal::Nightly(proc_macro::Literal::f64_unsuffixed(f))
    |                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:599:30
    |
599 |             Literal::Nightly(proc_macro::Literal::string(t))
    |                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:607:30
    |
607 |             Literal::Nightly(proc_macro::Literal::character(t))
    |                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:615:30
    |
615 |             Literal::Nightly(proc_macro::Literal::byte_string(bytes))
    |                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:636:32
    |
636 |     fn unwrap_nightly(self) -> proc_macro::Literal {
    |                                ^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/lib.rs:322:30
    |
322 |     pub fn unstable(self) -> proc_macro::Span {
    |                              ^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:531:34
    |
531 |                   Literal::Nightly(proc_macro::Literal::$name(n))
    |                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^
...
552 | /     suffixed_numbers! {
553 | |         u8_suffixed => u8,
554 | |         u16_suffixed => u16,
555 | |         u32_suffixed => u32,
...   |
565 | |         f64_suffixed => f64,
566 | |     }
    | |_____- in this macro invocation
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:543:34
    |
543 |                   Literal::Nightly(proc_macro::Literal::$name(n))
    |                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^
...
568 | /     unsuffixed_integers! {
569 | |         u8_unsuffixed => u8,
570 | |         u16_unsuffixed => u16,
571 | |         u32_unsuffixed => u32,
...   |
578 | |         isize_unsuffixed => isize,
579 | |     }
    | |_____- in this macro invocation
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
  --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:45:34
   |
45 |             TokenStream::Nightly(proc_macro::TokenStream::new())
   |                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
  --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:53:46
   |
53 |             TokenStream::Nightly(tts) => tts.is_empty(),
   |                                              ^^^^^^^^
   |
   = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:123:23
    |
123 |                 group.set_span(span.inner.unwrap_nightly());
    |                       ^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:132:20
    |
132 |                 op.set_span(tt.span().inner.unwrap_nightly());
    |                    ^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:239:38
    |
239 |                 let delim = match tt.delimiter() {
    |                                      ^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:245:74
    |
245 |                 let stream = ::TokenStream::_new(TokenStream::Nightly(tt.stream()));
    |                                                                          ^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:247:58
    |
247 |                 g.set_span(::Span::_new(Span::Nightly(tt.span())));
    |                                                          ^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:251:40
    |
251 |                 let spacing = match tt.spacing() {
    |                                        ^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:255:43
    |
255 |                 let mut o = Punct::new(tt.as_char(), spacing);
    |                                           ^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:256:58
    |
256 |                 o.set_span(::Span::_new(Span::Nightly(tt.span())));
    |                                                          ^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:290:45
    |
290 |         let filename = stable::file_name(sf.path().to_string());
    |                                             ^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:304:44
    |
304 |             SourceFile::Nightly(a, _) => a.is_real(),
    |                                            ^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:355:69
    |
355 |             (Span::Nightly(a), Span::Nightly(b)) => Span::Nightly(a.resolved_at(b)),
    |                                                                     ^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:363:69
    |
363 |             (Span::Nightly(a), Span::Nightly(b)) => Span::Nightly(a.located_at(b)),
    |                                                                     ^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:424:55
    |
424 |             (Span::Nightly(a), Span::Nightly(b)) => a.eq(b),
    |                                                       ^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:482:50
    |
482 |             Ident::Nightly(t) => Span::Nightly(t.span()),
    |                                                  ^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:489:56
    |
489 |             (Ident::Nightly(t), Span::Nightly(s)) => t.set_span(s),
    |                                                        ^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:623:56
    |
623 |             Literal::Nightly(lit) => Span::Nightly(lit.span()),
    |                                                        ^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:630:62
    |
630 |             (Literal::Nightly(lit), Span::Nightly(s)) => lit.set_span(s),
    |                                                              ^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error: aborting due to 63 previous errors

For more information about this error, try `rustc --explain E0658`.
error: Could not compile `proc-macro2`. 

рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЕрдВрджрд╛рдЬрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рдерд╛ рдФрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдзрдиреНрдпрд╡рд╛рдж!

@realcr proc-macro2 рдЯреЛрдХрд░рд╛ рдХреЗ рд▓рд┐рдП рдЖрдк рдмрд╕ cargo update рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдЪрд╛рд▓ рдЪрд▓рдиреА рдЪрд╛рд╣рд┐рдП!

@alexcrichton рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣рд╛рдБ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @realcr рдкрд╣рд▓реЗ рд╣реА proc-macro2 рдЕрдкрдбреЗрдЯ рдХрд░ рдЪреБрдХрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╣рд░ рдЬрдЧрд╣ proc-macro2-0.4.8 рдХрд╣рддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд░рд╛рдд рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдПрдХ рдХреЗ рд▓рд┐рдП рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ # 52081 рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдЖрдЬ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рдереА рдФрд░ рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреНрдпреЛрдВ proc-macro2 рдХреЗрд╡рд▓ рдорд╛рдореВрд▓реА рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЯрдХреНрдХрд░ рджреАред рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рдмрд╣реБрдд рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ proc-macro2 рд╕рдВрдЧрддрддрд╛ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред

@realcr рдЕрдкрдиреЗ рд░рд╛рддреНрд░рд┐рдХрд╛рд▓реАрди рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдпрд╛ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ proc-macro-2 рд╕рдВрд╕реНрдХрд░рдг < 0.4.8 рдХрд░реЗрдВред

@alexcrichton , @LukasKalbertodt : рддреНрд╡рд░рд┐рдд рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА рдЕрдкрдиреЗ рд░рд╛рддреНрд░рд┐рдХрд╛рд▓реАрди рд╕рдВрдХрд▓рдХ рдХреЛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕рдиреЗ рдкреНрд░реЛ-рдореИрдХреНрд░реЛ -2 рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЦрддреНрдо рдХрд░ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдмрд╣реБрдд рд╕рд╛рд░реА рдирдИ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓реАрдВред рдЙрджрд╛рд╣рд░рдг:

error[E0277]: the trait bound `impl futures::Future: std::future::Future` is not satisfied
   --> src/networker/messenger/handler/handle_neighbor.rs:191:25
    |
191 |         let signature = await!(self.security_module_client.request_signature(failure_signature_buffer))
    |                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::future::Future` is not implemented for `impl futures::Future`
    |
    = note: required by `std::future::poll_in_task_cx`
    = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)

...

error[E0627]: yield statement outside of generator literal
   --> src/networker/messenger/handler/handle_neighbor.rs:403:13
    |
403 | /             await!(self.reply_with_failure(remote_public_key.clone(), 
404 | |                                            channel_index,
405 | |                                            request_send_msg.clone()))?
    | |_____________________________________________________________________^
    |
    = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)

рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, rustc рдХрд╛ рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг:

rustc 1.29.0-nightly (1ecf6929d 2018-07-16)

рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕реНрд░реЛрдд рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ Futures_await рд╕реЗ рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди рдЗрд╕рдиреЗ рднреА рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ред рдореИрдВ рд╡рд╣рд╛рдВ рдПрдХ рдореБрджреНрджрд╛ рджрд░реНрдЬ рдХрд░реВрдВрдЧрд╛ рддрд╛рдХрд┐ рд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░ рд╕рдХреЗрдВред

@LukasKalbertodt https://github.com/alexcrichton/proc-macro2#unstable -features

рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЕрд╕реНрдерд┐рд░ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

@realcr рдЖрдкрдХреА рдирдИ рд╕рдВрдХрд▓рди рд╕рдорд╕реНрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рдХреГрдкрдпрд╛ рд╡рд┐рд╖рдп рдкрд░ рдмрдиреЗ рд░рд╣реЗрдВред

@TeXitoi : рдЕрдЧрд░ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИ рддреЛ рдХреБрдЫ рднреА рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдпрд╛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред рдореИрдВ рдЖрдкрдХреА рдорджрдж рдХрд░рдиреЗ рдХреА рдкреВрд░реА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдЬрд╛рдирдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рд╡рд┐рд╖рдп рдкрд░ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВред рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ "(рд╕рдорд╕реНрдпрд╛ # 38356 рджреЗрдЦреЗрдВ)" рдореБрдЭреЗ рдпрд╣рд╛рдВ рд▓рд╛рдпрд╛ рд╣реИред

рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА рд╣реИред рдореЗрд░рд╛ рдХреЛрдб

#![no_std]
#![feature(proc_macro)]
#![feature(proc_macro_gen)]
#![feature(custom_attribute)]
#![feature(alloc)]

#[macro_use(eth_abi)]
extern crate pwasm_abi_derive;

рдФрд░ рддреНрд░реБрдЯрд┐ рдЬреЛ рдХрд╣рддреА рд╣реИ рдХрд┐ рдореИрдВрдиреЗ #![feature(proc_macro)] рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХрд┐рдпрд╛!

error[E0658]: attribute procedural macros are experimental (see issue #38356)
  --> src\lib.rs:67:5
   |
8  | #[macro_use(eth_abi)]
   |             ------- procedural macro imported here
...
67 |     #[eth_abi(TokenEndpoint, TokenClient)]
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = help: add #![feature(proc_macro)] to the crate attributes to enable

@Pzixel рдЖрдк #![feature(proc_macro)] рд╕реЗ #![feature(use_extern_macros)] рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдФрд░ рдпрд╣ рдЪрд╛рд▓ рдЪрд▓рдиреА рдЪрд╛рд╣рд┐рдП

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА (рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрджреНрдпрддрд┐рдд рд░рд╛рддреНрд░рд┐ рд╕рдВрдХрд▓рдХ рд╣реИ)

@alexcrichton рд╣рд╛рдБ, рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕реЗ рд╕рдордЭ рд▓рд┐рдпрд╛ рд╣реИ, рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЕрднреА рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

error[E0433]: failed to resolve. Use of undeclared type or module `Vec`
  --> src\lib.rs:66:5
   |
66 |     #[eth_abi(TokenEndpoint, TokenClient)]
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use of undeclared type or module `Vec`

error[E0412]: cannot find type `Vec` in this scope
  --> src\lib.rs:66:5
   |
66 |     #[eth_abi(TokenEndpoint, TokenClient)]
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope

рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЖрдпрд╛рдд рдирд┐рдпрдо рднреА рдмрджрд▓ рдЧрдП рд╣реИрдВ? рдпрд╛ рдореИрдВ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭ рд╕рдХрддрд╛ рдХрд┐ рдЙрд╕рдиреЗ рдпрд╣рд╛рдВ рд╢рд┐рдХрд╛рдпрдд рдХреНрдпреЛрдВ рд╢реБрд░реВ рдХреАред

@Pzixel рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдпрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдПрдХ рдмрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд░реНрдкрд┐рдд рдореБрджреНрджрд╛ рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рджрд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдкрд╣рд▓реЗ рдЕрдкрдирд╛ рдХреЛрдб рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП :) рдЕрднреА рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдк рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдХреБрдЫ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред рдмреАрдЖрд░рдмреА рдЬрдм рдХрд┐рдпрд╛ред рдЕрдЧрд░ рдпрд╣ рдЧрд╛рдпрдм рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рддреЛ рдореИрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реВрдВред

@рдПрд▓реЗрдХреНрд╕рдХреНрд░рд┐рдЪрдЯрди
рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЯреЛрдХрди рдкрд░ "рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ" рдХреНрдпрд╛ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ?
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрдо рд╕реЗ рдХрдо $crate рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрдирдкреБрдЯ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ cfg рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рд╕рд╛рде рд╣реА рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд╛рдЙрдВрдбрдЯреНрд░рд┐рдкреНрд╕ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреЛрд╖рд░рд╣рд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдареАрдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ)ред

рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдирдП рд╕реНрдерд┐рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд╕рд╛рде рди рд╣реЛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЗрдирдкреБрдЯ рдЯреЛрдХрди рдареАрдХ рд╕реЗ рдорд┐рд▓реЗрдВ (рдореЙрдбреНрдпреВрд▓реЛ рдмрдЧ)ред

@alexcrichton рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, cargo expand рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЗрд╕ рдЯреЛрдХрд░реЗ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдкреБрд╖реНрдЯрд┐ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдореЗрд░реА рддрд░рдл рд╣реИ рдпрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд░ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЦреБрдж рдХреЛ рджреЛрд╖ рджреЗрдирд╛ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдЗрд╕ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

@petrochenkov proc-macros рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдЖрдЬ рддрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдирд╛рдо рд╕рдВрдХрд▓реНрдк рдЯреБрдХрдбрд╝реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдЪрд┐рдВрддрд┐рдд рд╣реВрдВред рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕реЗ рдЕрд╡рдЧрдд рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рдЖрджреЗрд╢ рд╣реИ рдЬрд╣рд╛рдВ рдЕрдВрддрд┐рдо рд░рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рд╕реАрдПрдлрдЬреАрдПрд╕ рдкрд╣рд▓реЗ рдЪрд▓рддрд╛ рд╣реИ, рдФрд░ рдЕрдиреНрдпрдерд╛ рдпрд╣ рдЕрдзрд┐рдХрддрд░ рдкреБрдирд░рд╛рд╡реГрддреНрдд рд╣реЛрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдСрдбрд┐рдЯ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ!

рд╢рд╛рдпрдж рдореБрдЭреЗ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдпрд╛рдж рдЖрдпрд╛ред рд▓реЗрдХрд┐рди, рдХреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ proc_macro-defining рдХреНрд░реЗрдЯ рд╕реЗ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ, рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЖрджрд┐ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ? (рдпрд╛ proc_macro рдХреНрд░реЗрдЯ рд╕реЗ рдЬреНрдЮрд╛рдд рдХреЛрдИ рдЕрдиреНрдп рдЯреЛрдХрд░рд╛, FWIW)

рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реИрдВ , рд▓реЗрдХрд┐рди AFAIU рд╡реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдпрджрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЯреЛрдХрд░рд╛ рдХрд╛ рдирд╛рдо рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

@Ekleog proc-macro рдХреНрд░реЗрдЯ рдЖрдорддреМрд░ рдкрд░ рдХреЗрд╡рд▓ рдЙрди рдХреНрд░реЗрдЯреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╡реЗ рд░рдирдЯрд╛рдЗрдо рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реИрдВред рдЖрдк рд╕рдВрдкреВрд░реНрдг рдкреНрд░реЛ-рдореИрдХреНрд░реЛ рдХреНрд░реЗрдЯ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдВрдкрд╛рдЗрд▓рд░ рдкреНрд▓рдЧрдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рди рдХрд┐ "рд╕рд╛рдорд╛рдиреНрдп" рд▓рд╛рдЗрдмреНрд░реЗрд░реАред

рдХреНрд░реЙрд╕-рдХрдВрдкрд╛рдЗрд▓рд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ: рдЬреИрд╕реЗ рдмрд┐рд▓реНрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдкреНрд░реЛ-рдореИрдХреНрд░реЛрдЬрд╝ рд╣реЛрд╕реНрдЯ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рд▓рдХреНрд╖реНрдп рдПрдХ рдирд╣реАрдВред

@SimonSapin рдореИрдВ рд╕реМрдВрдкрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╣ рдкреНрд░реЛ-рдореИрдХреНрд░реЛ рдХреНрд░реЗрдЯ рди рд╣реЛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдКрдкрд░ рдореЗрд░реЗ рд▓рд┐рдВрдХ рдореЗрдВ, X-derive рдЯреЛрдХрд░рд╛ X рдЯреЛрдХрд░рд╛ рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ)ред рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдпрдерд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдкреНрд░реЛ-рдореИрдХреНрд░реЛрдЬрд╝ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╕рднреА рдХреЛрдб рдХреЛ рдпрд╛ рддреЛ рд╕реНрд╡рдпрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдХреЙрд▓ рд╕рд╛рдЗрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ред

рдлрд┐рд░, рдореИрдВ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд░рд╕реНрдЯрдХ рдЕрднреА рддрдХ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЧреИрд░-рдкреНрд░реЛ-рдореИрдХреНрд░реЛ рдХреНрд░реЗрдЯ рд╕реЗ рдкреНрд░реЛ-рдореИрдХреНрд░реЛ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЬреЛ рдХрд┐ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрд╣реАрдВ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ- рдЯрд░реНрдо рд░реЛрдбрдореИрдк)ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ, рдЕрдЧрд░ рдХреЗрд╡рд▓ TokenStreams рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрддрдорд╛рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдмрд╛рдж рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд┐рдХрд╛рд▓рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛? рдХреНрдпрд╛ рдЗрд╕реЗ PathToBeResolvedFromTopOfGeneratingProcMacroCrate рдЯреЛрдХрди рдкреНрд░рдХрд╛рд░ рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА? (рдЬреЛ рдмрд╛рдж рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рдиреЗ рдкрд░ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛, afaiu)

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдВрддрддрдГ рдЪреАрдЬреЛрдВ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдлреА рджреВрд░ рд▓рдЧрддрд╛ рд╣реИред

рдЗрд╕ рдмреАрдЪ, рдпрджрд┐ рдЖрдк рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЗрдЦрдХ рд╣реИрдВ, рддреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд▓рд┐рдП foo-proc-macros рдпрд╛ foo-derive рдЯреЛрдХрд░рд╛ рдФрд░ рд░рди-рдЯрд╛рдЗрдо рд╡рд╛рд▓реА "рд╕рд╛рдорд╛рдиреНрдп" foo рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд░рдЦрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдХреЛрдб рд▓реЗрдХрд┐рди рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдпреВрдЬрд░-рдлреЗрд╕рд┐рдВрдЧ рдПрдкреАрдЖрдИ рдХреЛ рд╕рд┐рдВрдЧрд▓ рдХреНрд░реЗрдЯ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ serde рдХрд░рддрд╛ рд╣реИ (рдХреБрдЫ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ) https://github.com/serde-rs/serde/blob/v1.0.71/serde/src/lib.rs#L304

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдЕрднреА рднреА рд░реВрдЯ рдХреНрд░реЗрдЯ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдореБрджреНрджреЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рд░реНрдбреЗ рдХреА рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ )ред

@ CAD97 , рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗред рджреЗрдЦреЗрдВ https://github.com/rust-lang/rust/commit/65f3007fa8a08daf77f2b8382a56eb80cb277131 рдФрд░ https://internals.rust-lang.org/t/help-stabilize-a-subset-of-macros-2-0/7252

@Ekleog , TokenStream TokenTree s рдХреА рдПрдХ рдзрд╛рд░рд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ TokenTree рдиреЗ Span рд╕рдВрдмрджреНрдз рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рд╕реНрдХреЛрдкрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ "рдХреЙрд▓ рд╕рд╛рдЗрдЯ" (рдпрд╛ рдЦрд╛рд▓реА) рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╡рдзрд┐ рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯреЛрдХрд░рд╛ рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░рддреЗ рд╣реБрдП Span рдмрдирд╛рдиреЗ рдХреЗ рдПрдХ рдЙрдЪрд┐рдд рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рддрд░реАрдХреЗ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдореИрдВрдиреЗ рдЬреЛ рдХрд╛рд░рдг рдкреВрдЫрд╛ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЪреЗрдХрдмреЙрдХреНрд╕ рдкрд░ рдЯрд┐рдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдЗрд╕реЗ рддрдм рдЯрд┐рдХ рдХрд░ рджреЗрдВ!

#![feature(proc_macro)] рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде, рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдХреНрдпрд╛ рдмрдЪрд╛ рд╣реИ?

@ jan-hudec рдУрд╣, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ Span s рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдереЗ, рдХреНрдпреЛрдВрдХрд┐ рд╢реБрд░реБрдЖрддреА рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ Hygiene (рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдирд╛рдорд┐рдд) рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕рдиреЗ рдпрд╣ рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рдИ рдереАред рдореИрдВрдиреЗ рдорд╛рди рд▓рд┐рдпрд╛ рдерд╛ рдХрд┐ рдпреЗ рдЧрд╛рдпрдм рд╣реЛ рдЧрдП рдереЗ, рдФрд░ рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рдЧрд▓рдд рдереЗред рдзрдиреНрдпрд╡рд╛рдж! :)

#![feature(proc_macro)] рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде, рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдХреНрдпрд╛ рдмрдЪрд╛ рд╣реИ?

рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рд╕рднреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╢реЗрд╖ рдореБрджреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рдирдП рдореБрджреНрджреЛрдВ рдХреЛ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рди рдХрд┐ рд╕реНрдерд┐рд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдФрд░ рдлрд┐рд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ https://github.com/rust-lang/rust/issues/ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛) 44660)ред

рдУрд╣, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рд╕реНрдкреИрди рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдереЗ, рдХреНрдпреЛрдВрдХрд┐ рд╢реБрд░реБрдЖрддреА рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ рдПрдХ рд╕реНрд╡рдЪреНрдЫрддрд╛ (рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдирд╛рдорд┐рдд) рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕рдиреЗ рдпрд╣ рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рдИ рдереАред рдореИрдВрдиреЗ рдорд╛рди рд▓рд┐рдпрд╛ рдерд╛ рдХрд┐ рдпреЗ рдЧрд╛рдпрдм рд╣реЛ рдЧрдП рдереЗ, рдФрд░ рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рдЧрд▓рдд рдереЗред рдзрдиреНрдпрд╡рд╛рдж! :)

IIUC, рд╕реНрдкреИрди рд╕реНрд╡рдЪреНрдЫрддрд╛ рд╕рдВрджрд░реНрдн рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХ рддрд░реАрдХрд╛ рд╣реИред

@ рдорд╛рд░реНрдХ-рдЖрдИрдПрдо рддрд░рд╣ рдХрд╛ред рдЗрдирдореЗрдВ рд╕реЛрд░реНрд╕ рдХреЛрдб рд▓реЛрдХреЗрд╢рди рдЗрдВрдлреЙрд░реНрдореЗрд╢рди (рдпреВрдЬрд░-рдлреЗрд╕рд┐рдВрдЧ рдореИрд╕реЗрдЬ/рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП) рдФрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ (рдпрд╛рдиреА рд╣рд╛рдЗрдЬреАрди рдЗрдВрдлреЙрд░реНрдореЗрд╢рди) рджреЛрдиреЛрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдорд┐рд▓рдиреЗ рд╡рд╛рд▓реА рдЪрд░реНрдЪрд╛/рдпрд╛рддрд╛рдпрд╛рдд рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдХреНрдпрд╛ proc_macro_diagnostic рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЗ рдкрд░ рд▓реЗ рдЬрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рд╣реИ? рдореИрдВ рдпрд╣ рднреА рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЙрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЕрд╡рд░реЛрдзрдХ рдХреНрдпрд╛ рд╣реИрдВ, рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдбреАрдЬрд▓ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЕрдм рддрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд░рд╣рд╛ рд╣реИред рд╕реНрдерд┐рд░ рдкрд░ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рд╕рдореБрджрд╛рдп рдлрдВрдХреА рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдмрдирд╛ рд░рд╣рд╛ рд╣реИ, рдЬреИрд╕реЗ syn рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг compile_error! рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рд╕реНрдерд╛рди рдкрд░ред

@sgrif рдореИрдВрдиреЗ рдРрд╕рд╛ рдХреЛрдИ рдореБрджреНрджрд╛ рдЦреЛрд▓рд╛ рд╣реИ: https://github.com/rust-lang/rust/issues/54140ред

рддреЛ рдореИрдВ рд╕реНрдкреИрди рдФрд░ рд▓рд╛рдЗрди рдХреЙрд▓рдо рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдореЗрдВ рд░реВрдЪрд┐ рд░рдЦрддрд╛ рд╣реВрдВред рдореИрдВ рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЦреБрд▓реЗ рдореБрджреНрджреЛрдВ рдХреЛ рджреЗрдЦреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдИ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рджрд┐рд╢рд╛ рдореЗрдВ рд╕рдВрдХрд▓рдХ рдХреЛ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ: +1:

proc_macro_gen рдлреАрдЪрд░ рдЧреЗрдЯ рдиреЗ рдореБрдЭреЗ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛, рд▓реЗрдХрд┐рди рд╢реАрд░реНрд╖ рдкрд░ рдЪреЗрдХ рд╕реВрдЪреА рдореЗрдВ рдореБрдЭреЗ рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ (proc_) рдореИрдХреНрд░реЛ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдиреНрдп рдореИрдХреНрд░реЛ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рд╣рд┐рд╕рд╛рдм рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (рд░рд╕реНрдЯрд╕реА рдХреЗ рдлреАрдЪрд░ рдЧреЗрдЯ рдХреЗ рдЕрд▓рд╛рд╡рд╛)?

@jjpe рдпрд╣ рд╢рд╛рдпрдж рдЗрд╕ рд╕рдордп рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЙрди рдлреАрдЪрд░ рдЧреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЛрдВ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдВ, рдпрд╣ рдореБрджреНрджрд╛ рдХрд╛рдлреА рд╣рдж рддрдХ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд▓рд╣рд░ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдерд╛

@alexcrichton рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реВрдВ, рдпрд╣ рдЕрдзрд┐рдХ рд╣реИ рдХрд┐ proc_macro_gen рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдЗрд╕рдиреЗ рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рдЙрддрдирд╛ рд╣реА рдЕрдЪреНрдЫрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд┐рддрдирд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдХреЛрдИ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдХрдо рд╕реЗ рдХрдоред

@xieyuheng CodeString / Code рднреА рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛ рдпрд╛рдиреА рдЗрд╕рдХрд╛ рд╢рдмреНрджрд╛рд░реНрде рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ TokenStream рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рдмрдЬрд╛рдп рдЯреЛрдХрди рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕реНрд░реЛрдд рдХреЛрдб рд╢рдмреНрджрд╢рдГ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред

TokenStream ( TokenTree ) рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд API 1.29 рдореЗрдВ рд╕реНрдерд┐рд░ рд╣реИред рдлрдВрдХреНрд╢рди-рдЬреИрд╕реЗ рдкреНрд░реЛ рдореИрдХреНрд░реЛ рдЖрдпрд╛рдд рдХрд░рдирд╛ 1.30 рдмрдЬреЗ рд╕реНрдерд┐рд░ рд░рд╣реЗрдЧрд╛ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ rustc 1.30.0-nightly (63d51e89a 2018-09-28) рдмрд╛рдж рд╕реЗ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЕрдВрджрд░ рдХреЛрдб рдХреЛ рдкрд╛рд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк mod module; рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ TokenStream рдЬрд┐рд╕рдореЗрдВ mod module; , WYSIWYG рд╣реЛрддрд╛ рд╣реИред

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕реНрдб рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕реНрдкреИрди, рд╣рд╛рдЗрдЬреАрди рдФрд░ рдПрдХрд░реВрдкрддрд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдХреНрдпрд╛ рдЕрд▓рдЧ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдпрд╛ рд╣реЛрдЧрд╛? рдЗрд╕рдХреА рдХрдореА рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рдореЙрдбреНрдпреВрд▓ рд╕рдВрдЧрдарди рдХреА рддреБрдЪреНрдЫ рд░реАрдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдореИрдХреНрд░реЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдХрд╛рд░рдг рдмрдирддреА рд╣реИред

рдареАрдХ рд╣реИ, рдпрд╣ рдореБрджреНрджрд╛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИ рдФрд░ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЦреБрд▓рд╛ рд░рдЦрдирд╛ рдФрд░ рдПрдкреАрдЖрдИ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ https://github.com/rust-lang/rust/pull/54728 рдЦреЛрд▓рд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдХрдИ рдФрд░ рдЕрдзрд┐рдХ рдмрд╛рд░реАрдХ рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ:

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдореИрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ рд╣реВрдВ рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ! рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рдФрд░ рдлреЙрд▓реЛ-рдЕрдк рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реВрдВ

@alexcrichton рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреИрд╕реЗ рдореИрдХреНрд░реЛ рдХреЗ рд▓рд┐рдП рдЙрдк-рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
https://github.com/rust-lang/rust/issues/38356#issuecomment -397095541
рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдореБрджреНрджрд╛ рд╣реИ?

@XX
рдРрд╕реА рдЙрдк-рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рднрд╛рд╖рд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ?
derive рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╕реНрдЯрдо рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдкрдВрдЬреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реНрдпреБрддреНрдкрдиреНрди рдореИрдХреНрд░реЛ рдЕрдкрдиреЗ рдЗрдирдкреБрдЯ рд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЗрдирдкреБрдЯ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИ)ред
рд╡рд┐рд╢реЗрд╖рддрд╛ рдореИрдХреНрд░реЛрдЬрд╝ рдЕрдкрдиреЗ рдЗрдирдкреБрдЯ рд╕реЗ #[other_attribute] s рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдХрднреА рднреА рдирд╛рдо рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ рдФрд░ рдХрднреА рднреА "рдЕрдирд╕реБрд▓рдЭреЗ рд╡рд┐рд╢реЗрд╖рддрд╛" рддреНрд░реБрдЯрд┐ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

(рдЙрд╕ рдХреНрд▓рд╛рд╕рд┐рдХ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдЕрд▓рд╛рд╡рд╛ https://github.com/rust-lang/rust/issues/38356#issuecomment-397095541 рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЕрд╕реНрдерд┐рд░ рдХрд╕реНрдЯрдо рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдЕрдм рдкреНрд░реЛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИрдВред)

@petrochenkov рд╣рд╛рдБ, рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

dwrensha picture dwrensha  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

defuz picture defuz  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mcarton picture mcarton  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

modsec picture modsec  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

overvenus picture overvenus  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ