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 ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΡΠ²ΠΎΠ»ΡŽΡ†ΠΈΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠΉ макросистСмы Rust (Ρ‚Π°ΠΊΠΆΠ΅ извСстной ΠΊΠ°ΠΊ синтаксис
Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Ρ‚Π°ΠΊΠΆΠ΅ извСстныС ΠΊΠ°ΠΊ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ компилятора). Π­Ρ‚ΠΎΡ‚ RFC опрСдСляСт синтаксис для опрСдСлСния
ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов, ΠΎΠ±Ρ‰Π΅Π΅ прСдставлСниС ΠΎΠ± ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² компиляторС,
ΠΈ описываСт, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ с процСссом компиляции.

На самом высоком ΡƒΡ€ΠΎΠ²Π½Π΅ макросы ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΏΡƒΡ‚Π΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡ΠΊΠΎΠΌ
Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ #[macro] . ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ со списком Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², прСдоставлСнным
компилятор ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ список Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ макрос. ΠœΡ‹
ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ срСдства Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с этими Ρ‚ΠΎΠΊΠ΅Π½Π°ΠΌΠΈ. Π’Ρ‹ΡΡˆΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ
срСдства (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² Π² AST) Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… ящиков.

ДороТная ΠΊΠ°Ρ€Ρ‚Π°: https://github.com/rust-lang/rust/issues/38356#issuecomment -274377210.


Задания

  • [x] Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ #[proc_macro_attribute] (PR # 38842).

    • [x] Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ β„– 39347 (PR β„– 39572).

    • [x] Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ β„– 39336 (PR β„– 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] (PR # 39060).
  • [x] Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° для использования Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² (PR # 39118).
  • [x] ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚Π΅ TokenStream ΠΏΡ€ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ΅ ΠΊ Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅ΠΌΡƒ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Ρƒ (PR # 39173).
  • [x] Π£Π΄Π°Π»ΠΈΡ‚Π΅ TokenTree::Sequence (PR # 39419).
  • [x] Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ TokenStream s вмСсто Vec<TokenTree> Π² Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ tokenstream::TokenTree Delimited (PR # 40202).
  • [x] Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Path s ΠΈ TokenStream s Π² ast::Attribute s (PR # 40346).

    • [x] ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡƒΡ‚Π΅ΠΉ Π² макросах Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² / ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, #[foo::bar] , #[derive(foo::Bar)] ).

  • [x] Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π³ΠΈΠ³ΠΈΠ΅Π½ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π²ΠΎ всС ΠΆΠ΅Ρ‚ΠΎΠ½Ρ‹, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ (PR # 40597).
  • [x] Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ API для proc_macro::TokenStream ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² RFC (PR # 40939).

    • [x] Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ исходный ΠΊΠΎΠ΄ TokenStream s для ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² AST Π² Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ Token::Interpolated .

    • [x] Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ TokenStream quoter proc_macro::quote! Π·Π° Π²ΠΎΡ€ΠΎΡ‚Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ proc_macro .

  • [x] ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π°Π²Ρ‚ΠΎΡ€Π°ΠΌ proc_macro Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ элСмСнты Π² Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ящикС foo Π½Π΅ трСбуя ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ макроса Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ extern crate foo; Π² ΠΊΠΎΡ€Π΅Π½ΡŒ ящика (PR # 40939).

    • [] Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ эргономики.

  • [] Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ источник TokenStream s для элСмСнтов Π² AST.
  • [] ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ (proc-) (issue # 34079).
  • [x] Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ макросу proc ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ частноС ΠΏΠΎΠ»Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ def_site (ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° # 47311). (PR # 48082)
  • [x] НСсоотвСтствиС ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠ»Π΅ΠΌ доступа структуры Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобках ΠΈ структурой ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° Π² макросС proc (ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° # 47312). (PR # 48083)
  • [] Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ std доступным для ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ макроса ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π½Π° этапС 1 (ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° # 47314).
  • [x] Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½Π° β€‹β€‹ΠΎΡˆΠΈΠ±ΠΊΠ° ΠΈΠ·-Π·Π° нСдопустимого синтаксиса Π²Π½ΡƒΡ‚Ρ€ΠΈ proc_macro::quote! (issue # 47315).
  • [] НСсоотвСтствиС ΠΌΠ΅ΠΆΠ΄Ρƒ Display ΠΈ IntoIterator для TokenStream, содСрТащСго ΠΌΠΎΠ΄ΡƒΠ»ΡŒ (ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° β„– 47627).
  • [x] # [cfg_attr] ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ нСсовпадСнию .to_string () ΠΈ TokenStream (ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° β„– 48644).
  • [x] Бписок ΠΆΠ΅Π»Π°Π½ΠΈΠΉ для libproc_macro (ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ список Π² # 47786).
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

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π₯ΠΎΡ€ΠΎΡˆΠΎ, эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΎΠ³Ρ€ΠΎΠΌΠ½Π° ΠΈ дошла Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ я Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ слишком ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ API. Π‘ этой Ρ†Π΅Π»ΡŒΡŽ я ΠΎΡ‚ΠΊΡ€Ρ‹Π» https://github.com/rust-lang/rust/pull/54728, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π½Π° ряд Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ отслСТивания:

На этом этапС я ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ это, Π½ΠΎ Ссли я Π·Π°Π±Ρ‹Π» ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с отслСТиваниСм, Π΄Π°ΠΉΡ‚Π΅ ΠΌΠ½Π΅ Π·Π½Π°Ρ‚ΡŒ! Π―, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠΎΠ³Ρƒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π΅Ρ‰Π΅ нСсколько ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ВсС 184 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

cc @nrc @jseyfried

Π― Π±Ρ‹ Ρ…ΠΎΡ‚Π΅Π», Ρ‡Ρ‚ΠΎΠ±Ρ‹ #[proc_macro_attribute] Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² блиТайшСС врСмя. Π£ мСня ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ ΠΈ тСстовоС использованиС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ я использовал, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ понял, Ρ‡Ρ‚ΠΎ компилятор Π΅Ρ‰Π΅ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚: unamused::

ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ: 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 edit: пСрСмСстил ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ список Π² OP)

cc @nrc @petrochenkov @durka @Ralith

@jseyfried Π― столкнулся с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΠΈΠ·-Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ, Ссли ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ макрос ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости, ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΡƒΡŽΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ макросы нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². МоТСм Π»ΠΈ ΠΌΡ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ эту Ρ€Π°Π±ΠΎΡ‚Ρƒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈ Ρ‚ΠΎ ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹Ρ‚ΡŒ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ области ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ?

@abonander ВсС макросы (bang, attribute ΠΈ derive) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ пространство ΠΈΠΌΠ΅Π½, поэтому ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… макроса с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ области. Однако ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ это сообщСниС ΠΎΠ± ошибкС - Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ?

Извини, Ρ‡Ρ‚ΠΎ ΠΎΠΏΠΎΠ·Π΄Π°Π» Π½Π° Π²Π΅Ρ‡Π΅Ρ€ΠΈΠ½ΠΊΡƒ. Π― Π΄ΠΎΠ²ΠΎΠ»Π΅Π½ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ раскрытия Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², Π° Π½Π΅ AST, Π½ΠΎ Ρƒ мСня Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ опасСния ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ TokenStream API, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π² RFC :

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,
}

НСясно, Π±Ρ‹Π» Π»ΠΈ этот API Π·Π°Π΄ΡƒΠΌΠ°Π½ ΠΊΠ°ΠΊ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΠ»Π°Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» принят ΠΏΡ€ΠΈ объСдинСнии RFC, ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ ΠΏΠΎΠ·ΠΆΠ΅.

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, это Π΄Π°Π»Π΅ΠΊΠΎ ΠΎΡ‚ Β«Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎΒ» синтаксиса Rust, принятого компилятором Π²Π½Π΅ макросов. Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ макросы захотят ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ язык, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ захотят ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ «настоящий» синтаксис Rust ΠΈ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² Π½Π΅ΠΌ.

  1. (ΠΠ΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅) Π― Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Eof Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹. Iterator , вСроятно, Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° TokenStream Π° Iterator::next ΡƒΠΆΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ None Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ± ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ.

  2. (ΠΠ΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅) Π― Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½Ρ‹ Exclamation , Dollar ΠΈΠ»ΠΈ Semicolon . НапримСр, сопоставлСниС ΠΏΠΎ Punctuation('!') Π½Π΅ слоТнСС.

  3. (ΠΠ΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ) Как ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π² RFC PR, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ коммСнтариями Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°. (Π›ΡŽΠ±ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…ΠΎΡ‡Π΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ, вСроятно, Ρ‚Π°ΠΊΠΆΠ΅ Ρ…ΠΎΡ‡Π΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹.)

  4. Насколько я ΠΌΠΎΠ³Ρƒ ΡΡƒΠ΄ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ с ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ (ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…, вСроятно, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΎΠΊΠ΅Π½) всС Π΅Ρ‰Π΅ остаСтся ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ вопросом. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ обсуТдаСтся Π² PR-коммСнтариях, Π½ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ Π½Π΅ вошло Π² тСкст RFC.

  5. ЧисловыС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ макросы сами Ρ€Π°Π·Π±ΠΈΡ€Π°ΡŽΡ‚ [Punct('1'), Punct('_'), Punct('2'), Punct('3'), Punct('4'), Punct('.'), Punct('5'), Punct('e'), Punct('6')] для вычислСния Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°? Они Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ str::parse::<f32> для этого, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ синтаксис, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚, Π½Π΅ совпадаСт с синтаксисом Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° Rust (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² сСрСдинС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ _ ).

    Π― полагаю, Ρ‡Ρ‚ΠΎ здСсь Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ. МоТСм Π»ΠΈ ΠΌΡ‹ ввСсти Π½ΠΎΠ²Ρ‹Π΅ числовыС Ρ‚ΠΈΠΏΡ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ u128 / i128 (ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ f128 , u256 ,…) ΠΈ ΠΈΡ… Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹, Π½Π΅ Π½Π°Ρ€ΡƒΡˆΠ°Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² API Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ²? Один ΠΈΠ· способов ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ:

    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 ΠΊ стандарту Unicode -

    Π­Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ. UAX 31 опрСдСляСт нСсколько Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² синтаксиса ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°, ΠΈ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… Π½Π΅ называСтся «словом». Но ΠΈΠΌΠ΅Π½Π½ΠΎ Π²Ρ‹Π±ΠΎΡ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, являСтся ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΡ‚ ASCII, Π² настоящСС врСмя

    ВмСсто этого я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ это Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΊΠ°ΠΊ «всС, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ компилятор ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² качСствС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΈΠ»ΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова» (ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ согласно # 28979). Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, с ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΌ API pub fn is_identifier(&str) -> bool Π² libmacro.

  7. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ Unicode ΠΈ Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ строковыС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ‚ΠΎΠΊΠ΅Π½Π°, Ρ‡Ρ‚ΠΎ я ΡΡ‡ΠΈΡ‚Π°ΡŽ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ прСдставлСния ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² памяти ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ( str vs [u8] ). Π’Π°ΠΊΠΆΠ΅ нСясно, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ text: Symbol для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½Ρ‹ΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠΌ исходного ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ послС Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ экранирования ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ косой Ρ‡Π΅Ρ€Ρ‚Ρ‹. Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠ΅. (Для сравнСния, Char(char) Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ послСдним, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ \u{A0} Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ char для Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ прСдставлСния.)

Π΄Ρ€ΡƒΠ³ΠΎΠΉ способ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ макросы высокого уровня - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ макросы Ρ‚ΠΈΠΏΠ° lisp, Π½ΠΎ для этого потрСбуСтся прСдставлСниС s-выраТСния для всСй rust ast.

@SimonSapin ,

Как ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π² RFC PR, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ коммСнтариями Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°. (Π›ΡŽΠ±ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…ΠΎΡ‡Π΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ, вСроятно, Ρ‚Π°ΠΊΠΆΠ΅ Ρ…ΠΎΡ‡Π΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹.)

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, Π½Π΅ Π½Π°Π΄ΠΎ. Π£ мСня Π΅ΡΡ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ я Ρ…ΠΎΡ‡Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ (Π½ΠΎ Π½Π΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ - вмСсто этого ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ записаны Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ компиляции) ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π² синтаксисС.

Π’ частности, я Ρ…ΠΎΡ‡Ρƒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ макросы ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ строки ΠΈΠ· ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ исходного Ρ„Π°ΠΉΠ»Π° (ΠΎΠ²), ΠΈ я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ список строк, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹ Π² ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ сборкС. И Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ способ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹ Π² этот список (rust-locale / rust-locale # 19). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ синтаксис ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π², ΠΈ макрос Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡ… Π²ΠΈΠ΄Π΅Ρ‚ΡŒ.

Π― согласСн с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΡƒΠ½ΠΊΡ‚Π°ΠΌΠΈ Π² этом постС.

@ jan-hudec
Π”Π°ΠΆΠ΅ Ссли Π±Ρ‹ Ρƒ нас Π½Π΅ Π±Ρ‹Π»ΠΎ TokenKind::Comment , Π²Ρ‹ всС Ρ€Π°Π²Π½ΠΎ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, просматривая содСрТимоС ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ‚ΠΎΠΊΠ΅Π½Π°ΠΌΠΈ.

Π― Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ TokenKind::Comment Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΎΡ‰Ρ€ΡΡ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³Π»ΠΈ свободно Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΊ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌ макросов, Π½Π΅ бСспокоясь ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ сСмантики.

@ jan-hudec Π•ΡΡ‚ΡŒ Π»ΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с вашим Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ?

@abonander , Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ смысла. ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΠΌΡ‹Π΅ строки Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ ΠΊΠ°ΠΊ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹, Π° Π½Π΅ ΠΊΠ°ΠΊ элСмСнты. Но ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΡ… Π²ΠΎ врСмя компиляции Π±Ρ‹Π»ΠΎ Π±Ρ‹ просто для удобства - это всСгда ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ синтаксичСский Π°Π½Π°Π»ΠΈΠ· (ΠΈ Π½Π° самом Π΄Π΅Π»Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ _всС_ ΠΈΠ· Π½ΠΈΡ… Π² ящикС, ΠΈ инкрСмСнтная компиляция сломаСт это).

Π― Ρ…ΠΎΡ‡Ρƒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ макрос, основанный Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ serde (ΠΈ поэтому Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ вызывая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² serde), Π½ΠΎ я Π½Π΅ ΠΌΠΎΠ³Ρƒ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‡Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ serde derive ΠΊΠ°ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, Π° Π½Π΅ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ макрос. Π­Ρ‚ΠΎ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для получСния макросов, я Π²ΠΈΠΆΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ трСбуСтся ΠΈ для Β«ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ…Β» ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов.

БСйчас ΠΌΠΎΠ΅ СдинствСнноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ - Ρ€Π°Π·Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠ΅ serde_derive.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² этом сообщСнии ΠΎΠ± ошибкС ΠΎΡ‚ rustc:

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

Π­Ρ‚ΠΎ Π»Π΅Π³ΠΊΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π½ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ нСкоторая ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ я Π½Π΅ знаю, ΠΊΠ°ΠΊ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ - ящик ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ proc-макрос, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов, Ρ‚Π°ΠΊ ΠΈ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ для ниТСстоящСго ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Как Π±Ρ‹ это выглядСло? Π•ΡΡ‚ΡŒ Π»ΠΈ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ Π² настоящСС врСмя, ΠΊΠΎΠ³Π΄Π° ящик ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ двумя Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ способами ΠΏΠΎ запросу ΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡŽΡ‰Π΅Π³ΠΎ ящика?

@aidanhs

Π―Ρ‰ΠΈΠΊ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов, вСроятно, ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ процСсс-макрос, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов, Ρ‚Π°ΠΊ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ макроса для Π½ΠΈΠΆΠ΅Π»Π΅ΠΆΠ°Ρ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Как Π±Ρ‹ это выглядСло?

Π’Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ функциям (ΠΈΠ»ΠΈ Ρ‡Π΅ΠΌΡƒ-Π»ΠΈΠ±ΠΎ Π΅Ρ‰Π΅, ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов) ΠΈΠ· ящика proc-macro . Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ TokenStream -> TokenStream ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ TokenStream -> TokenStream Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ящик, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΎΡ‚ proc-macro , Π° Π·Π°Ρ‚Π΅ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Ρ‚ΡŒ ящик proc-macro ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ просто Π΄Π΅Π»Π΅Π³ΠΈΡ€ΡƒΠ΅Ρ‚ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π­Ρ‚ΠΎΡ‚ RFC Π±ΡƒΠ΄Π΅Ρ‚ Π² основном Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ послС призСмлСния # 40939.

ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π°Π²Ρ‚ΠΎΡ€Π°ΠΌ proc_macro Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ элСмСнты Π² Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ящикС. foo Π½Π΅ трСбуя ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ макроса Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ extern crate foo; Π² ΠΊΠΎΡ€Π΅Π½ΡŒ ящика.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, я Ρ…ΠΎΡ‡Ρƒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ящик, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит ΠΊΠ°ΠΊ Π½Π΅ΠΌΠ°ΠΊΡ€ΠΎ-элСмСнты, Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ макрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ элСмСнты. Когда призСмлится # 40939, станСт Π»ΠΈ этот ΡƒΠ·ΠΎΡ€ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… ящиков идиоматичСским способом достиТСния этой Ρ†Π΅Π»ΠΈ?

  1. ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅ всС элСмСнты, Π½Π΅ относящиСся ΠΊ макросам, Π² foo_runtime
  2. Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ макрос Π² foo_macros , ΠΏΡ€ΠΈ нСобходимости ΠΎΠ±Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ символам Π² foo_runtime
  3. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ послСдний "фасадный" ящик foo ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ pub use s элСмСнты ΠΈΠ· foo_runtime ΠΈ foo_macros

    • Π­Ρ‚ΠΎ СдинствСнный ящик, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ.

    • Π­Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ систСма Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹ фиксируСт макросы Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π»ΠΈ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ящик.

Π― ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΠΈΠΌΠΏΠΎΡ€Ρ‚ Π΄Π²ΡƒΡ… ящиков , ΠΈ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ, Ссли Π±Ρ‹ я ΠΌΠΎΠ³ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ.

@lfairy Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ шаблон "Π΄Π²Π° ящика" Π±ΡƒΠ΄Π΅Ρ‚ идиоматичСским способом:

  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 : Π’Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π»ΠΈ этот Ρ‚Ρ€ΡŽΠΊ с рСэкспортом ΠΈ с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρƒ этих ящиков Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ - Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ экспорта ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠ².

@ colin-kiegel
Π―Ρ‰ΠΈΠΊΠΈ настраиваСмого извлСчСния - это просто ящики макросов процСссов, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ #[proc_macro_derive] s.
Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ #[feature(proc_macro)] Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π΅ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ Π² ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ящиках, Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π΅ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ макросы proc.

@jseyfried Π― Π² курсС ситуации Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, я Π·Π°Π΄Π°Π» вопрос, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΈΠ΄Π΅Π°Π»Π΅Π½, ΠΈ надСялся ΠΎΠ±ΡΡƒΠ΄ΠΈΡ‚ΡŒ Π΅Π³ΠΎ. Π’ описываСмой Π²Π°ΠΌΠΈ ситуации Β«Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅Β» / ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ящика становится вопросом убСТдСния Π°Π²Ρ‚ΠΎΡ€Π° макроса (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС serde) Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ свои ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы Π½Π° Π΄Π²Π° ящика. Если я ΠΌΠΎΠ³Ρƒ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы, ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π°Π²Ρ‚ΠΎΡ€Ρƒ апстрима Π΄Π°ΠΆΠ΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ ΠΈΡ… ящик.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, я осознаю ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ совмСстимости - Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², сгСнСрированноС макросом, становится Ρ‡Π°ΡΡ‚ΡŒΡŽ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ интСрфСйса, поэтому, Ссли serde ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ способ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Derive Π² вСрсии ΠΏΠ°Ρ‚Ρ‡Π°, ΠΈ я написал Ρ…Ρ€ΡƒΠΏΠΊΠΈΠΉ макрос, ΠΌΠΎΠΉ макрос Π±ΡƒΠ΄Π΅Ρ‚ сломан для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΌΠΎΠ΅Π³ΠΎ ящика (Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ…Ρ€ΡƒΠΏΠΊΠΎΠ³ΠΎ макроса Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ случаС, ΠΊΠΎΠ³Π΄Π° Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π²Ρ…ΠΎΠ΄ΠΎΠ², Π½ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ).

@jseyfried

ВытягиваСт Π»ΠΈ это foo ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ списка Π³Ρ€ΡƒΠ·ΠΎΠ²Ρ‹Ρ… ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΉ? Π—Π²ΡƒΡ‡ΠΈΡ‚ ΠΏΠ»ΠΎΡ…ΠΎ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ ΠΎΠ½ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ особСнно Π³Π»ΡƒΠΏΠΎΠ΅, Ссли Π΅ΡΡ‚ΡŒ 2 ящика с ΠΈΠΌΠ΅Π½Π΅ΠΌ foo ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ?).

@aidanhs Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ / Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ языка, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ создания собствСнного RFC.

@ arielb1

ВытягиваСт Π»ΠΈ это foo ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ списка Π³Ρ€ΡƒΠ·ΠΎΠ²Ρ‹Ρ… ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΉ? Π­Ρ‚ΠΎ Π·Π²ΡƒΡ‡ΠΈΡ‚ ΠΏΠ»ΠΎΡ…ΠΎ

Π”Π°, ΠΊ соТалСнию, ΠΈΠΌΠ΅Π½Π° extern crate ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ… Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π³ΠΈΠ³ΠΈΠ΅Π½ΠΈΡ‡Π½Ρ‹ΠΌΠΈ, Ρ‚.Π΅. Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π° ящиков ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ дСйствия, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ макрос. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΌΡΠ³Ρ‡ΠΈΡ‚ΡŒ это, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡƒΠ»ΠΎΠ²ΠΊΡƒ рСэкспорта (Ρ‚.Π΅. рСэкспорт foo_macros Π² foo Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ Π·Π½Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ foo Π±ΡƒΠ΄Π΅Ρ‚ Π² области дСйствия), Π½ΠΎ это Π½Π΅ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ ΠΎΡ‚ ошибок нСоднозначности ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π΄Π²ΡƒΡ… ящиков с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ foo .

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠΈΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ здСсь являСтся Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ зависимостСй Ρ„Π°Π·Ρ‹ 1 (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ хоста ΠΏΡ€ΠΎΡ‚ΠΈΠ² Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ) ΠΊ ящикам Cargo.toml для proc-macro ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки --target-extern . Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π½Π°ΠΌ явно ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π° extern crate Π² области видимости Π²Π½ΡƒΡ‚Ρ€ΠΈ quote! .

@jseyfried

ИдСя состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ящик proc-макроса Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ своих Β«Ρ†Π΅Π»Π΅Π²Ρ‹Ρ…Β» ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ…, Π²Π΅Ρ€Π½ΠΎ?

@ arielb1 Π”Π°, ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊ.

Π­Ρ‚ΠΎΡ‚ RFC Π±ΡƒΠ΄Π΅Ρ‚ Π² основном Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ послС призСмлСния # 40939.

@jseyfried Π“ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ стабилизации, ΠΊΠΎΠ³Π΄Π°

Π“ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ стабилизации, ΠΊΠΎΠ³Π΄Π° появится этот PR?

НСт, ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΏΡ‹Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с API ΠΏΠ΅Ρ€Π΅Π΄ стабилизациСй ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΉ Π³ΠΈΠ³ΠΈΠ΅Π½ΠΎΠΉ для extern crate names (Ρ‚.Π΅. Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ , Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Π°Π»

ΠœΡ‹, вСроятно, Π·Π°Ρ…ΠΎΡ‚ΠΈΠΌ внСсти критичСскиС измСнСния Π² этот API; @eddyb ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» / рассмотрСл Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ обобщСния OpKind Π½Π° всС Π΄Π΅Ρ€Π΅Π²ΡŒΡ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ². ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ, Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой ΠΈ Ρ‚. Π”. Π’ Ρ†Π΅Π»ΠΎΠΌ, API Π² этом PR Π΅Ρ‰Π΅ Π½Π΅ достаточно Π·Ρ€Π΅Π», Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ стабилизации.

@bstrie, ΠΊ соТалСнию, RFC для ускорСния стабилизации макроса proc (с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌ api, Π³Π΄Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΡ‚ΠΎΠΊΠΈ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΈΡ… строковоС прСдставлСниС), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, стабилизация макроса derive Π½Π΅ ΡƒΠ΄Π°Π»Π°ΡΡŒ: https://github.com/rust-lang/rfcs/ Ρ‚ΡΠ½ΡƒΡ‚ΡŒ / 1913

@ est31 Π‘ΠΊΠΎΡ€Π΅Π΅ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΎ - послС нСбольшого ΠΎΠΏΡ‹Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с этим API ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒΡΡ ΠΎ подмноТСствС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ

API Π½Π° основС String ΠΏΠ»ΠΎΡ…ΠΎ взаимодСйствуСт с Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ макросами 2.0 ΠΈ ΡƒΠΆΠ΅ сСгодня ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π΅Π³ΠΎ, Π΄Π°ΠΆΠ΅ Π±Π΅Π· макросов 2.0 ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с #[derive] s. ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ распространСния API Π½Π° основС String насколько это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ людСй Π½Π° макросы 2.0.

Π― ΠΎΡ‚ΠΊΡ€Ρ‹Π» ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΈΠ·- Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ #[proc_macro_attribute] Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡƒ, Π½Π΅ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ‡Π΅Ρ€Ρ‚ (ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, элСмСнты Ρ‡Π΅Ρ€Ρ‚ Π² Ρ†Π΅Π»ΠΎΠΌ?)

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ это ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° отслСТивания ящика proc_macro ΠΈ Π΅Π³ΠΎ Π½ΠΎΠ²Ρ‹Ρ… API, я ΠΏΠΎΠ΄ΡƒΠΌΠ°Π», Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠΆΠ΅ Π·Π°ΠΏΠΈΡˆΡƒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ мысли. Π― ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π» ящик ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ proc-macro2 ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅, ΠΊΠ°ΠΊ ящик Π² Π΄Π΅Ρ€Π΅Π²Π΅ proc_macro Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ обСспСчиваСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ компиляции Π½Π° ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΌ Rust. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для Π½ΠΎΡ‡Π½ΠΎΠΉ компиляции Rust, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅. Π­Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΏΡ€ΠΈΠ·Π²Π°Π½Π° ΡΡ‚Π°Ρ‚ΡŒ основой для Π΄Ρ€ΡƒΠ³ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ syn , ΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ syn ΠΌΡ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈ нСсколько нСдостатков, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π·Π°Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ нСпосрСдствСнно Π² proc_macro :

  • Для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ² Π½Π΅ сущСствуСт конструктора Literal . Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ строкового Π°Π½Π°Π»ΠΈΠ·Π° с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ синтаксичСским Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ, Π½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΡ… Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π±Π΅Π· нСобходимости ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· строковый API.

    • НСобработанныС строки - r###" foo "###

    • НСобработанныС Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ строки - rb#" foo "#

    • Π‘Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ - b'x'

    • ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° - Π² настоящСС врСмя ΠΎΠ½ΠΈ прСдставлСны ΠΊΠ°ΠΊ Ρ‚ΠΎΠΊΠ΅Π½ Literal .

  • НСвозмоТно ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Literal ΠΈ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΡ€ΡΠΌΠΎ сСйчас ΠΌΡ‹ полагаСмся Π½Π° literalext crate для to_string Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Π΅Π³ΠΎ, Π½ΠΎ эта информация тСорСтичСски ΡƒΠΆΠ΅ хранится Π² Literal ΠΈ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π½Π΅ΠΌΡƒ.
  • ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ истолковано ΠΊΠ°ΠΊ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ странноС. А ΠΈΠΌΠ΅Π½Π½ΠΎ прямо сСйчас ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ с Ρ‚ΠΈΠΏΠΎΠΌ Literal .

Π― ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠ΅ здСсь , с Ρ‚Π΅Ρ… ΠΏΠΎΡ€ Ρ€Π΅ΡˆΠ΅Π½Ρ‹.

Π― ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ» сбой ΠΏΡ€ΠΈ тСстировании с #![feature(proc_macro)] ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ влияСт Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ с #[proc_macro_derive(foo, attributes(foo))] . Π’ΠΎ Π΅ΡΡ‚ΡŒ настраиваСмая производная опСрация, имя Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ совпадаСт с ΠΈΠΌΠ΅Π½Π΅ΠΌ настраиваСмой ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹. Один ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… ящиков - ΠΌΠΎΠΉ - Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° извлСчСния ошибок, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΅ΡΡ‚ΡŒ #[derive(error_chain)] #[error_chain(...)] struct ErrorKind { ... } . Π”Ρ€ΡƒΠ³ΠΎΠΉ - derive-new, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ #[derive(new)] #[new] struct S; . НС знаю, Π΅ΡΡ‚ΡŒ Π»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅.

Для Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° компилятор ТалуСтся Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ "foo" is a derive mode . Π­Ρ‚ΠΎ сдСлано Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ ΠΈΠ»ΠΈ это ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ? Если это ΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΎ, ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡŽ ΠΌΠΎΠ΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ наслСдника Π² ErrorChain ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π² этом Ρ€ΠΎΠ΄Π΅.

@Arnavion
Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, это Π±Ρ‹Π»ΠΎ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ - ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ 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 , ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… я знаю, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сломаны этим.

@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; Π² ΠΊΠΎΡ€Π΅Π½ΡŒ ящика (PR # 40939 ).

PR призСмлился, Π½ΠΎ Ρ„Π»Π°ΠΆΠΎΠΊ всС Π΅Ρ‰Π΅ Π½Π΅ установлСн. @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 НСт: $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,
}

Π­Ρ‚ΠΎ соотвСтствуСт повСдСнию Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΉ вСрсии Rust, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ (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 послС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ - всС макросы ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ пространство ΠΈΠΌΠ΅Π½ Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ это Π·Π° макрос.

Π•ΡΡ‚ΡŒ Π»ΠΈ ΠΌΠ΅Π½Π΅Π΅ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ "мСсто" для Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π° ΠΎ макросах proc? Нравится ΠΊΠ°Π½Π°Π» IRC #rust-proc-macro ? Π― Π±Ρ‹ Ρ…ΠΎΡ‚Π΅Π» врСмя ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ нСбольшиС вопросы ΠΎΠ± этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½ΠΎ ΠΌΠ½Π΅ каТСтся Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΡΠΏΠ°ΠΌΠΈΡ‚ΡŒ эту Π²Π΅Ρ‚ΠΊΡƒ: see_no_evil: А Π² ΠΊΠ°Π½Π°Π»Π΅ #rust Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ людСй Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ с proc-макросами ΠΈ особСнно Π½ΠΎΠ²Ρ‹ΠΉ proc_macro API (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ нСстабилСн ΠΈ всС Ρ‚Π°ΠΊΠΎΠ΅). Π˜Ρ‚Π°ΠΊ: Π΅ΡΡ‚ΡŒ ΠΈΠ΄Π΅ΠΈ, Π³Π΄Π΅ ΠΎΠ±ΡΡƒΠ΄ΠΈΡ‚ΡŒ эту Ρ‚Π΅ΠΌΡƒ?

@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

МоТно Π»ΠΈ / ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ эту ΠΏΠ°Π½ΠΈΠΊΡƒ нСявным созданиСм Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ «сСанса»? Или, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ API (с ΠΏΡƒΡ‚Π΅ΠΌ ΠΊ стабилизации) для Π΅Π³ΠΎ создания?

ΠšΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ смотрСл Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Ρƒ ΠΏΠΎ макросам ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… систСм? Π₯ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΡƒΡΠ»Ρ‹ΡˆΠ°Ρ‚ΡŒ ΠΌΠ½Π΅Π½ΠΈΠ΅ людСй ΠΏΠΎ этому ΠΏΠΎΠ²ΠΎΠ΄Ρƒ. Π― Π±ΡƒΠ΄Ρƒ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ здСсь ΠΎ Scheme, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это Ρ‚ΠΎ, с Ρ‡Π΅ΠΌ я большС всСго Π·Π½Π°ΠΊΠΎΠΌ.

Π― Π»ΠΈΡ‡Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽ Π½Π°Π΄ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ схСмы syntax-rules для схСмы R7RS Π² ΠΌΠΎΠ΅ΠΌ собствСнном ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅, ΠΈ я ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ syntax-case ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ основой для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΊΠ°ΠΊ антисанитарных, Ρ‚Π°ΠΊ ΠΈ Π³ΠΈΠ³ΠΈΠ΅Π½ΠΈΡ‡Π½Ρ‹Ρ… макросистСм ( defmacro ΠΈ syntax-rules ). GNU Guile Π΄Π΅Π»Π°Π΅Ρ‚ это. syntax-case Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ„Π΅Π½Π΄Π΅Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ΠΎΠ² Π² списках синтаксичСских ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ срСди строк TokenStream Π² схСмС). Π― Π²ΠΈΠΆΡƒ, Ρ‡Ρ‚ΠΎ Π½Π°Π΄ Mark Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚, ΠΈ ΠΏΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π²Π΄ΠΎΡ…Π½ΠΎΠ²Π»Π΅Π½ привязками ΠΊΠ°ΠΊ Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ областСй видимости .

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π»ΠΈ ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡΡƒΠ΄ΠΈΡ‚ΡŒ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ вычислСния Π²ΠΎ врСмя компиляции? Racket фактичСски ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Β«Ρ„Π°Π·ΠΎΠ²Ρ‹ΠΉΒ» ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ Π²Π΅Ρ‰Π°ΠΌ, ΠΏΠΎΡ…ΠΎΠΆΠ΅, с begin-for-syntax Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠΌ опрСдСлСния ΠΈ вычислСния (?) На ΡƒΡ€ΠΎΠ²Π½Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции Π²ΠΎ врСмя Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ макроса. .

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ Π³ΠΈΠ³ΠΈΠ΅Π½ΠΎΠΉ ΠΎΡ‡Π΅Π½ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ (datum->syntax <thing-to-copy-scope-from> <thing-to-apply-scope-to>) Π² Scheme, Ρ‡Ρ‚ΠΎ позволяСт Π²Π°ΠΌ Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· области дСйствия макроса ΠΈ вмСсто этого Π²Π·ΡΡ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ дСйствия ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ нСпосрСдствСнной области.

Π’ΠΎΠ·ΡŒΠΌΠΈΡ‚Π΅ этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· языка программирования схСм, 3-Π΅ ΠΈΠ·Π΄. Π . ΠšΠ΅Π½Ρ‚ Π”ΠΈΠ±Π²ΠΈΠ³ (Chez Scheme, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π² Cisco Systems): http://www.scheme.com/tspl3/syntax.html . ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ (include "filename.scm") ΠΊΠ°ΠΊ макрос syntax-case ΠΈ позволяСт ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ макрос для настройки срСды выполнСния для чтСния ΠΈΠ· Ρ„Π°ΠΉΠ»Π° ΠΈ продолТСния ΠΎΡ†Π΅Π½ΠΊΠΈ. Π‘ΠΎΠ»Π΅Π΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΈΠΉ вопрос здСсь Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ…ΠΎΡ‚ΠΈΠΌ Π»ΠΈ ΠΌΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ систСма макросов позволяла Ρ‚Π°ΠΊΠΈΠΌ Π²Π΅Ρ‰Π°ΠΌ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π²ΠΎ врСмя Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ макроса ΠΈ запускала вычислСния Π²ΠΎ врСмя компиляции, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ запуск ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° Ρ„Π°ΠΉΠ»Π° (хотя, ΠΏΠΎΡ…ΠΎΠΆΠ΅, это происходит Π² функциях прямого компилятора, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ этого Π΄Π΅Π»Π°Ρ‚ΡŒ).

КакиС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ макросов? Π― ΠΌΠΎΠ³ Π±Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Rust, ТСлая ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя компиляции, Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΎΡ†Π΅Π½ΠΊΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции (ΠΈ особСнно ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ бСсконСчных Ρ†ΠΈΠΊΠ»ΠΎΠ²). Racket ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ «башни составитСлСй ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚Π΅Π»Π΅ΠΉΒ» с Ρ„Π°Π·Π°ΠΌΠΈ, ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² Lisp in Small Pieces. Π₯ΠΎΡ‚ΠΈΠΌ Π»ΠΈ ΠΌΡ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠ°ΠΊ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ доступа ΠΊ API Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции для выполнСния Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Ρ… рСкурсивных вычислСний? Π”ΠΎΠ»ΠΆΠ½Ρ‹ Π»ΠΈ ΠΌΡ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Π²Π΅Ρ‰Π°ΠΌ Π²Ρ€ΠΎΠ΄Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ спСцификации элСктронной Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ CSV Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ?

Π― Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΡƒΡΠ»Ρ‹ΡˆΠ°Ρ‚ΡŒ ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… систСмах! Π― ΡΠ»Ρ‹ΡˆΠ°Π», Ρ‡Ρ‚ΠΎ Π² Template Haskell Π΅ΡΡ‚ΡŒ интСрСсный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ с Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ для прСдставлСния ΠΈΡ… AST, Π° лСнь Π² Haskell ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ примСнСния макросов для ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… структур.

Π˜Π·Π²ΠΈΠ½ΠΈΡ‚Π΅, Ссли я Π²Ρ‹Ρ…ΠΎΠΆΡƒ ΠΈΠ· строя.

КакиС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ макросов?

Для ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов, обсуТдаСмых Π² этом выпускС, Π½Π΅Ρ‚ . ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ макрос - это Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ компилятора. Он ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π·ΡΡ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° C ++, Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Ρ‡Π΅Ρ€Π΅Π· clang ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ. ΠœΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ SQL, запрос ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΈ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π½Π°Π±ΠΎΡ€ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². Π­Ρ‚ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ использования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ люди хотят ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ!

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² Rust Π΅ΡΡ‚ΡŒ другая макросистСма. Π­Ρ‚ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΠΎΠ΄ΠΎΠ±Ρ€Π΅Π½ΠΎ ΠΊΠ°ΠΊ 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 , вСроятно, Π»ΡƒΡ‡ΡˆΠ΅Π΅ мСсто для обсуТдСния этого.

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ proc, относящиСся ΠΊ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅, ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° ΠΎΠ±Ρ‰ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ define-syntax . И этот RFC ( 1566 ) Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ Π½Π΅ опрСдСляСт Π½ΠΈΡ‡Π΅Π³ΠΎ Π²Ρ€ΠΎΠ΄Π΅ syntax-case . Волько интСрфСйс для Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ прСобразования ΠΏΠΎΡ‚ΠΎΠΊΠ° Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ².

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ syntax-case ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ящикС (Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅), ΠΈ Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Если Π²Ρ‹ Ρ‚Π°ΠΊ склонны, Π½Π΅ ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. И любой ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ, ΠΈ ΠΎΡ‚Ρ‡Π΅Ρ‚ ΠΎ Ρ‚ΠΎΠΌ, насколько Π»Π΅Π³ΠΊΠΎ ΠΈΠ»ΠΈ слоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ API, бСзусловно, Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠ²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒΡΡ.

Π― Π΄ΡƒΠΌΠ°ΡŽ, идСя Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π»Π°ΡΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ макросы, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠ°ΠΊ Π² lisp, Π½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ макрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ макрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт 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 НСт, Π½Π΅ ΠΏΠΎΡ…ΠΎΠΆΠ΅. Π― просто Ρ…ΠΎΡ‚Π΅Π» ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Π±ΡƒΠ΄ΡƒΡ‚ Π»ΠΈ макросы Scheme умСстной ΠΈΠ΄Π΅Π΅ΠΉ для добавлСния Π² обсуТдСниС - ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π½Ρ‹ΠΌΠΈ, Ρ‡Π΅ΠΌ макросистСма syntax-case Π² Scheme, это Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ всСх макросистСм с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ мощности, прСдставлСнной здСсь.

@ jan-hudec Π Π°Π·ΡƒΠΌΠ½ΠΎ Π»ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ вычислСния Π² качСствС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ компилятора Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ бСзопасности? Π― Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ ΠΏΠΎΡ€Π°ΠΆΠ΅Π½ ΠΈΠ΄Π΅Π΅ΠΉ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы Π±ΡƒΠ΄ΡƒΡ‚ здСсь Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΎΡ‰Π½Ρ‹ΠΌΠΈ, Π½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π»ΠΈ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Rust ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ это нСдостатком использования ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²? Π― Π½ΠΈ Π² ΠΊΠΎΠ΅ΠΌ случаС Π½Π΅ экспСрт ΠΏΠΎ бСзопасности, Π½ΠΎ нСльзя Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ уязвимости Π² ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΡ… компилятора, для Π·Π»ΠΎΠ½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠ³ΠΎ прСвращСния компилятора Rust Π² Π²Π΅ΠΊΡ‚ΠΎΡ€ Π°Ρ‚Π°ΠΊΠΈ? ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ссли Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросах, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ошибки (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, segfault, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹ΠΉ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ C), ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π»ΠΈ это, Ρ‡Ρ‚ΠΎ segfault просочится ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ сбою компилятора Π±Π΅Π· Π½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰Π΅Π³ΠΎ ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…?

Π‘ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ способ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ошибки, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠ΅ Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросах, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π½Π΅ влияли Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ части компилятора?

Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° идСя: ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы? Если ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы ΠΌΠΎΠ³ΡƒΡ‚ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с ΠΊΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, связь с внСшним сСрвСром с отслСТиваниСм состояния, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ внСшнСй Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… SQL, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° бСзопасности для Π²Ρ…ΠΎΠ΄Π° Π²ΠΎ внСшнюю систСму), Ρ‚ΠΎ это Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ порядок, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ Π² процСссС компиляции, Π²Π°ΠΆΠ΅Π½?

ΠŸΠ°ΠΊΠ΅Ρ‚Ρ‹ @VermillionAzure Cargo ΡƒΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ сцСнарии сборки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π²ΠΎ врСмя компиляции, поэтому ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы Π½Π΅ ΡƒΡ…ΡƒΠ΄ΡˆΠ°ΡŽΡ‚ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π½Π° этом Ρ„Ρ€ΠΎΠ½Ρ‚Π΅: Π²Π°ΠΌ ΡƒΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ своим зависимостям. (Π­Ρ‚ΠΎ нСсколько упрощаСтся Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ crates.io являСтся нСизмСняСмым / доступным Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для добавлСния, Π° зависимости Π½Π΅ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ΡΡ автоматичСски, Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ» Cargo.lock : Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ вСрсиям.) И Π΄Π°ΠΆΠ΅ Ссли сцСнарии сборки этого Π½Π΅ сдСлали. ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚, ваши зависимости ΠΏΠΎ своСй ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π²ΠΎ врСмя выполнСния. ВрСмя компиляции Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Ρ…ΡƒΠΆΠ΅?

Π­Ρ‚ΠΎ обсуТдСниС заставляСт мСня Π·Π°Π΄ΡƒΠΌΠ°Ρ‚ΡŒΡΡ ΠΎ связанной, Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ящик опрСдСляСт Π΄Π²Π° макроса proc: foo!() записываСт Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Π° bar!() Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ„Π°ΠΉΠ». ΠŸΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ этого ящика Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΊ foo!() ΠΈ bar!() Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΌΠΎΠ΄ΡƒΠ»Π΅. Π—Π°Ρ‚Π΅ΠΌ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΡΡ‚ΡŒ компиляции Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· foo!() ΠΈΠ»ΠΈ bar!() раскрываСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ. Π­Ρ‚ΠΎΡ‚ порядок опрСдСляСтся Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, ΠΈ, Ссли достаточно людСй Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ стандартом Π΄Π΅-Ρ„Π°ΠΊΡ‚ΠΎ.

Π― Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, насколько это ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Π°Ρ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. ΠŸΡ€ΠΎΡΡ‚ΠΎ обСспокоСн Ρ‚Π΅ΠΌ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ Π»ΠΈ это ΠΊ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΡŽ ΠΌΠ°Ρ…ΠΈΠ½Π°Ρ†ΠΈΠΉ с упорядочСниСм ΠΏΠΎΠ»Π΅ΠΉ структуры.

@SimonSapin

Π₯отя я согласСн с вашСй ΠΏΠΎΠ·ΠΈΡ†ΠΈΠ΅ΠΉ, я Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ сущСствСнноС Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π²ΠΎ врСмя компиляции ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π²ΠΎ врСмя выполнСния:

Он обСспСчиваСт Π΄Ρ€ΡƒΠ³ΡƒΡŽ модСль ΡƒΠ³Ρ€ΠΎΠ·, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ компилируСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Π° Π·Π°Ρ‚Π΅ΠΌ развСртываСтся Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ…. (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, использованиС Π½Π΅Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°ΡŽΡ‰Π΅Π³ΠΎ плюс нСдостаток изолированности Π² кластСрС сборки дистрибутива Linux.)

@lfairy Π”Π°, это ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Racket ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»Π°ΡΡŒ Π±ΠΎΠ»Π΅Π΅ дСсяти Π»Π΅Ρ‚ Π½Π°Π·Π°Π΄, Π² 2002 Π³ΠΎΠ΄Ρƒ. ΠœΡΡ‚ΡŒΡŽ Ѐлэтт, самый ΠΊΡ€ΡƒΠΏΠ½Ρ‹ΠΉ участник Racket, «БоставныС ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ макросы: ΠΊΠΎΠ³Π΄Π° это Π½ΡƒΠΆΠ½ΠΎ Π . ΠšΠ΅Π½Ρ‚ Π”ΠΈΠ±Π²ΠΈΠ³, ΠΊΡ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π» Π½Π°Π΄ Chez Scheme, Ρ‚Π°ΠΊΠΆΠ΅ написал ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΎ Ρ„Π°Π·Π°Ρ… ΠΎΡ†Π΅Π½ΠΊΠΈ для Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ / ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π² «НСявноС Ρ„Π°Π·ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… R6RSΒ» .

@SimonSapin ВрСмя компиляции ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Ρ…ΡƒΠΆΠ΅. Если ваш компилятор Π΄Π°Π΅Ρ‚ сбой Π² случайном порядкС ΠΈΠ»ΠΈ выполняСт врСдоносноС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ запускаСтся компилятором, я Π³ΠΎΡ‚ΠΎΠ² ΠΏΠΎΡΠΏΠΎΡ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ пост Reddit ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Β«ΠœΠΎΠ΄ΡƒΠ»ΠΈ Rust ΠΏΠΎ своСй ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π΅ нСбСзопасны» ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π² этом Ρ€ΠΎΠ΄Π΅.

@VermillionAzure , я Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‡ΠΈΡ‚Π°Π» ΡΡ‚Π°Ρ‚ΡŒΠΈ, Π½ΠΎ я Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ для обсуТдСния, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ сталкиваСтся Rust, сильно ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ сталкиваСтся Scheme.

Π’ схСмС ΠΎΠ΄Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊ ΠΈ макросы, поэтому компилятор Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½Ρ‹ Π²ΠΎ врСмя компиляции, Π° ΠΊΠ°ΠΊΠΈΠ΅ - Π²ΠΎ врСмя выполнСния. Однако Π² Rust ящик прСдоставляСт Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы, Π»ΠΈΠ±ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ это Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ (Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚) ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ.

(ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ящик, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния, Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ основанныС Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ… (гигиСничСскиС) макросы, Π½ΠΎ это ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π² Rust)

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚

@ jan-hudec Π”Π°, Π΄ΡƒΠΌΠ°ΡŽ, Ρ‚Ρ‹ ΠΏΡ€Π°Π². Но порядок ΠΎΡ†Π΅Π½ΠΊΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ Π²ΠΎ врСмя компиляции, Ссли Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов. ΠœΠΎΠΆΠ΅Ρ‚ Π»ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ?

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ макрос «вСроятно, Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½Β» ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅Ρ‚Π°Π»ΠΈ (см. НиТС) нСльзя ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ, Π½ΠΎ Ρƒ нас, скорСС всСго, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ систСмС Ρ‚ΠΈΠΏΠΎΠ², Π² языкС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… Π±Ρ‹Ρ‚ΡŒ чисто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ.

Π­Ρ‚ΠΈ свСдСния Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² сСбя порядок выполнСния ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ макросами proc, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ макроса proc Π² ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π½ΠΎΠΉ сборкС. Для послСднСго ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ для объявлСния зависимостСй, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ rerun-if-changed Π² сцСнариях сборки. И, ΠΊΠ°ΠΊ ΠΈ Π² сцСнарии сборки, эти объявлСния ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΏΠΎΠ»Π½Ρ‹ΠΌΠΈ ΠΈΠ»ΠΈ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ошибки. ΠœΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ статичСски ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ всС ошибки.

Π― Π΄ΡƒΠΌΠ°ΡŽ, Π½Π°ΠΌ слСдуСт ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ящикам макросов proc Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов, ΠΈ ΠΈΠΌ Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ запуск для Ρ‡Π΅Π³ΠΎ-Π»ΠΈΠ±ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ измСнСния ΠΊΠΎΠ΄Π° Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ( Π˜Ρ‚Π°ΠΊ, Π½Π΅Ρ‚ глобального состояния).

ПозТС ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡΠ»Π°Π±ΠΈΡ‚ΡŒ это Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅, ΡƒΠΊΠ°Π·Π°Π² ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ запуск ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹.

(Π£ мСня Π΅ΡΡ‚ΡŒ Π½Π°ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρƒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±Ρ‰ΠΈΠΉ сцСнарий сборки / ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ бСзопасности макросов для ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ здСсь Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚, Π½ΠΎ я Π΅Ρ‰Π΅ Π½Π΅ написал Π΅Π³ΠΎ)

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ IMO proc / custom derive Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ срСду Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π²Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ ΠΈ ΠΎΡ†Π΅Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ miri, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, с JIT ΠΊΡ€Π°Π½Π»ΠΈΡ„Ρ‚Π°.

@ est31 отличная идСя, Π½ΠΎ Π²Ρ€ΠΎΠ΄Π΅ дизСльного Ρ‚ΠΎΠΏΠ»ΠΈΠ²Π° infer_schema! ΡƒΠΆΠ΅
сущСствуСт, bindgen Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π΄Π°ΠΆΠ΅ include! Π° Ρ‚Π°ΠΊΠΆΠ΅
env! ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π²ΠΎΠ΄ / Π²Ρ‹Π²ΠΎΠ΄.

9 ноября 2017 Π³. Π² 06:19 "est31" [email protected] написал:

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ IMO proc / custom derive Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ срСду
Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ Π²Π²ΠΎΠ΄Π° / Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ внСшнСй сторонС ΠΈ ΠΎΡ†Π΅Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ
ΠœΠΈΡ€ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, с ΠΊΡ€Π°Π½Π»ΠΈΡ„Ρ‚ΠΎΠΌ JIT.

-
Π’Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ это, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ вас упомянули.
ΠžΡ‚Π²Π΅Ρ‚ΡŒΡ‚Π΅ Π½Π° это письмо Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, просмотритС Π΅Π³ΠΎ Π½Π° GitHub
https://github.com/rust-lang/rust/issues/38356#issuecomment-343124957 ,
ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ
https://github.com/notifications/unsubscribe-auth/AAC3n5VOPdKBsu81Sp3tp2XlIQ05L865ks5s0t_PgaJpZM4LMWlc
.

ΠŸΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ # 40939 ΠΈ # 44528 ΡƒΠΆΠ΅ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Ρ‹ ... @jseyfried, Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Ρ‹ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ список?

@ mark-im ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΎ.

ΠœΠΎΠ³ΡƒΡ‚ Π»ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы?

@VermillionAzure Π― Π½Π΅ ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π», Π½ΠΎ Π½Π΅ Π²ΠΈΠΆΡƒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΊΠ°ΠΊ ΠΈ макросы proc, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ "исполняСмый" ΠΊΠΎΠ΄, ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π² ящиках ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ Ρ‚Π΅Ρ…, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ.

Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎ ΠΌΡ‹ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ proc_macro :: TokenNode сСгодня - Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ Π±Π»ΠΎΠΊΠΎΠ² { ... } связаны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΎΠ΄Π½ΠΈΠΌ Span Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ TokenStream, поэтому Π½Π΅Ρ‚ возмоТности Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ошибка, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ } . Rustc, ΠΏΠΎΡ…ΠΎΠΆΠ΅, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ этого ограничСния.

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

Π›ΡƒΡ‡ΡˆΠ΅Π΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π² макросС proc, - это ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π° послСдний Ρ‚ΠΎΠΊΠ΅Π½ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π±Π»ΠΎΠΊΠ°, ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π° вСсь Π±Π»ΠΎΠΊ ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΠΊΠ΅Π½ послС Π±Π»ΠΎΠΊΠ°, Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ являСтся Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ для ошибки, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅.

ΠžΠ±Ρ‰ΠΈΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π±Ρ‹Π»ΠΎ Π±Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Span::start ΠΈ Span::end Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»ΠΈ ΠΎΠ΄Π½ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ 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, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ±Π°Π²ΠΈΠ» этот API Π² # 43604.

ΠΈΠΌΠ΅ΡŽΡ‚ Span :: start ΠΈ Span :: end Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ 1-ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Span вмСсто LineColumn, ΠΊΠ°ΠΊ Π² настоящСС врСмя, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ способ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΎΡ‚ Span ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΉ строкС / столбцу Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°.

Π­Ρ‚ΠΎ заставило Π±Ρ‹ Span ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ особоС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для Ρ€Π°Π·Π³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Ρ… списков, Π½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ для всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ². Π’ΠΎΠΎΠ±Ρ‰Π΅-Ρ‚ΠΎ это Π½Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. ΠŸΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ для выраТСния Ρ‚ΠΈΠΏΠ° 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`?

ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ этого Π½Π° сторонС Syn: https://github.com/dtolnay/syn/issues/290.

@dtolnay
ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° здСсь Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ MySend импортируСтся Π½Π° этапС 0 (Ρ‚.Π΅. для хост-Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ ΠΏΡ€ΠΈ кросс-компиляции), поэтому ΠΎΠ½ нСдоступСн Π½Π° этапС 1 (Ρ‚.Π΅. ΠΏΡ€ΠΈ компиляции для Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹).

РСшСниС здСсь состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ ящикам proc-macro ΠΈΠΌΠ΅Ρ‚ΡŒ зависимости Ρ„Π°Π·Ρ‹ 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 ), Ρ‚ΠΎ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ трСбуСтся serde Π² ΠΈΡ… Cargo.toml, Π΄Π°ΠΆΠ΅ Ссли ΠΌΡ‹ этого Π½Π΅ сдСлаСм. Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ написали extern crate serde . МоТно Π»ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ extern crate с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ def_site() ΠΈΠ΄Π΅Π½Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΈΠ² Ρ„Π°ΠΉΠ»Π° Cargo.toml ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠ³ΠΎ макроса ΠΈ extern crate с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ call_site() ΠΈΠ΄Π΅Π½Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΈΠ² нисходящСго ΠΏΠΎΡ‚ΠΎΠΊΠ° Cargo.toml?

Π§Ρ‚ΠΎ касаСтся ящиков extern, я ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽ, Ρ‡Ρ‚ΠΎ ящики Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ явно доступны для Ρ„Π°Π·Ρ‹ 1 с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ макроса proc.

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

@dtolnay

Π’ ΠΊΠΎΠ΄Π΅ Π² ΠΌΠΎΠ΅ΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, Ссли я измСню impl_mysend_for, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ impl для Send вмСсто MySend, Ρ‚ΠΎΠ³Π΄Π° всС компилируСтся. К ΠΊΠ°ΠΊΠΎΠΌΡƒ посылу относится это Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ½ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ„Π°Π·ΠΎΠΉ 0 ΠΈ Ρ„Π°Π·ΠΎΠΉ 1? Π­Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ ΠΈΠ»ΠΈ случайно?

Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ вопрос. ΠŸΡ€ΡΠΌΠΎ сСйчас ΠΏΡ€Π΅Π»ΡŽΠ΄ΠΈΡ находится Π² области дСйствия Π½Π° сайтС опрСдСлСния (Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ящик proc-macro Π½Π΅ #![no_implicit_prelude] ), ΠΈ это ΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΠΎΡΡ‚ΡŒ (Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ смыслС) ΠΈΠ·-Π·Π° различия Ρ„Π°Π·Ρ‹ 0 ΠΈ Ρ„Π°Π·Ρ‹ 1, ΠΊΠ°ΠΊ Π²Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ .

Однако для эргономики я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Ρ„Π°Π·Π° 1 Π΄ΠΎΠ»ΠΆΠ½Π° нСявно ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ std Π² ΠΊΠΎΡ€Π½Π΅ макроса ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ (Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ всСгда ΠΌΠΎΠ³Π»ΠΈ quote!(use std::...); ) ΠΈ ΠΏΡ€Π΅Π»ΡŽΠ΄ΠΈΡŽ для удобства / эргономики, ΠΈ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ ΡƒΠΆΠ΅ нСявны Π² Ρ„Π°Π·Π΅ 0. Π‘ΠΊΠΎΡ€ΠΎ Π½Π° Ρ„Π°Π·Π΅ 1 Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ std Π² ΠΊΠΎΡ€Π΅Π½ΡŒ.

Π§Ρ‚ΠΎ Π΅Ρ‰Π΅ Π² области видимости ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠΎΠΈΠΌΠΈ Ρ‚ΠΎΠΊΠ΅Π½Π°ΠΌΠΈ def_site (), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Send?

Помимо ΠΏΡ€Π΅Π»ΡŽΠ΄ΠΈΠΈ ΠΈ (скоро) std ΠΊΠ°ΠΊ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, СдинствСнными Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π²Π΅Ρ‰Π°ΠΌΠΈ Π² области дСйствия Π½Π° этапС 1 ΡΠ²Π»ΡΡŽΡ‚ΡΡ сами макросы proc (Π° Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ макроса proc, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ этапом 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
    }
}

МоТно Π»ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ extern crate с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° def_site () для Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠ³ΠΎ макроса Cargo.toml ΠΈ extern crate с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ call_site () для сопоставлСния с исходным Cargo.toml?

Π”Π°, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ я ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ внСшний ящик с Span::def_site() Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ‚ΡŒΡΡ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ зависимостСй Ρ„Π°Π·Ρ‹ 1 (Ρ†Π΅Π»ΠΈ) ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠ³ΠΎ макроса Cargo.toml - сСгодняшниС зависимости Ρ„Π°Π·Ρ‹ 0 связаны с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ, скомпилированными для ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ хоста . ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ зависимости Ρ„Π°Π·Ρ‹ 1 Π΅Ρ‰Π΅ Π½Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚, имя внСшнСго ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Π½Π΅Π³ΠΈΠ³ΠΈΠ΅Π½ΠΈΡ‡Π½ΠΎ, Ρ‡Ρ‚ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ, Ρ€Π°Π·Π΄Ρ€Π°ΠΆΠ°Π΅Ρ‚.

Когда Ρƒ нас Π΅ΡΡ‚ΡŒ зависимости Ρ„Π°Π·Ρ‹ 1, Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ extern crate s Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΈ для Π½Π°Ρ‡Π°Π»Π°, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ это Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. Однако ΠΌΡ‹ всС Ρ€Π°Π²Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ это ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ - Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠ»Π°Π½ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сначала ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Ρ†Π΅Π»Π΅Π²Ρ‹Π΅ зависимости ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° proc-macro, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ антисанитарному Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ с Ρ†ΠΈΠΊΠ»ΠΎΠΌ прСдупрСТдСния с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΎΡ‚Ρ‚ΠΎΠΊΠ°.

Π§Ρ‚ΠΎ касаСтся ящиков extern, я ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽ, Ρ‡Ρ‚ΠΎ ящики Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ явно доступны для Ρ„Π°Π·Ρ‹ 1 с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ макроса proc.
#[proc_macro_derive(Serialize, attributes(serde), crates(serde))]

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ это Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

ВмСсто этого я Π΄ΡƒΠΌΠ°Π», Ρ‡Ρ‚ΠΎ ящик Ρ„Π°Π·Ρ‹ 1 Π±ΡƒΠ΄Π΅Ρ‚ объявлСн Π² ΠΊΠΎΡ€Π½Π΅ ящика proc-macro (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, #[phase(1)] extern crate foo; ), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Π±Ρ‹Π» автоматичСски доступСн Π²ΠΎ всСх макросах proc (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, quote!(use foo::bar); ). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ extern crate Π² любом случаС находится Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ ящики Ρ„Π°Π·Ρ‹ 1 - всС Ρ†Π΅Π»Π΅Π²Ρ‹Π΅ зависимости ΠΈΠ· Cargo.toml автоматичСски ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости корня ящика proc-macro Π² Ρ„Π°Π·Π΅ 1.

Π’ своСм ΠΊΠΎΠ΄Π΅ я ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠΈ для Π΄Π²ΡƒΡ… Ρ†Π΅Π»Π΅ΠΉ: для управлСния Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈΠΌΠ΅Π½ ΠΈ для управлСния сообщСниями ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…. Бвязаны Π»ΠΈ эти Π΄Π²Π° элСмСнта Π½Π΅Ρ€Π°Π·Ρ€Ρ‹Π²Π½ΠΎ, ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡΠΌΠ΅ΡˆΠΈΠ²Π°Π΅Ρ‚ аспСкт Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈΠΌΠ΅Π½ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° с мСстополоТСниями сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… строки / столбца Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°? Π― оТидаю, Ρ‡Ρ‚ΠΎ это Π±ΡƒΠ΄Π΅Ρ‚ обычная ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ.

Π§Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ, Ρƒ мСня Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ, внСсСнный Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Π² def_site ΠΌΠΎΠ΅Π³ΠΎ настраиваСмого ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈ я Ρ…ΠΎΡ‡Ρƒ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠ² Π² полях структуры ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Если Ρ‚ΠΈΠΏ поля Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ характСристику, я Ρ…ΠΎΡ‡Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сообщСниС ΠΎΠ± ошибкС ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π»ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ»Π΅ структуры.

Π― ΠΌΠΎΠ³Ρƒ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° с Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌ def_site, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ компилируСтся ΠΈ запускаСтся, Π½ΠΎ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, ΠΊ соТалСнию, всСгда ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ derive, ΠΊΠ°ΠΊ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² Macros 1.1.

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

Или я ΠΌΠΎΠ³Ρƒ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° с Ρ‚Π΅ΠΌ ΠΆΠ΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏ поля структуры, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π½ΠΈΠ΅, Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Ρ‚Ρƒ Π² области Π½Π° ΠΌΠΎΠ΅ΠΌ def_site.

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

Как ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ошибки Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ я Ρ…ΠΎΡ‡Ρƒ?

@dtolnay ΠžΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, спасибо.

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ способ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ https://github.com/rust-lang/rust/issues/46489 ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сгСнСрированныС Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ #[derive(…)] ΠΈΠΌΠ΅Π»ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈΠΌΠ΅Π½ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ scope ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°, Π° ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Ρ‹ сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ макроса quote! {} ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡ… создал.

Как обстоят Π΄Π΅Π»Π° с Π³ΠΈΠ³ΠΈΠ΅Π½ΠΎΠΉ сСйчас? Π£ мСня Π΅ΡΡ‚ΡŒ функция, подобная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠΌΡƒ макросу, которая Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° (4 мСсяца Π½Π°Π·Π°Π΄), Π½ΠΎ начиная с rustc 1.24.0-nightly (b65f0bedd 2018-01-01) ΠΎΠ½ ТалуСтся, Ρ‡Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΉΠ΄Π΅Π½ Π² области видимости.

Π˜Π·Π²ΠΈΠ½ΠΈΡ‚Π΅, ΠΌΠ½Π΅ слСдовало сначала ΠΏΠΎΠΈΡΠΊΠ°Ρ‚ΡŒ Π² систСмС отслСТивания ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΏΠΎΡ…ΠΎΠΆΠ΅, я Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π½Π°ΠΆΠ°Π» Π½Π° https://github.com/rust-lang/rust/issues/46489.

Π― ΠΏΠΎΠ΄Π°Π» β„– 47311, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, ΠΊΠ°ΠΊ ΠΌΠ½Π΅ каТСтся, Π² настоящСС врСмя Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ derive (Deserialize). ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ структуру с частными полями.

Подан Π΄Ρ€ΡƒΠ³ΠΎΠΉ, # 47312, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ доступ ΠΊ бСзымянному полю структуры ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ self.0 ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ трСбования ΠΊ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρƒ Ρ‚ΠΎΠΊΠ΅Π½Π° . Ρ‡Π΅ΠΌ доступ ΠΊ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ полю структуры, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ self.x .

47311 ΠΈ # 47312 зафиксированы Π² # 48082 ΠΈ # 48083 соотвСтствСнно.

Π£ мСня Π΅ΡΡ‚ΡŒ Π΄Π²Π° Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹Ρ… PR, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΎΠ±Π·ΠΎΡ€Π° / коммСнтария.

ΠŸΠΎΡ…ΠΎΠΆΠ΅, https://github.com/rust-lang/rust/pull/41029 Π³ΠΎΡ‚ΠΎΠ²?

Π­Ρ‚ΠΎΡ‚ PR Π±Ρ‹Π» Π·Π°Π±Ρ€ΠΎΡˆΠ΅Π½, Π½ΠΎ Π²ΠΎΠ·Ρ€ΠΎΠΆΠ΄Π΅Π½ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² # 48465. Π’ настоящСС врСмя ΠΆΠ΄Π΅ΠΌ Π½Π° ΠšΡ€Π°Ρ‚Π΅Ρ€Π΅.

@petrochenkov @nrc

Глядя Π½Π° syntax::ext::expand , каТСтся, Ρ‡Ρ‚ΠΎ proc_macro_attribute s Π² настоящСС врСмя Π½Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… контСкстах (Π½Π΅ ΠΈΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ):

  • Π½Π° Π±Π»ΠΎΠΊΠ°Ρ… ( fold_block() - Π½Π΅Ρ‚)
  • ΠΏΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌ / выраТСниям (# 41475, # 43988)
  • Π²Π½ΡƒΡ‚Ρ€ΠΈ extern {} Π±Π»ΠΎΠΊΠΎΠ² (# 48747)

RFC 1566 Π½Π΅ пСрСчисляСт ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΡƒΠ·Π»ΠΎΠ² AST, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ макросы Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², прСдполагая, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ практичСски ΠΊΠΎ всСму. Но это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΌΠ΅ΡˆΠ½Ρ‹ΠΌ, поэтому ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ, Π° Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚, ΠΈ Π³Π΄Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹, Π½ΠΎ Π² настоящСС врСмя ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ (# 43988)

@abonander Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ макроса proc ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚, ΠΈ Π½ΠΈΠ³Π΄Π΅ большС, Ρ‡Ρ‚ΠΎ, я Π΄ΡƒΠΌΠ°ΡŽ, ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ всС Π²Ρ‹ΡˆΠ΅ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½ΠΎΠ΅ (хотя Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹, ΠΈ Ссли ΠΌΡ‹ стабилизируСм макросы proc, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ остороТны, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ использованиС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎ для Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²).

@nrc Π΅ΡΡ‚ΡŒ Π³Π΄Π΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ, Π³Π΄Π΅ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ эти мСстополоТСния, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ссылка Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Ρ‹ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ элСмСнту . Однако я ΠΏΠΎΡ‡Ρ‚ΠΈ ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ lint Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊ Π±Π»ΠΎΠΊΠ°ΠΌ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌ.

@nrc Π΅ΡΡ‚ΡŒ Π³Π΄Π΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ, Π³Π΄Π΅ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ эти мСстополоТСния, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ссылка Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Ρ‹ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ элСмСнту. Однако я ΠΏΠΎΡ‡Ρ‚ΠΈ ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ lint Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊ Π±Π»ΠΎΠΊΠ°ΠΌ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌ.

НСт afaik - Π΅ΡΡ‚ΡŒ принятый RFC ΠΈ Ρ„Π»Π°Π³ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π² любом Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, Π½ΠΎ я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ стабилизировали Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ Π±Π»ΠΎΠΊΠΈ. По ссылкС Π½Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Ρ….

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°:

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ (proc-) (issue # 34079).

БСйчас Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ ΠΏΡ€ΠΎΠΊ-макросы WRT. Мой PR просто Π½Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ для макросов Macros 2.0, поэтому ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° всС Π΅Ρ‰Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Π° (хотя, скорСС всСго, это просто новая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°).

@rfcbot fcp слияниС

Π― Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ подмноТСство макросов 2.0 story Π² Π²ΠΈΠ΄Π΅ макросов 1.2 для выпуска Rust 1.28. Rust 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

Π­Ρ‚ΠΎ Π²Π²ΠΎΠ΄ΠΈΡ‚ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ пространство ΠΈΠΌΠ΅Π½ Π² Rust (Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ / Ρ‚ΠΈΠΏΡƒ
пространства ΠΈΠΌΠ΅Π½), пространство ΠΈΠΌΠ΅Π½ макроса. Атрибуты, ΠΌΠ°ΠΊΡ€ΠΎ_ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅
всС макросы находятся Π² пространствС ΠΈΠΌΠ΅Π½ maro.

ΠžΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ систСмы состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ одноэлСмСнтная ΠΏΡƒΡ‚ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΠΌΠ°ΠΊΡ€ΠΎΡΡ‹ .
НапримСр, #[foo::bar] ΠΈΠ»ΠΈ ::bar::baz!() Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Ρ‹. Π­Ρ‚ΠΎΡ‚
ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ снято Π² ΠΎΠ΄ΠΈΠ½ прСкрасный дСнь, Π½ΠΎ это Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ консСрвативный ΠΏΡƒΡ‚ΡŒ ΠΊ
Π½Π°Ρ‡Π½Π΅ΠΌ с.

Π“Π΄Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅?

Атрибуты ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ Π½Π΅ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΌΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Ρ‹ .
"items" здСсь Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠ°ΠΊ элСмСнты Ρ‚Ρ€Π΅ΠΉΡ‚ΠΎΠ², ΠΈΠΌΠΏ-ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Ρ‹ ΠΈ внСшний ΠΌΠΎΠ΄ΡƒΠ»ΡŒ.
ΠŸΡ€Π΅Π΄ΠΌΠ΅Ρ‚Ρ‹. Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ модуля ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΈΠ·-Π·Π° hygeine ΠΈ
развСтвлСния Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠžΡΡ‚Π°Π»ΠΎΡΡŒ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ ΠΈ ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это Π½Π°
Поздняя Π΄Π°Ρ‚Π°.

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΌΠΈ. Π­Ρ‚ΠΎ
Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈΠ·-Π·Π° Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ нСобходимости соблюдСния Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ экспрСссии (ΠΊΠ°ΠΊ
Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ уровня ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π°). Π­Ρ‚ΠΎ оставлСно для стабилизации Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅ΠΌ этапС.

НаконСц, Π²Π½ΡƒΡ‚Ρ€ΠΈ макроса Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²

НапримСр, #[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 {
    // ...
}

А ΠΊΠ°ΠΊ насчСт Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹?

Π’Ρ‹ΡˆΠ΅ Π±Ρ‹Π»ΠΎ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ настраиваСмыС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈ макросы ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²
контСксты элСмСнтов , Π² частности, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ созданиС Π½ΠΎΠ²Ρ‹Ρ… ΡƒΠ·Π»ΠΎΠ² AST, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ элСмСнтами. Π­Ρ‚ΠΎΡ‚
ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ Π³ΠΈΠ³ΠΈΠ΅Π½Π΅ создания Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта AST
ΡƒΠ·Π»Ρ‹.

Новинки Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ​​ТС Π³ΠΈΠ³ΠΈΠ΅Π½Ρƒ, ΠΊΠ°ΠΊ ΠΈ macro_rules! сСгодня. Они Π±ΡƒΠ΄ΡƒΡ‚
Π½Π΅ Π±Ρ‹Ρ‚ΡŒ Π³ΠΈΠ³ΠΈΠ΅Π½ΠΈΡ‡Π½Ρ‹ΠΌ. НовыС элСмСнты, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ Π² AST, Π²ΠΎΠΉΠ΄ΡƒΡ‚ Π² Ρ‚ΠΎ ΠΆΠ΅ пространство ΠΈΠΌΠ΅Π½, Ρ‡Ρ‚ΠΎ ΠΈ
Π΄Ρ€ΡƒΠ³ΠΈΠ΅ элСмСнты Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅.

API 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 { ... }

Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± этом API ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅ ΠΈΠ»ΠΈ Π² ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π΅. PR

БтратСгия тСстирования

БистСмы макросов 1.1 ΠΈ макросов 2.0 ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π°Π»ΠΈΡΡŒ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ Π½Π° всСх этапах Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.
экосистСма ΡƒΠΆΠ΅ довольно Π΄Π°Π²Π½ΠΎ. ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎ всС это ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅
всСстороннС протСстирован Π² выпускС 0.3 ящика proc-macro2 ΠΊΠ°ΠΊ
Π° Ρ‚Π°ΠΊΠΆΠ΅ ящик syn . Π’ Ρ…ΠΎΠ΄Π΅ тСстирования Π±Ρ‹Π» ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ ряд ошибок.
ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΈ исправлСны, ΠΈ тСкущая систСма каТСтся достаточно ΠΏΡ€ΠΎΡ‡Π½ΠΎΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ
стабилизированный. (Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΌ Π½Π΅Ρ‚ ошибок!)

Π§Π»Π΅Π½ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ @alexcrichton ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ это. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ:

  • [x] @Kimundi
  • [] @SimonSapin
  • [x] @alexcrichton
  • [x] @aturon
  • [x] @cramertj
  • [x] @dtolnay
  • [x] @eddyb
  • [x] @joshtriplett
  • [x] @nikomatsakis
  • [x] @nrc
  • [] @pnkfelix
  • [x] @scottmcm
  • [x] @sfackler
  • [x] @withoutboats

Π’ настоящСС врСмя Π½Π΅ пСрСчислСно Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ€Π΅Ρ†Π΅Π½Π·Π΅Π½Ρ‚ΠΎΠ² ΠΎΠ΄ΠΎΠ±Ρ€ΠΈΡ‚ (ΠΈ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π²ΠΎΠ·Ρ€Π°ΠΆΠ°Π΅Ρ‚), наступит послСдний ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ для ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π². Если Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, которая Π½Π΅ поднималась Π½ΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ этапС этого процСсса, сообщитС ΠΎΠ± этом!

Π‘ΠΌ. Π­Ρ‚ΠΎΡ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π΄Π°Π²Π°Ρ‚ΡŒ ΠΌΠ½Π΅ Ρ‡Π»Π΅Π½Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Π΅ Ρ‚Π΅Π³Π°ΠΌΠΈ.

cc @ rust-lang / compiler, я знаю, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ‚ΠΎΠΆΠ΅ ΠΎΡ‡Π΅Π½ΡŒ заинтСрСсованы Π² этом, ΠΈ, поТалуйста, Π½Π΅ ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ Π²Ρ‹ΡΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ возраТСния. Если Ρƒ вас Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, я Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³Ρƒ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для вас

ΠŸΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ прСдоставлСнный API, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ для стабилизации, макросы proc ΠΌΠΎΠ³ΡƒΡ‚ Π»Π΅Π³ΠΊΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всСвозмоТныС Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ ΠΈΠ»ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΈΠ· Π²Π²ΠΎΠ΄Π° Π² Π²Ρ‹Π²ΠΎΠ΄, Π½ΠΎ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² Π΄Π°ΠΆΠ΅ Π½Π° повСрхностном ΡƒΡ€ΠΎΠ²Π½Π΅. НапримСр, Literal Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Eq ΠΈΠ»ΠΈ PartialEq . Какая-Ρ‚ΠΎ конкрСтная ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° для этого? (И Π΄Π°ΠΆΠ΅ это ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ Π±Ρ‹ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈ постоянными значСниями, Π° Π½Π΅ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² ΠΊΠΎΠ΄Π΅.)

Π§Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ макрос proc для интроспСкции Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ макроса proc, учитывая TokenStream ? Или, Ссли Π½Π° Ρ‚ΠΎ пошло, ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ Ρ†Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ? Π­Ρ‚ΠΎ просто Π΅Ρ‰Π΅ Π½Π΅ поддСрТиваСтся? Π•ΡΡ‚ΡŒ Π»ΠΈ ΠΏΠ»Π°Π½Ρ‹ ΠΏΠΎ Π΅Π³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ?

(Π― Π½Π΅ ΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ подмноТСства; я просто Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ это подмноТСство ΠΈ Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.)

@alexcrichton Новинки Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ​​ТС Π³ΠΈΠ³ΠΈΠ΅Π½Ρƒ, ΠΊΠ°ΠΊ ΠΈ macro_rules! Π΄Π΅Π»Π°Π΅Ρ‚ сСгодня. Они Π±ΡƒΠ΄ΡƒΡ‚
Π½Π΅ Π±Ρ‹Ρ‚ΡŒ Π³ΠΈΠ³ΠΈΠ΅Π½ΠΈΡ‡Π½Ρ‹ΠΌ. НовыС элСмСнты, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ Π² AST, Π²ΠΎΠΉΠ΄ΡƒΡ‚ Π² Ρ‚ΠΎ ΠΆΠ΅ пространство ΠΈΠΌΠ΅Π½, Ρ‡Ρ‚ΠΎ ΠΈ
Π΄Ρ€ΡƒΠ³ΠΈΠ΅ элСмСнты Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅.

Π― Π½Π΅ являюсь Ρ‡Π»Π΅Π½ΠΎΠΌ основной ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Rust, ΠΈ я Π½Π΅ ΠΈΠ·ΡƒΡ‡Π°Π» ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ всС ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ обсуТдСния, Π½ΠΎ для мСня это Π·Π²ΡƒΡ‡ΠΈΡ‚ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠ»ΠΎΡ…ΠΎ. Π§Ρ‚ΠΎ, Ссли макрос Ρ…ΠΎΡ‡Π΅Ρ‚ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ элСмСнты, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ макрос?

ВмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹, я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½ΡƒΡŽ 100% Π³ΠΈΠ³ΠΈΠ΅Π½Ρƒ, Π½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ макросам Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ явно ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ соблюдСния Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹ для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

@joshtriplett Π²Ρ‹ Π±Ρ‹ использовали Display impl для Literal.

@joshtriplett Π΄Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ @dtolnay упомянул, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Display ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ построСн ящик, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ literalext . Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, API Π·Π°Π΄ΡƒΠΌΠ°Π½ ΠΊΠ°ΠΊ Β«ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΒ», Π° Π½Π΅ ΠΊΠ°ΠΊ пСрвоклассный API, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΅ΡΡ‚ΡŒ всС Π½Π°Π²ΠΎΡ€ΠΎΡ‚Ρ‹. Π‘ΠΊΠΎΡ€Π΅Π΅ всСго, ΠΎΠ½ΠΈ появятся ΠΏΠΎΠ·ΠΆΠ΅!

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ этот Ρ€Π°ΡƒΠ½Π΄ стабилизации Π±ΡƒΠ΄Π΅Ρ‚ «максимально ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΒ» Π² Ρ‚ΠΎΠΌ смыслС, Ρ‡Ρ‚ΠΎ ΠΎΠ½ обСспСчиваСт наимСньший объСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ для покрытия всСх Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² использования (Ρ‚Π°ΠΊΠΆΠ΅ извСстный ΠΊΠ°ΠΊ Display для Literal ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ большС для Π΅Π³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ. ).

@Pauan, это Π½Π΅ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ, Π΄Π°, Π½ΠΎ это Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ macro_rules! ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π»Π΅Ρ‚ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ€Π°Π·Π½Ρ‹Ρ… контСкстах. ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ здСсь Π³ΠΈΠ³ΠΈΠ΅Π½Ρƒ ΠΈ Π»ΡƒΡ‡ΡˆΠ΅Π΅ Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅, Π½ΠΎ Π΅Ρ‰Π΅ Π½Π΅ совсСм Π³ΠΎΡ‚ΠΎΠ²Ρ‹. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Span::call_site() - это ΡΡ‚Π΅Ρ€ΠΆΠ΅Π½ΡŒ здСсь, Π³Π΄Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΅Π³ΠΎ, Π²Ρ‹ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚Π΅ «отсутствиС Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹Β». Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ² ΠΌΡ‹ стабилизируСм большС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ².

К соТалСнию, Π΄ΠΎ "ΠΏΠΎΠ»Π½ΠΎΠΉ 100% Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹" Π΅Ρ‰Π΅ Π΄Π°Π»Π΅ΠΊΠΎ, ΠΈ Ρ†Π΅Π»ΡŒ этого прСдлоТСния - ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠ΅ для Rust 2018.

@alexcrichton Π’Π°ΠΊ Π΅ΡΡ‚ΡŒ Π»ΠΈ ΠΏΠ»Π°Π½ ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это сСйчас с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ гигиСничСской Π΄Ρ‹Ρ€Ρ‹, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ°Ρ€Ρƒ эпох / эпох / выпусков ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ эту Π³ΠΈΠ³ΠΈΠ΅Π½ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π΄Ρ‹Ρ€Ρƒ?

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Span::call_site() сущСствуСт, Π΅ΡΡ‚ΡŒ Π»ΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΡƒΡŽ Π³ΠΈΠ³ΠΈΠ΅Π½Ρƒ прямо сСйчас? Π­Ρ‚ΠΎ Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠ° Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ силы / Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ Π΅ΡΡ‚ΡŒ тСорСтичСскиС / сСмантичСскиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ всС Π΅Ρ‰Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² RFC?

@Pauan, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ, Π½Π΅Ρ‚ настоящСй "Π΄Ρ‹Ρ€Ρ‹" Π² Ρ‚ΠΎΠΌ смыслС, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° ΡƒΠΆΠ΅ сущСствуСт сСгодня. Π­Ρ‚ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ такая ΠΆΠ΅ гигиСничСская история с macro_rules! ΠΈ custom derive. Π­Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΏΠΎ сути, являСтся ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ΠΌ этого, Π° Π½Π΅ Π²Π²ΠΎΠ΄ΠΈΡ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ.

Учитывая "ΠΈΠ΄Π΅Π°Π»ΡŒΠ½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹", ΠΌΡ‹ всСгда Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Ρ„ΠΎΡ€ΠΌΡ‹. Π’ настоящСС врСмя этот ΠΎΡ‚ΠΊΠ°Π· составляСт Span::call_site() (фактичСски). Волько стабилизируя это, ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ стабилизируСм ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΎΡ‚ΠΊΠ°Π·Π° для Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹. Π‘ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΌΡ‹ стабилизируСм большС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ нСобходимости ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Ρ‹ Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π³ΠΈΠ³ΠΈΠ΅Π½ΠΈΡ‡Π½Ρ‹ΠΌΠΈ.

Бтабилизация Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ дальшС. Π•ΡΡ‚ΡŒ (AFAIK) Π½Π΅Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹Π΅ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ вопросы, это Π½Π΅ вопрос Π»ΡŽΠ΄ΡΠΊΠΈΡ… рСсурсов.

@dtolnay А, понятно. Π˜Ρ‚Π°ΠΊ, Π²Ρ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ тСкст, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π΅Π³ΠΎ? Π― полагаю, Ρ‡Ρ‚ΠΎ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

cc @ rust-lang / compiler, я знаю, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ‚ΠΎΠΆΠ΅ ΠΎΡ‡Π΅Π½ΡŒ заинтСрСсованы Π² этом, ΠΈ, поТалуйста, Π½Π΅ ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ Π²Ρ‹ΡΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ возраТСния. Если Ρƒ вас Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, я Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³Ρƒ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для вас

Π£ мСня всС Π΅Ρ‰Π΅ Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ΅-Ρ‡Ρ‚ΠΎ для ΠΎΠ±Π·ΠΎΡ€Π° ΠΈ PR с ΠΏΠ°Ρ€ΠΎΡ‡ΠΊΠΎΠΉ настроСк API-интСрфСйса proc-macro.

Π­Ρ‚ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ такая ΠΆΠ΅ история Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹ с macro_rules! ΠΈ ΠΎΠ±Ρ‹Ρ‡Π°ΠΉ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½ΠΎ я Π΄ΡƒΠΌΠ°Π», Ρ‡Ρ‚ΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· Ρ†Π΅Π»Π΅ΠΉ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π»Π°ΡΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΡƒΡŽ макросистСму, поэтому ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π½Π° ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ (ΡΠ»ΠΎΠΌΠ°Π½Π½ΡƒΡŽ ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΡƒΡŽ) систСму ΠΌΠ½Π΅ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ.

Учитывая "ΠΈΠ΄Π΅Π°Π»ΡŒΠ½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹", ΠΌΡ‹ всСгда Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Ρ„ΠΎΡ€ΠΌΡ‹.

Π‘ΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π²Π΅Ρ€Π½ΠΎ, Π½ΠΎ я Ρ…ΠΎΡ‡Ρƒ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Span::call_site() для Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹ (ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ macro_rules! ) ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ, сдСлав Π΅Π³ΠΎ Π³ΠΈΠ³ΠΈΠ΅Π½ΠΈΡ‡Π½Ρ‹ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ доступ ΠΊΠ°ΠΊ ΠΊ Π³ΠΈΠ³ΠΈΠ΅Π½Π΅, Ρ‚Π°ΠΊ ΠΈ отсутствиС Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹. Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Ссли ΠΎΠ½ стабилизируСтся Π·Π° счСт отсутствия Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹, Ρ‚ΠΎ ΠΎΠ½ застрСваСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π° счСт отсутствия Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹.

Π‘ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΌΡ‹ стабилизируСм большС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ нСобходимости ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Ρ‹ Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π³ΠΈΠ³ΠΈΠ΅Π½ΠΈΡ‡Π½Ρ‹ΠΌΠΈ.

Π­Ρ‚ΠΎ Π·Π²ΡƒΡ‡ΠΈΡ‚ ΠΊΠ°ΠΊ довольно Ρ€Π°Π·Π΄Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΠΉ (ΠΈ ΡΠ±ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ с Ρ‚ΠΎΠ»ΠΊΡƒ) Π»Π΅ΠΉΠΊΠΎΠΏΠ»Π°ΡΡ‚Ρ‹Ρ€ΡŒ: макросы proc Π±ΡƒΠ΄ΡƒΡ‚ Π³ΠΈΠ³ΠΈΠ΅Π½ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ситуаций (Π½ΠΎ Π½Π΅ для ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠ²), Π½ΠΎ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π³ΠΈΠ³ΠΈΠ΅Π½Ρƒ для ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠ². Π― ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ понимаю?

Π•ΡΡ‚ΡŒ (AFAIK) Π½Π΅Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹Π΅ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ вопросы, это Π½Π΅ вопрос Π»ΡŽΠ΄ΡΠΊΠΈΡ… рСсурсов.

Π›Π°Π΄Π½ΠΎ, это справСдливо. Понимаю стрСмлСниС ΠΊ цСлСсообразности ΠΈ ΠΏΡ€Π°Π³ΠΌΠ°Ρ‚ΠΈΠ·ΠΌΡƒ. Π”ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΏΠ»Π°Π½ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Π²Π΅Ρ€Π΄ΡƒΡŽ Π³ΠΈΠ³ΠΈΠ΅Π½Ρƒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Π±ΠΎΠ»Π΅Π΅ позднюю эпоху / эпоху / ΠΈΠ·Π΄Π°Π½ΠΈΠ΅, Ρ‚ΠΎΠ³Π΄Π° я Π² порядкС с Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠ»ΠΎΡ…ΠΎΠΉ Π³ΠΈΠ³ΠΈΠ΅Π½ΠΎΠΉ. Π― просто Π½Π΅ Ρ…ΠΎΡ‡Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ стабилизировали Ρ‚ΠΎ, ΠΎ Ρ‡Π΅ΠΌ ΠΏΠΎΠ·ΠΆΠ΅ ΠΏΠΎΠΆΠ°Π»Π΅Π΅ΠΌ.

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ смыслС, это ΡƒΠΆΠ΅ «гигиСничСский ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽΒ» это просто , Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠΎΠΊΠ° Π½Π΅ поддСрТиваСтся. Span::call_site - это ΠΎΡ‚ΠΊΠ°Π·. :)

@Pauan Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ сказал @alexcrichton :

Для построСния ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° трСбуСтся Span , содСрТащий Π³ΠΈΠ³ΠΈΠ΅Π½ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. (Π‘ΠΌ. Term::new )

Π’ Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ мноТСство Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… способов построСния Span s, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹. Но ΠΏΠΎΠΊΠ° ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Span::call_site ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ дСйствия Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ стабилизации всСй систСмы Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹ сразу, сохраняя ΠΏΡ€ΠΈ этом Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹ ΠΏΠΎΠ·ΠΆΠ΅. Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ это довольно Ρ…ΠΈΡ‚Ρ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ!

@rpjohnst Π—Π½Π°Ρ‡ΠΈΡ‚, Π²Ρ‹ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ СдинствСнный способ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ элСмСнты ΠΈΠ· макроса proc - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Span::call_site ?

Если это Ρ‚Π°ΠΊ, Ρ‚ΠΎ это Π·Π²ΡƒΡ‡ΠΈΡ‚ идСально: Π² этом случаС Π³ΠΈΠ³ΠΈΠ΅Π½Π° Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ​​в Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ чистым ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ совмСстимым способом.

@lfairy Аааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааа Π΄Π΅ΠΉΡΡ‚Π²Π°ΡŒΠ°Π°Π°Π°Π°Π°Π°Π°Π°Π°Π°Π°Ρ€Π΅Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Span::call_site , я Π΄ΡƒΠΌΠ°Π», Ρ‡Ρ‚ΠΎ это нСгигиСничная ΠΎΠ±Π»Π°ΡΡ‚ΡŒ дСйствия ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Бпасибо Π²Π°ΠΌ Π·Π° Ρ€Π°Π·ΡŠΡΡΠ½Π΅Π½ΠΈΠ΅! Π’Ρ‹ ΠΏΡ€Π°Π²Ρ‹, это ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΈΡ‚Ρ€Ρ‹ΠΉ Ρ‚Ρ€ΡŽΠΊ.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρƒ мСня большС Π½Π΅Ρ‚ Π²ΠΎΠ·Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

@alexcrichton

Атрибуты, ΠΌΠ°ΠΊΡ€ΠΎ_ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅
всС макросы находятся Π² пространствС ΠΈΠΌΠ΅Π½ maro.

Π’ послСдний Ρ€Π°Π· я провСрял с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ #[feature(proc_macro)] , Ρƒ Π½Π΅Π³ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ нСсовмСстимоС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ для ящика derive-error-chain, ΠΊΠ°ΠΊ описано здСсь. Из ΠΏΡ€ΠΎΡ†ΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ заявлСния ΠΏΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈ Π² макросах 1.2. Π­Ρ‚ΠΎ Π²Π΅Ρ€Π½ΠΎ?

@Arnavion Π‘ΠΎΠΆΠ΅ #[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 ΠΈ Ρƒ нас Π΅ΡΡ‚ΡŒ мСсто для добавлСния ΠΏΠΎΠ·ΠΆΠ΅ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.

: bell: БСйчас наступаСт послСдний ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ для ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² , ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΎΠ±Π·ΠΎΡ€Π΅ Π²Ρ‹ΡˆΠ΅ . : Π·Π²ΠΎΠ½ΠΎΠΊ:

@alexcrichton
!Send ΠΈ !Sync impls для Ρ‚ΠΈΠΏΠΎΠ² API макросов proc Π½Π΅ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ явно, Π½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ.
Для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… структур (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Op ) ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΡ‹ΠΉ impl отличаСтся ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² 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 success, строго ΠΊΠΎΡ€ΠΎΡ‡Π΅, Ρ‡Π΅ΠΌ внутрСнняя ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости.
Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, ΠΊΠ°ΠΊ происходит Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ proc_macro , ΠΈ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Term являСтся Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ для ΠΏΠΎΡ‚ΠΎΠΊΠ°, сущСствуСт ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»ΠΎ способов ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Term , ΠΈ я ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ thread_local! Π±Ρ‹Π» фактичСски СдинствСнным.

Но Box::leak Ρ‚ΠΎΠΆΠ΅ сущСствуСт! Он ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ нСстабилСн, Π½ΠΎ сСгодня Box::leak(Box::new(term)).as_str() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ &'static str . Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, Π΅ΡΡ‚ΡŒ Π»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ абстракции, Π½Π°Ρ€ΡƒΡˆΠ΅Π½Π½Ρ‹Π΅ Box::leak (cc @RalfJung)

OTOH, это слоТно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Term Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π»Π°Π΄Π΅Ρ‚ΡŒ строковыми Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это Copy .
Если ΠΌΡ‹ ΡƒΠ΄Π°Π»ΠΈΠΌ Copy Π½Π° Term , ΠΌΡ‹ смоТСм ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΌ Π»Π΅Π½ΠΈΠ²ΠΎΠ³ΠΎ 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! ? rustc Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΌΠ½Π΅ ,

@mjbshaw ΠΎΠΎΠΎΡ‡Π΅Π½ΡŒ Π·Π°Π±Π°Π²Π½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ: ΠΎΠ½Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² proc_macro::quote .
rustc_metadata Π΄Π΅Π»Π°Π΅Ρ‚ Π²ΠΈΠ΄, Ρ‡Ρ‚ΠΎ любой ящик с ΠΈΠΌΠ΅Π½Π΅ΠΌ proc_macro содСрТит Π² сСбС ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ макрос с ΠΈΠΌΠ΅Π½Π΅ΠΌ quote , Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ рСализация взята ΠΈΠ· proc_macro rustc_metadata ссылки ΠΏΡ€ΠΎΡ‚ΠΈΠ².

Π£ мСня всС Π΅Ρ‰Π΅ Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ΅-Ρ‡Ρ‚ΠΎ для ΠΎΠ±Π·ΠΎΡ€Π° ΠΈ PR с ΠΏΠ°Ρ€ΠΎΡ‡ΠΊΠΎΠΉ настроСк API-интСрфСйса proc-macro.

ΠžΠ±Π·ΠΎΡ€Π½Ρ‹ΠΉ PR: https://github.com/rust-lang/rust/pull/50473

Запрос Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для API 1.2: Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ для ΡƒΠ³Π»ΠΎΠ²Ρ‹Ρ… скобок ( < / > ), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠ°ΠΊ <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>);

Π― Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΠ» OP, Π½ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ каТСтся двумя Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌΠΈ ошибками showstopper, связанными с Π³ΠΈΠ³ΠΈΠ΅Π½ΠΎΠΉ, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ:

Для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ слСдит Π·Π° этой Π²Π΅Ρ‚ΠΊΠΎΠΉ, API, вСроятно, Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ ΠΈΠ· исходного коммСнтария 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

Один нСбольшой запрос API, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я Π±Ρ‹ сдСлал (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² # 50473 - @petrochenkov), - это ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ способ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ Π² TokenStream. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ:

impl Extend<TokenTree> for TokenStream

Π― ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ это ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ Π±Ρ‹ ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ quote::Tokens (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² основном прСдставляСт собой Vec<TokenTree> ) ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ распространСниС Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π² экосистСмС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ всС ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ Β«Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹Β», отслСТиваСмыС Π² https : //github.com/dtolnay/syn/issues/205.

+1 ΠΊ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡŽ @ dtolnay Π²Ρ‹ΡˆΠ΅.

ПослСдний ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² с ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΎ слиянии Π² соотвСтствии с ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌ Π²Ρ‹ΡˆΠ΅ ΠΎΠ±Π·ΠΎΡ€ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ .

Π£ мСня Π΄Π²Π° вопроса:

  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 макрос quote! Π² ящикС proc_macro Π½Π΅ стабилизируСтся ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ этого FCP, Π½ΠΎ ящик quote Π½Π° crates.io основан Π½Π° ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΠΎΠΌ здСсь API. Π’Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Π» @abonander , макросы Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ с #[proc_macro_attribute] Π° #[proc_macro] Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ для макросов foo!() -style.

Π Π°Π·Π²Π΅ #[proc_macro_attribute] слСдуСт Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ #[proc_attribute_macro] ΠΈΠ»ΠΈ #[attribute_proc_macro] ?

@Zoxc Π£ нас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ #[proc_macro_derive] stable, поэтому Π±Ρ‹Π»ΠΎ Π±Ρ‹ странно Π½Π΅ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ этому для макросов Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ².

МоТСм Π»ΠΈ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ PartialEq<char> ΠΈ PartialEq<Punct> для Punct (Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ident PartialEq )? ΠŸΠΎΡ…ΠΎΠΆΠ΅, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ это Π±ΡƒΠ΄Π΅Ρ‚ довольно бСзопасно. Π― счастлив Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ PR, Π½ΠΎ Π½Π΅ Ρ…ΠΎΡ‡Ρƒ, Ссли идСя Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚.

@mjbshaw Π‘ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ PartialEq<Punct> Ρ‚Π°ΠΊΠΆΠ΅ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠΈ? PartialEq<char> Π²Ρ€ΠΎΠ΄Π΅ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, OTOH.

@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 поэтому ΠΌΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ с самого ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ° ΠΈ ΠΌΡ‹ смоТСм ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚Ρ‚ΡƒΠ΄Π°, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ станСт ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ.

Π― ΠΏΡ€ΠΎΠ²Π΅Π» Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ сортировку всСх ошибок, связанных с макросами 1.2 . Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ошибок ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° Β«ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Π΅ ошибки» ΠΈΠ»ΠΈ «ошибки, связанныС со всСм Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌΒ». Π’ настоящСС врСмя ошибки, связанныС с Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌ, Π²Π»ΠΈΡΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ макросы 1.2 Π½Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для измСнСния Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ). ΠžΡΡ‚Π°Π²ΡˆΠ°ΡΡΡ ошибка, Π½Π΅ связанная с Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌ (ΠΎΠ½Π° ΠΆΠ΅ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Π°Ρ) - это https://github.com/rust-lang/rust/issues/50050 , для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρƒ @petrochenkov Π΅ΡΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ .

Класс Gnome сломался с измСнСниями Π² proc_macro2 / syn / quote, Π° Ρ‚Π°ΠΊΠΆΠ΅ с Π²ΠΎΡ€ΠΎΡ‚Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΈΠ· макросов proc. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ это исправлСно.

Π—Π° ΠΊΠ°ΠΊΠΈΠΌΠΈ Π²Π΅Ρ‰Π°ΠΌΠΈ я Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π² курсС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² этой малСнькой экосистСмС?

@federicomenquintero Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ рСгулярноС Π·Π°Π΄Π°Π½ΠΈΠ΅ CI (Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎ, СТСнСдСльно, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ

@SimonSapin, спасибо, это Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ идСя. ΠœΡ‹ закрСпляСм вСрсии этих ящиков Π² нашСм Cargo.toml, Π½ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€ΠΈΡˆΠ»ΠΎ врСмя ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€Π° вСрсий ΠΈ просто ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Cargo Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ послСднюю. Π­Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ способ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это?

@federicomenquintero Π­Ρ‚ΠΎ всС большС Π½Π΅ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅, поэтому, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ это обсуТдСниС, сдСлайтС это Π³Π΄Π΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ мСстС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² 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 Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ, Π½ΠΎ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. Насколько я понимаю, стабилизация макросов proc ΠΈΠ·Π±Π°Π²ΠΈΡ‚ ΠΎΡ‚ нСобходимости ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π»Π°Π³ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ?

Π”Ρ€ΡƒΠ³ΠΎΠ΅ Π΄Π΅Π»ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ #[my_attribute] ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ запуск #[other_attribute] . Π§Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΡ€ΡƒΡ‚ΠΎ, Ссли Π±Ρ‹ Π²ΠΎ «внСшнСм» Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π΅ я ΠΌΠΎΠ³ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ #[derive(Foo)] .

Π§Ρ‚ΠΎ насчСт коммСнтария ?

МоТно Π»ΠΈ / ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ эту ΠΏΠ°Π½ΠΈΠΊΡƒ нСявным созданиСм Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ «сСанса»? Или, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ API (с ΠΏΡƒΡ‚Π΅ΠΌ ΠΊ стабилизации) для Π΅Π³ΠΎ создания?

Π”ΡƒΠΌΠ°ΡŽ, Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ провСсти Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ сСссию. НаписаниС ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ³ΠΎ тСста для ящиков proc-macro практичСски Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ»ΠΈ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, это Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ TokenStream::from_str , Π½ΠΎ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ сСанса.

@alexcrichton

Π― ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Π» Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ сортировку всСх ошибок, связанных с макросами 1.2. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ошибок ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° Β«ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Π΅ ошибки» ΠΈΠ»ΠΈ «ошибки, связанныС со всСм Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌΒ».

Π― Π±Ρ‹ Ρ…ΠΎΡ‚Π΅Π» ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ https://github.com/rust-lang/rust/issues/50504 Π΄ΠΎ статуса Β«ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹ΠΉΒ» - описанная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° модуля являСтся лишь ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠΌ Π±ΠΎΠ»Π΅Π΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ - ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ для макросов proc Π½Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ зарСгистрирован. Π― Π½Π΅ знаю, ΠΊΠ°ΠΊΠΈΠ΅ Π΅Ρ‰Π΅ послСдствия это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ.
Π•ΡΡ‚ΡŒ PR, ΡƒΡΡ‚Ρ€Π°Π½ΡΡŽΡ‰ΠΈΠΉ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ (https://github.com/rust-lang/rust/pull/51952), Π½ΠΎ Π΅ΡΡ‚ΡŒ отклонСния ΠΎΡ‚ исправлСния, ΠΈ я Π΅Ρ‰Π΅ Π½Π΅ просматривал ΠΈΡ….

Π― размСстил PR для стабилизации большСго количСства ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов Π½Π° https://github.com/rust-lang/rust/pull/52081

@petrochenkov ΠΌΠ½Π΅

Π― Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π» сообщСниС ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ отслСТивания ΠΈΠΌΠ΅Π½ макросов ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ… с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ proc_macro_derive child ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ с систСмой имСнования. Π•ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, связанная с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ proc_macro_derive child Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ с ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, Π½ΠΎ, ΠΏΠΎ-Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡƒ, Π±ΠΎΠ»Π΅Π΅ умСстна для обсуТдСния здСсь. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡƒΡ‚ΠΈ Π² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°Ρ… Π² настоящСС врСмя Π½Π΅ находятся Π½Π° ΠΏΡƒΡ‚ΠΈ ΠΊ стабилизации, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ #[derive(foo::Parent)] ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ #[foo::Child] , Π½ΠΎ макрос Π΄Π΅Ρ€ΠΈΠ²Π°Ρ†ΠΈΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ возмоТности, Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд, для ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ являСтся Π΅Π³ΠΎ собствСнным Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ элСмСнтом, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ поиск ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρƒ мСня Π½Π΅Ρ‚ простого Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, Π½ΠΎ я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π² ΠΏΠΎΠ»Π΅ зрСния Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ взаимозависимых Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²; Π½Π΅Ρ‚ ΠΏΡ€ΠΈΡ‡ΠΈΠ½, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ proc_macro_attribute Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ поиска.

Π― пытался ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ сСгодня, Π½ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ сломалось, Ρ‡Ρ‚ΠΎ, вСроятно, связано с этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. Π’ΠΎ всСх сообщСниях ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Π±Ρ‹Π»ΠΎ сообщСниС: Β«(см. Issue # 38356)Β». Π’ΠΎΡ‚ ΠΊΠ°ΠΊ я сюда ΠΏΠΎΠΏΠ°Π».
Π― Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽ сюда сообщСниС ΠΎΠ± ошибкС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ я ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Π²ΠΎ врСмя компиляции. Π― Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽ свой Cargo.toml.

Π― Π½Π°Ρ…ΠΎΠΆΡƒ это ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠΎΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ привязан ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π½ΠΎΡ‡Π½ΠΎΠΉ вСрсии Rust (rustc 1.29.0-nightly (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 : Бпасибо Π·Π° быстрый ΠΎΡ‚Π²Π΅Ρ‚.
Π― Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΠ» свой Π½ΠΎΡ‡Π½ΠΎΠΉ компилятор Π΄ΠΎ послСднСй вСрсии. Π­Ρ‚ΠΎ устранило ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с proc-macro-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, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ошибкой Π² ​​процСдурном макросС ΠΈΠ»ΠΈ компиляторС, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹

Π§Ρ‚ΠΎ ΠΆ, я Π΄ΡƒΠΌΠ°ΡŽ, ΠΌΠ½Π΅ слСдуСт сначала ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ свой ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ хотя Π±Ρ‹ выглядСл Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΌ :) ΠŸΡ€ΡΠΌΠΎ сСйчас это Π½Π΅ Ρ‚Π°ΠΊ, Π²Ρ‹, рСбята, сильно ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. BRB, ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚Π΅. Если ΠΎΠ½ Π½Π΅ исчСзаСт, я создаю ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ.

@alexcrichton
Π—Π½Π°Π΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹, какая Β«ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Β» примСняСтся ΠΊ Ρ‚ΠΎΠΊΠ΅Π½Π°ΠΌ ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΡ… ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ макрос?
Π― знаю, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ $crate ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΈ cfg Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Ρ‹ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ (плюс двусторонниС ΠΎΠ±Ρ…ΠΎΠ΄Ρ‹ строк Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΡŒ, Π½ΠΎ это ΠΏΠΎΠΏΡ€Π°Π²ΠΈΠΌΠΎ).

ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΈΠ· этого Π½Π΅ происходит с Π½Π΅Π΄Π°Π²Π½ΠΎ стабилизированными ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΌΠΈ макросами, ΠΈ ΠΎΠ½ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ (ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ ошибок).

@alexcrichton, ΠΈΠ·Π²ΠΈΠ½ΠΈΡ‚Π΅, cargo expand ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с этим ящиком. НС ΠΌΠΎΠ³Ρƒ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ, Π½Π° ΠΌΠΎΠ΅ΠΉ сторонС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΈΠ»ΠΈ Π½Π° сторонС компилятора. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ я Π±ΡƒΠ΄Ρƒ Π²ΠΈΠ½ΠΈΡ‚ΡŒ сСбя Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° эта Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Π°.

@petrochenkov Π½Π°

Π― согласСн с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Π°ΡƒΠ΄ΠΈΡ‚ - это Ρ…ΠΎΡ€ΠΎΡˆΠΎ!

ΠœΠΎΠΆΠ΅Ρ‚, я упустил Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠ΅. Но Ρ€Π°Π·Π²Π΅ Π½Π΅Ρ‚ возмоТности Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ ΠΈ Ρ‚. Π”. Из ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π³ΠΎ proc_macro, ΠΈΠ· Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов? (ΠΈΠ»ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ящик, извСстный ΠΈΠ· ящика proc_macro, FWIW)

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΎΠ±Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ , Π½ΠΎ AFAIU Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Ссли ящик Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠ³ΠΎ макроса.

Π―Ρ‰ΠΈΠΊΠΈ @Ekleog proc-macro ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для создания ящиков, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚. Они Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ зависимостями Π²ΠΎ врСмя выполнСния. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ вСсь ящик proc-macro ΠΊΠ°ΠΊ своСго Ρ€ΠΎΠ΄Π° ΠΏΠ»Π°Π³ΠΈΠ½ компилятора, Π° Π½Π΅ Β«ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽΒ» Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ.

Π­Ρ‚ΠΎ особСнно Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ ΠΏΡ€ΠΈ кросс-компиляции: ΠΊΠ°ΠΊ ΠΈ сцСнарии сборки, макросы proc ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ для хост-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, Π° Π½Π΅ для Ρ†Π΅Π»Π΅Π²ΠΎΠΉ.

@SimonSapin Π― согласСн с Π²Π°ΠΌΠΈ, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, прСдоставляСмой ящиком, Π΄Π°ΠΆΠ΅ Ссли это Π½Π΅ ящик proc-macro (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΌΠΎΠ΅ΠΉ ссылкС Π²Ρ‹ΡˆΠ΅ X-derive crate пытаСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ· X crate). ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС это ΠΎΠ·Π½Π°Ρ‡Π°Π»ΠΎ Π±Ρ‹, Ρ‡Ρ‚ΠΎ вСсь ΠΊΠΎΠ΄, сгСнСрированный proc-макросами, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ самодостаточным, Π»ΠΈΠ±ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ прСдполоТСния ΠΎ состоянии сайта Π²Ρ‹Π·ΠΎΠ²Π°.

Π—Π°Ρ‚Π΅ΠΌ я ΠΌΠΎΠ³Ρƒ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ rustc Π΅Ρ‰Π΅ Π½Π΅ Π³ΠΎΡ‚ΠΎΠ² для Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ это Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅ Π±Π΅Π· нСобходимости Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ proc-macro ΠΈΠ· ящиков, Π½Π΅ связанных с proc-macro, Ρ‡Ρ‚ΠΎ, ΠΏΠΎΡ…ΠΎΠΆΠ΅, Π³Π΄Π΅-Ρ‚ΠΎ Π² долгосрочной пСрспСктивС. дороТная ΠΊΠ°Ρ€Ρ‚Π° срока). Но ΠΌΠ½Π΅ интСрСсно, Ссли Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ интСрфСйс, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ TokenStreams Π±ΡƒΠ΄Π΅Ρ‚ стабилизирован, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠΎΠ·ΠΆΠ΅? Π Π°Π·Π²Π΅ Π΅ΠΌΡƒ Π½Π΅ понадобится Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ Ρ‚ΠΈΠΏΠ° Ρ‚ΠΎΠΊΠ΅Π½Π° PathToBeResolvedFromTopOfGeneratingProcMacroCrate ? (Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ критичСским ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ, Ссли Π±Ρ‹ ΠΎΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΏΠΎΠ·ΠΆΠ΅, afaiu)

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ удастся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Π΅Ρ‰ΠΈ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΌΠΈ, Π½ΠΎ это каТСтся довольно Π΄Π°Π»Π΅ΠΊΠΈΠΌ.

А ΠΏΠΎΠΊΠ°, Ссли Π²Ρ‹ ΡΠ²Π»ΡΠ΅Ρ‚Π΅ΡΡŒ Π°Π²Ρ‚ΠΎΡ€ΠΎΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΏΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ящик foo-proc-macros ΠΈΠ»ΠΈ foo-derive для ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов ΠΈ "Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ" Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ foo , ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ срСду выполнСния ΠΊΠΎΠ΄, Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ рСэкспортируСт ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, API, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ящикС. Π­Ρ‚ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ serde (Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… конфигурациях) https://github.com/serde-rs/serde/blob/v1.0.71/serde/src/lib.rs#L304

Однако стоит ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ этот ΠΎΠ±Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡƒΡ‚ΡŒ всС Π΅Ρ‰Π΅ Π½Π΅ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ пСрСимСнования ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ящика (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ , ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ отслСТивания serde ).

@Ekleog , TokenStream - это ΠΏΠΎΡ‚ΠΎΠΊ TokenTree s, ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ TokenTree связан с Span , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ нСсСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± области видимости. Π—Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² настоящСС врСмя Π½Π΅Ρ‚ способа ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ для любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ области, ΠΊΡ€ΠΎΠΌΠ΅ Β«call siteΒ» (ΠΈΠ»ΠΈ пустой). По сути, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ достаточно эргономичный способ создания Span s, относящихся ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ ящику.

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ я спросил, Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ„Π»Π°ΠΆΠΎΠΊ Π½Π΅ установлСн. Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ Ρ‚ΠΎΠ³Π΄Π° ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π³Π°Π»ΠΎΡ‡ΠΊΡƒ!

Π§Ρ‚ΠΎ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ ΠΎΡ‚ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ послС стабилизации #![feature(proc_macro)] ?

@ jan-hudec О, я Π΄ΡƒΠΌΠ°Π», Ρ‡Ρ‚ΠΎ Span s ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Ρ€Π°Π½Π½ΠΈΡ… сообщСниях Π² Π±Π»ΠΎΠ³Π°Ρ… ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»Π°ΡΡŒ структура Hygiene (ΠΈΠ»ΠΈ одноимСнная), которая ΠΈΠ³Ρ€Π°Π»Π° эту Ρ€ΠΎΠ»ΡŒ. Π― ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π», Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ исчСзли, ΠΈ явно ошибался. Бпасибо! :)

Π§Ρ‚ΠΎ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ ΠΎΡ‚ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ послС стабилизации #! [Feature (proc_macro)]?

Π’ ΠΈΠ΄Π΅Π°Π»Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свСТиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ для всСх ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Π° Π½Π΅ стабилизированных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π° Π·Π°Ρ‚Π΅ΠΌ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ (Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ это Π±Ρ‹Π»ΠΎ сдСлано для https://github.com/rust-lang/rust/issues/ 44660).

О, я Π΄ΡƒΠΌΠ°Π», Ρ‡Ρ‚ΠΎ Spans ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Ρ€Π°Π½Π½ΠΈΡ… сообщСниях Π² Π±Π»ΠΎΠ³Π°Ρ… ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»Π°ΡΡŒ структура Hygiene (ΠΈΠ»ΠΈ с Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ), которая ΠΈΠ³Ρ€Π°Π»Π° эту Ρ€ΠΎΠ»ΡŒ. Π― ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π», Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ исчСзли, ΠΈ явно ошибался. Бпасибо! :)

IIUC, ΠΏΡ€ΠΎΠ»Π΅Ρ‚Ρ‹ - это основной способ отслСТивания гигиСничСского контСкста.

@ mark-im Π’ΠΈΠ΄. Они Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ ΠΊΠ°ΠΊ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ мСстонахоТдСнии исходного ΠΊΠΎΠ΄Π° (для сообщСний / диагностики, ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹Ρ… ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ), Ρ‚Π°ΠΊ ΠΈ синтаксичСский контСкст (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π³ΠΈΠ³ΠΈΠ΅Π½ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ).

Учитывая объСм обсуТдСний / Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΠΈ смысл ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ proc_macro_diagnostic Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ отслСТивания? Π― Ρ‚Π°ΠΊΠΆΠ΅ Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Π΅ΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€Π°Ρ‚ΠΎΡ€Ρ‹ для стабилизации этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, смоТСм Π»ΠΈ ΠΌΡ‹ ΠΏΡ€ΠΎΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒ Π΅Π΅. Π”ΠΈΠ·Π΅Π»ΡŒ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚, ΠΈ Π΄ΠΎ сих ΠΏΠΎΡ€ это Π±Ρ‹Π»ΠΎ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ. ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΉ вСрсии ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ сообщСство создаСт Π·Π°Π±Π°Π²Π½Ρ‹Π΅ ΠΎΠ±Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ новСйшая вСрсия syn, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ вмСсто Π½Π΅Π΅ compile_error! .

@sgrif Π― ΠΎΡ‚ΠΊΡ€Ρ‹Π» Ρ‚Π°ΠΊΡƒΡŽ ​​проблСму: https://github.com/rust-lang/rust/issues/54140.

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ интСрСсно ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π² структурС Span ΠΈ LineColumn. Π― Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€ΡŽ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, Π½ΠΎ Ссли ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Π·Π°Ρ…ΠΎΡ‡Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½ΠΎΠ²ΠΈΡ‡ΠΊΡƒ Π½Π° компилятор Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ, я Π±ΡƒΠ΄Ρƒ ΠΏΡ€ΠΈΠ·Π½Π°Ρ‚Π΅Π»Π΅Π½: +1:

Шлюз Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ proc_macro_gen ΡƒΠΊΠ°Π·Π°Π» ΠΌΠ½Π΅ сюда, Π½ΠΎ Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΌ спискС Π²Π²Π΅Ρ€Ρ…Ρƒ я Π½Π΅ Π²ΠΈΠΆΡƒ Π½ΠΈΡ‡Π΅Π³ΠΎ, Ρ‡Ρ‚ΠΎ явно относится ΠΊ макросу (proc_), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ опрСдСлСния макросов. Π‘Ρ‹Π»ΠΎ Π»ΠΈ это ΡƒΡ‡Ρ‚Π΅Π½ΠΎ (ΠΊΡ€ΠΎΠΌΠ΅ Π²ΠΎΡ€ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ rustc)?

@jjpe , вСроятно, сСйчас Π»ΡƒΡ‡ΡˆΠ΅ всСго, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹

@alexcrichton. МСня это Π²ΠΏΠΎΠ»Π½Π΅ устраиваСт, Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΠ³Π΄Π° я смотрСл Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ proc_macro_gen , ΠΎΠ½Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠ»Π° мСня сюда Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ практичСски ΠΏΠΎΠ»Π½ΠΎΠ΅ отсутствиС упоминания ΠΎ Π½Π΅ΠΉ. Для мСня это Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ странно, поэтому я Ρ€Π΅ΡˆΠΈΠ» хотя Π±Ρ‹ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ ΠΎΠ± этом.

@xieyuheng Как Π±ΡƒΠ΄Π΅Ρ‚ CodeString / Code Ρ‚.Π΅. ΠΊΠ°ΠΊΠΎΠ²Π° Π±ΡƒΠ΄Π΅Ρ‚ Π΅Π³ΠΎ сСмантика?
Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ TokenStream - это Π½Π΅ Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅, ΠΊΠ°ΠΊ дословный исходный ΠΊΠΎΠ΄, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ряда Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², Π° Π½Π΅ Π½Π°Π΄ΠΎΠ΅Π΄Π»ΠΈΠ²ΠΎΠ³ΠΎ тСкста.

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ API для TokenStream (с TokenTree ) стабилСн Π² вСрсии 1.29. Π˜ΠΌΠΏΠΎΡ€Ρ‚ макросов, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… функциям, Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Π² 1.30.

ΠšΠ°ΠΆΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ с rustc 1.30.0-nightly (63d51e89a 2018-09-28) большС Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ ΠΊΠΎΠ΄ Π²Π½ΡƒΡ‚Ρ€ΠΈ модуля Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅. Если Π²Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ mod module; , Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ TokenStream содСрТащий mod module; , WYSIWYG.

Π― понимаю, Ρ‡Ρ‚ΠΎ это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для сохранСния ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΠ², Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹ ΠΈ согласованности с ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. Π•ΡΡ‚ΡŒ ΠΈΠ»ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с содСрТимым ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ…? Π•Π³ΠΎ отсутствиС ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ±ΠΈΠ²Π°Ρ‚ΡŒ с Ρ‚ΠΎΠ»ΠΊΡƒ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠΎΠ³Π΄Π° Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ модуля Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ повСдСния макроса.

Π₯ΠΎΡ€ΠΎΡˆΠΎ, эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΎΠ³Ρ€ΠΎΠΌΠ½Π° ΠΈ дошла Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ я Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ слишком ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ API. Π‘ этой Ρ†Π΅Π»ΡŒΡŽ я ΠΎΡ‚ΠΊΡ€Ρ‹Π» 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, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ½ΠΈ совмСстимы с макросами proc.)

@petrochenkov Π”Π°, спасибо Π·Π° Ρ€Π°Π·ΡŠΡΡΠ½Π΅Π½ΠΈΡ.

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ

Π‘ΠΌΠ΅ΠΆΠ½Ρ‹Π΅ вопросы

defuz picture defuz  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

dtolnay picture dtolnay  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

behnam picture behnam  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

wthrowe picture wthrowe  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

cuviper picture cuviper  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ