Π‘Π»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ°Π³ΠΈ:
use_extern_macros
] (https://github.com/rust-lang/rust/pull/50911)proc_macro
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΡ ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·Π°ΡΠΈΠΈ
macro_rules!
Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ Ρ Π²Π΅ΡΡΠΈΠ΅ΠΉ Π΄ΠΎ 1.29 Π·Π°ΡΡΡΠ΄Π½ΠΈΡΠ΅Π»ΡΠ½Π°RFC .
ΠΡΠΎΡ RFC ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΡΠ²ΠΎΠ»ΡΡΠΈΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ½ΠΎΠΉ ΠΌΠ°ΠΊΡΠΎΡΠΈΡΡΠ΅ΠΌΡ Rust (ΡΠ°ΠΊΠΆΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠΉ ΠΊΠ°ΠΊ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ
ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ, ΡΠ°ΠΊΠΆΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠ΅ ΠΊΠ°ΠΊ ΠΏΠ»Π°Π³ΠΈΠ½Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°). ΠΡΠΎΡ RFC ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ
ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ½ΡΡ ΠΌΠ°ΠΊΡΠΎΡΠΎΠ², ΠΎΠ±ΡΠ΅Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ± ΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π² ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ΅,
ΠΈ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΡΡ Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ.
ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π²ΡΡΠΎΠΊΠΎΠΌ ΡΡΠΎΠ²Π½Π΅ ΠΌΠ°ΠΊΡΠΎΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ ΠΏΡΡΠ΅ΠΌ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΎΡΠΌΠ΅ΡΠ΅Π½Π½ΡΡ Π·Π½Π°ΡΠΊΠΎΠΌ
Π°ΡΡΠΈΠ±ΡΡ#[macro]
. ΠΠ°ΠΊΡΠΎΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎ ΡΠΏΠΈΡΠΊΠΎΠΌ ΡΠΎΠΊΠ΅Π½ΠΎΠ², ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΡΠΌ
ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΈ Π²Π΅ΡΠ½ΡΡΡ ΡΠΏΠΈΡΠΎΠΊ ΡΠΎΠΊΠ΅Π½ΠΎΠ², Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΌΠ°ΠΊΡΠΎΡ. ΠΡ
ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΡΡΠ΅Π΄ΡΡΠ²Π° Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΡΠΈΠΌΠΈ ΡΠΎΠΊΠ΅Π½Π°ΠΌΠΈ. ΠΡΡΡΠΈΠΉ ΡΡΠΎΠ²Π΅Π½Ρ
ΡΡΠ΅Π΄ΡΡΠ²Π° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΡΠΎΠΊΠ΅Π½ΠΎΠ² Π² AST) Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ Π² Π²ΠΈΠ΄Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΡΡ ΡΡΠΈΠΊΠΎΠ².
ΠΠΎΡΠΎΠΆΠ½Π°Ρ ΠΊΠ°ΡΡΠ°: https://github.com/rust-lang/rust/issues/38356#issuecomment -274377210.
#[proc_macro_attribute]
(PR # 38842).#[proc_macro]
(PR # 40129).proc_macro_derive
s Π² InvocationCollector
(PR # 39391).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).#[macro_use]
(PR # 39060).TokenStream
ΠΏΡΠΈ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ΅ ΠΊ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌΡ ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³Ρ (PR # 39173).TokenTree::Sequence
(PR # 39419).TokenStream
s Π²ΠΌΠ΅ΡΡΠΎ Vec<TokenTree>
Π² Π²Π°ΡΠΈΠ°Π½ΡΠ΅ tokenstream::TokenTree
Delimited
(PR # 40202).Path
s ΠΈ TokenStream
s Π² ast::Attribute
s (PR # 40346).#[foo::bar]
, #[derive(foo::Bar)]
).proc_macro::TokenStream
ΠΊΠ°ΠΊ ΡΠΊΠ°Π·Π°Π½ΠΎ Π² RFC (PR # 40939).TokenStream
s Π΄Π»Ρ ΠΈΠ½ΡΠ΅ΡΠΏΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠΎΠ² AST Π² ΡΠΎΠΊΠ΅Π½Ρ Token::Interpolated
.TokenStream
quoter proc_macro::quote!
Π·Π° Π²ΠΎΡΠΎΡΠ°ΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ proc_macro
.proc_macro
Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π² Π·Π°ΡΠ°Π½Π΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΡΡΠΈΠΊΠ΅ foo
Π½Π΅ ΡΡΠ΅Π±ΡΡ ΠΎΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠ°ΠΊΡΠΎΡΠ° Π²ΠΊΠ»ΡΡΠ°ΡΡ extern crate foo;
Π² ΠΊΠΎΡΠ΅Π½Ρ ΡΡΠΈΠΊΠ° (PR # 40939).TokenStream
s Π΄Π»Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² AST.proc_macro::quote!
(issue # 47315).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 ΠΈ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Π² Π½Π΅ΠΌ.
(ΠΠ΅Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅) Π― Π½Π΅ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Eof
Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡ. Iterator
, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ° TokenStream
Π° Iterator::next
ΡΠΆΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ None
ΡΡΠΎΠ±Ρ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ± ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΠΈ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ.
(ΠΠ΅Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅) Π― Π½Π΅ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Π½ΡΠΆΠ½Ρ Exclamation
, Dollar
ΠΈΠ»ΠΈ Semicolon
. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎ Punctuation('!')
Π½Π΅ ΡΠ»ΠΎΠΆΠ½Π΅Π΅.
(ΠΠ΅Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΉ) ΠΠ°ΠΊ ΡΠΆΠ΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡ Π² RFC PR, ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΎΠΏΡΡΡΠΈΡΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΡΠ²Π»ΡΡΡΡΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΌΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°. (ΠΡΠ±ΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΠΎΡΠ΅Ρ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΡΠ°ΠΊΠΆΠ΅ Ρ ΠΎΡΠ΅Ρ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΠΏΡΠΎΠ±Π΅Π»Ρ.)
ΠΠ°ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ ΠΌΠΎΠ³Ρ ΡΡΠ΄ΠΈΡΡ, ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ Ρ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°ΠΌΠΈ (ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ , Π²Π΅ΡΠΎΡΡΠ½ΠΎ, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠΎΠΊΠ΅Π½) Π²ΡΠ΅ Π΅ΡΠ΅ ΠΎΡΡΠ°Π΅ΡΡΡ ΠΎΡΠΊΡΡΡΡΠΌ Π²ΠΎΠΏΡΠΎΡΠΎΠΌ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΡΠΆΠ΄Π°Π΅ΡΡΡ Π² PR-ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ , Π½ΠΎ ΠΏΠΎΡ ΠΎΠΆΠ΅, ΡΡΠΎ ΠΎΠ½ΠΎ Π½Π΅ Π²ΠΎΡΠ»ΠΎ Π² ΡΠ΅ΠΊΡΡ RFC.
Π§ΠΈΡΠ»ΠΎΠ²ΡΠ΅ Π»ΠΈΡΠ΅ΡΠ°Π»Ρ ΠΎΡΡΡΡΡΡΠ²ΡΡΡ. ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ ΠΌΠ°ΠΊΡΠΎΡΡ ΡΠ°ΠΌΠΈ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡ [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
ΠΠ»ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠΎ-ΡΠΎ Π΅ΡΠ΅. ΠΠΎ Ρ Π½Π΅ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Β«ΠΏΡΠΈΡΠ²ΠΎΡΡΡΡΡΡ, ΡΡΠΎ ΡΠΈΡΠ΅Π» Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅ΡΒ» - Ρ ΠΎΡΠΎΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ.
// Π‘Π»ΠΎΠ²ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ Π² ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ 31 ΠΊ ΡΡΠ°Π½Π΄Π°ΡΡΡ Unicode -
ΠΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠΎΡΠ½ΡΠΌ. UAX 31 ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ°, ΠΈ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ Π½Π΅ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Β«ΡΠ»ΠΎΠ²ΠΎΠΌΒ». ΠΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π²ΡΠ±ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ Π²Π°ΡΠΈΠ°Π½Ρ ΠΌΡ Ρ ΠΎΡΠΈΠΌ, ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΈΡΠΈΠ½ΠΎΠΉ ΡΠΎΠ³ΠΎ, ΠΏΠΎΡΠ΅ΠΌΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ, ΠΎΡΠ»ΠΈΡΠ½ΡΠ΅ ΠΎΡ ASCII, Π² Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ
ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Ρ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΊΠ°ΠΊ Β«Π²ΡΠ΅, ΡΡΠΎ ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° ΠΈΠ»ΠΈ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π°Β» (ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡΡΡ ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ # 28979). ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠΌ API pub fn is_identifier(&str) -> bool
Π² libmacro.
Π‘ΡΡΠΎΠΊΠΈ 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, ΡΡΠ°Π½Π΅Ρ Π»ΠΈ ΡΡΠΎΡ ΡΠ·ΠΎΡ ΠΈΠ· ΡΡΠ΅Ρ ΡΡΠΈΠΊΠΎΠ² ΠΈΠ΄ΠΈΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ ΡΠ΅Π»ΠΈ?
foo_runtime
foo_macros
, ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡ ΠΊ ΡΠΈΠΌΠ²ΠΎΠ»Π°ΠΌ Π² foo_runtime
foo
ΠΊΠΎΡΠΎΡΡΠΉ pub use
s ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΈΠ· foo_runtime
ΠΈ foo_macros
Π― ΡΠΏΡΠ°ΡΠΈΠ²Π°Ρ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΠΈΠΌΠΏΠΎΡΡ Π΄Π²ΡΡ ΡΡΠΈΠΊΠΎΠ² , ΠΈ Π±ΡΠ»ΠΎ Π±Ρ Π·Π΄ΠΎΡΠΎΠ²ΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ Ρ ΠΌΠΎΠ³ ΠΎΠ±ΠΎΠΉΡΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ.
@lfairy Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΠ°Π±Π»ΠΎΠ½ "Π΄Π²Π° ΡΡΠΈΠΊΠ°" Π±ΡΠ΄Π΅Ρ ΠΈΠ΄ΠΈΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ:
foo
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();
}
}
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
.
Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ Π΄Π²Π° Π²ΡΡΠ΅ΡΠΏΠΎΠΌΡΠ½ΡΡΡΡ PR, ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΡ ΠΎΠ±Π·ΠΎΡΠ° / ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡ.
ΠΠΎΡ ΠΎΠΆΠ΅, https://github.com/rust-lang/rust/pull/41029 Π³ΠΎΡΠΎΠ²?
ΠΡΠΎΡ PR Π±ΡΠ» Π·Π°Π±ΡΠΎΡΠ΅Π½, Π½ΠΎ Π²ΠΎΠ·ΡΠΎΠΆΠ΄Π΅Π½ ΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² # 48465. Π Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ ΠΆΠ΄Π΅ΠΌ Π½Π° ΠΡΠ°ΡΠ΅ΡΠ΅.
@petrochenkov @nrc
ΠΠ»ΡΠ΄Ρ Π½Π° syntax::ext::expand
, ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ proc_macro_attribute
s Π² Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Π½Π΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°Ρ
(Π½Π΅ ΠΈΡΡΠ΅ΡΠΏΡΠ²Π°ΡΡΠΈΠΉ):
fold_block()
- Π½Π΅Ρ)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, Π²ΠΎΠΉΠ΄ΡΡ Π² ΡΠΎ ΠΆΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΈΠΌΠ΅Π½, ΡΡΠΎ ΠΈ
Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π² ΠΌΠΎΠ΄ΡΠ»Π΅.
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 ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΠ» ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΠΈΡΡ ΡΡΠΎ. Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ°Π³ - ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΎΡΡΠ°Π»ΡΠ½ΡΠΌΠΈ ΠΎΡΠΌΠ΅ΡΠ΅Π½Π½ΡΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ:
Π Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Π½Π΅ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ.
ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΡΠ΅ΡΠ΅Π½Π·Π΅Π½ΡΠΎΠ² ΠΎΠ΄ΠΎΠ±ΡΠΈΡ (ΠΈ Π½ΠΈΠΊΡΠΎ Π½Π΅ Π²ΠΎΠ·ΡΠ°ΠΆΠ°Π΅Ρ), Π½Π°ΡΡΡΠΏΠΈΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΏΠ΅ΡΠΈΠΎΠ΄ Π΄Π»Ρ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π². ΠΡΠ»ΠΈ Π²Ρ Π·Π°ΠΌΠ΅ΡΠΈΠ»ΠΈ ΡΠ΅ΡΡΠ΅Π·Π½ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π»Π°ΡΡ Π½ΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡΡΠ°ΠΏΠ΅ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°, ΡΠΎΠΎΠ±ΡΠΈΡΠ΅ ΠΎΠ± ΡΡΠΎΠΌ!
Π‘ΠΌ. ΠΡΠΎΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΌΠΎΠ³ΡΡ Π΄Π°Π²Π°ΡΡ ΠΌΠ½Π΅ ΡΠ»Π΅Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, ΠΎΡΠΌΠ΅ΡΠ΅Π½Π½ΡΠ΅ ΡΠ΅Π³Π°ΠΌΠΈ.
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
ΠΎΠΏΡΠ°Π²Π΄Π°Π½ Π² ΠΌΠΎΠ΅ΠΉ ΡΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ. ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ ΠΏΠ°ΠΌΡΡΡ Π½Π°Π²ΡΠ΅Π³Π΄Π° (ΡΠΎ Π΅ΡΡΡ Π² ΠΊΠΎΡΠΎΠ±ΠΊΠ΅), Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ Ρ Π½Π΅Π΅ Π΅ΡΡΡ Π»ΡΠ±ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΆΠΈΠ·Π½ΠΈ.
Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΠΎΠΏΡΠΎΡΠΎΠ²:
quote!
Π½Π΅ ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ?quote!
ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ ΡΠ»ΡΠ· ΡΡΠ½ΠΊΡΠΈΠΈ proc_macro_non_items
? ΠΠΎΠΌΠΌΠΈΡ 79630d4fdfc775b241cae0a209edec2687a29f0f ΡΠ΅ΠΏΠ΅ΡΡ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΡΠΎΠ³ΠΎ, Π½ΠΎ quote!
ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ ΠΊΠ°ΠΊ #[unstable(feature = "proc_macro" ...
.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 Π²ΡΡΠ΅.
ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΏΠ΅ΡΠΈΠΎΠ΄ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π² Ρ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΎ ΡΠ»ΠΈΡΠ½ΠΈΠΈ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΌ Π²ΡΡΠ΅ ΠΎΠ±Π·ΠΎΡΠΎΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ .
Π£ ΠΌΠ΅Π½Ρ Π΄Π²Π° Π²ΠΎΠΏΡΠΎΡΠ°:
ΠΠ°ΠΊ ΡΠΆΠ΅ Π±ΡΠ»ΠΎ Π·Π΄Π΅ΡΡ Π·Π°Π΄Π°Π½ΠΎ, ΠΊΠ°ΠΊ Π½Π°ΡΡΠ΅Ρ quote!
? ΠΠ°ΠΊΠΈΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠΏΠΎΡΠΎΠ± ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ TokenStream
? Π‘Π»Π΅Π΄ΡΠ΅Ρ Π»ΠΈ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ Π²ΡΡΡΠ½ΡΡ? ΠΠ»ΠΈ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΈΠΊ quote
? ΠΠΆΠΈΠ΄Π°Π΅ΡΡΡ Π»ΠΈ ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·Π°ΡΠΈΡ proc_macro::quote!
Π² ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ?
ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π»ΠΈ Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ, ΡΡΠΎ ΡΠ°Π·Π½ΠΈΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠ°ΠΊΡΠΎΡΠ°, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΈ ΠΌΠ°ΠΊΡΠΎΡΠ°, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Π°ΡΡΠΈΠ±ΡΡΠ°ΠΌ, Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ²? Π’.Π΅.:
/// 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 ).
#![feature(proc_macro)]
ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΠΎ ΠΊΠ°ΠΊ ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ Ρ 1.29.0. ΠΡΠΎ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΎ?
@ CAD97 , ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎ. Π‘ΠΌ. Https://github.com/rust-lang/rust/commit/65f3007fa8a08daf77f2b8382a56eb80cb277131 ΠΈ https://internals.rust-lang.org/t/help-stabilize-a-subset-of-macros-2-0/7252
@Ekleog , TokenStream
- ΡΡΠΎ ΠΏΠΎΡΠΎΠΊ TokenTree
s, ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ TokenTree
ΡΠ²ΡΠ·Π°Π½ Ρ Span
, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ΡΠ΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ. ΠΠ° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π² Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Π½Π΅Ρ ΡΠΏΠΎΡΠΎΠ±Π° ΡΠΎΠ·Π΄Π°ΡΡ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π΄Π»Ρ Π»ΡΠ±ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ, ΠΊΡΠΎΠΌΠ΅ Β«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, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π·Π±ΠΈΠ²Π°Π΅Ρ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π½Π° ΡΡΠ΄ Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ:
quote!
Ident::new_raw
Span::def_site
proc_macro
ΠΈ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ°proc_macro::Span
ΠΠ° ΡΡΠΎΠΌ ΡΡΠ°ΠΏΠ΅ Ρ ΡΠΎΠ±ΠΈΡΠ°ΡΡΡ Π·Π°ΠΊΡΡΡΡ ΡΡΠΎ, Π½ΠΎ Π΅ΡΠ»ΠΈ Ρ Π·Π°Π±ΡΠ» ΠΎΡΠ΄Π΅Π»ΠΈΡΡ Π»ΡΠ±ΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ, Π΄Π°ΠΉΡΠ΅ ΠΌΠ½Π΅ Π·Π½Π°ΡΡ! Π―, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΌΠΎΠ³Ρ ΠΎΡΠΊΡΡΡΡ Π΅ΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ
@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 ΠΠ°, ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΡΠ°Π·ΡΡΡΠ½Π΅Π½ΠΈΡ.
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
Π₯ΠΎΡΠΎΡΠΎ, ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΎΠ³ΡΠΎΠΌΠ½Π° ΠΈ Π΄ΠΎΡΠ»Π° Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Ρ Π½Π΅ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΡΠ°Π±ΠΎΡΡ ΠΈ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ API. Π‘ ΡΡΠΎΠΉ ΡΠ΅Π»ΡΡ Ρ ΠΎΡΠΊΡΡΠ» https://github.com/rust-lang/rust/pull/54728, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π·Π±ΠΈΠ²Π°Π΅Ρ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π½Π° ΡΡΠ΄ Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ:
quote!
Ident::new_raw
Span::def_site
proc_macro
ΠΈ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ°proc_macro::Span
ΠΠ° ΡΡΠΎΠΌ ΡΡΠ°ΠΏΠ΅ Ρ ΡΠΎΠ±ΠΈΡΠ°ΡΡΡ Π·Π°ΠΊΡΡΡΡ ΡΡΠΎ, Π½ΠΎ Π΅ΡΠ»ΠΈ Ρ Π·Π°Π±ΡΠ» ΠΎΡΠ΄Π΅Π»ΠΈΡΡ Π»ΡΠ±ΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ, Π΄Π°ΠΉΡΠ΅ ΠΌΠ½Π΅ Π·Π½Π°ΡΡ! Π―, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΌΠΎΠ³Ρ ΠΎΡΠΊΡΡΡΡ Π΅ΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ