ãã®åé¡ã¯ããããã现ãã远跡ã®åé¡ãåªå ããŠã¯ããŒãºãããŸãã
次ã®ã¹ãããïŒ
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ïŒãInvocationCollector
ïŒPRïŒ39391ïŒã§ã®proc_macro_derive
ã®äœ¿çšãç¹å®ããŠåéããŸãã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
å±éããåã«ã¢ã€ãã ãå±éããŸãïŒPRïŒ48465ïŒã#[macro_use]
ã€ã³ããŒãã«å¯ŸããèŠåãå®è£
ããŸãïŒPRïŒ39060ïŒãTokenStream
ãã¯ãªãŒã³ã¢ããããŸãïŒPRïŒ39173ïŒãTokenTree::Sequence
åé€ããŸãïŒPRïŒ39419ïŒãtokenstream::TokenTree
ã®Delimited
ããªã¢ã³ãïŒPRïŒ40202ïŒã§ã¯ã Vec<TokenTree>
TokenStream
ã®ä»£ããã«ast::Attribute
sïŒPRïŒ40346ïŒã§Path
ãšTokenStream
ãŸãã#[foo::bar]
ã #[derive(foo::Bar)]
ïŒãproc_macro::TokenStream
æå°APIãå®è£
ããŸããTokenStream
ãToken::Interpolated
ããŒã¯ã³ã«å«ããŸããproc_macro
æ©èœã²ãŒãã®åŸãã«TokenStream
ã¯ã©ãŒã¿ãŒproc_macro::quote!
å«ããŸããproc_macro
äœæè
ãããã¯ããŠãŒã¶ãŒãã¯ã¬ãŒãã«ãŒãã«extern crate foo;
ãå«ããå¿
èŠãªãã«ãäºåã«å®çŸ©ãããã¯ã¬ãŒãfoo
ã¢ã€ãã ã䜿çšããæ¡åŒµãäœæããæ¹æ³ãæäŸããŸãïŒPRïŒ 40939ïŒãTokenStream
å«ããŸããproc_macro::quote!
å
ã®ç¡å¹ãªæ§æã«ãããšã©ãŒãæ¹åããŸããïŒåé¡ïŒ47315ïŒãcc @nrc @jseyfried
ïŒdtolnayç·šéïŒãã§ãã¯ãªã¹ããOPã«ç§»åããŸããïŒ
cc @nrc @petrochenkov @durka @Ralith
@jseyfriedã¬ã¬ã·ãŒãã¯ããšåãååã®å±æ§ãåãã¹ã³ãŒãã«ã€ã³ããŒããããå Žåãå±æ§ã䜿çšããããšãããšããã¯ããå±æ§ãšããŠäœ¿çšã§ããªããšãããšã©ãŒãã¹ããŒããããšããåé¡ãçºçããŸããã äž¡æ¹ãåãã¹ã³ãŒãå ã«ãããæå³ãããšããã«äœ¿çšã§ããããã«ããã®äœæ¥ãè¡ãããšã¯ã§ããŸããïŒ
@abonanderãã¹ãŠã®ãã¯ãïŒbangãattributeãããã³
ããŒãã£ãŒã«é
ããŠãã¿ãŸããã ASTã§ã¯ãªãããŒã¯ã³ãå
¬éããæ¹åæ§ã«ã¯æºè¶³ããŠããŸãããRFCã§ææ¡ãããŠããç¹å®ã®TokenStream
APIã«ã€ããŠæžå¿µããããŸãã
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ã§ä»ã®äººãèšåããŠããããã«ãdoc-commentsã§ã¯ãªãã³ã¡ã³ããçç¥ãããå ŽåããããŸãã ïŒã³ã¡ã³ããä¿æããããŠãŒã¹ã±ãŒã¹ã¯ã空çœãä¿æãããå¯èœæ§ããããŸããïŒ
ç§ãç¥ãéããè€æ°æåã®æŒç®åïŒãããããããããåäžã®ããŒã¯ã³ã§ããå¿ èŠããããŸãïŒãã©ããããã¯æªè§£æ±ºã®åé¡ã§ãã èãããã解決çã¯PRã³ã¡ã³ãã§èª¬æãããŠããŸãããRFCããã¹ãã«ã¯å«ãŸããŠããªãããã§ãã
æ°å€ãªãã©ã«ããããŸããã ãã¯ãã¯ããªãã©ã«ãè©äŸ¡ããããã«[Punct('1'), Punct('_'), Punct('2'), Punct('3'), Punct('4'), Punct('.'), Punct('5'), Punct('e'), Punct('6')]
ãåç¬ã§è§£æããããšã«ãªã£ãŠããŸããïŒ åãå
¥ããæ§æã¯Rustãªãã©ã«æ§æïŒããšãã°ãéäžã«_
ãå«ããããšãã§ããïŒãšåãã§ã¯ãªãããã str::parse::<f32>
ã䜿çšããŠãããè¡ãããšããã§ããŸããã
ããã«ã¯å®å®æ§ã®æžå¿µããããšæããŸãã u128
/ i128
ïŒãããŠããããå°æ¥çã«ã¯f128
ã u256
ãâŠïŒã®ãããªæ°ããæ°å€åãšãã®ãªãã©ã«ããå€æŽãå£ãããšãªãå°å
¥ã§ããŸããïŒããŒã¯ã³APIïŒ ãããå¯èœã«ãã1ã€ã®æ¹æ³ã¯æ¬¡ã®ãšããã§ãã
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
ãŸãã¯å€åäœãä»ã®ãã®ã ãããããæ°åãååšããªããµããããããšããã®ã¯è¯ãæ¹æ³ã§ã¯ãªããšæããŸãã
// Wordã¯UnicodeStandard Annex31ã§å®çŸ©ãããŠããŸã-
ãã®å®çŸ©ã¯ããããããæ£ç¢ºã§ããå¿ èŠããããŸãã UAX 31ã¯ãèå¥åæ§æã®ããã€ãã®ç°ãªãããªãšãŒã·ã§ã³ãæå®ããŠããããããã®ãããããåèªããšã¯åŒã°ããŠããŸããã ããããå¿ èŠãªæ£ç¢ºãªããªãšãŒã·ã§ã³ãéžæããããšããçŸæç¹ã§éASCIIèå¥åãæ©èœã²ãŒããããŠããçç±ã§ãã
代ããã«ãããã¯ãçŸåšã®ã³ã³ãã€ã©ãèå¥åãŸãã¯ããŒã¯ãŒããšããŠåãå
¥ãããã®ã¯äœã§ããïŒïŒ28979ããšã«å€æŽãããå¯èœæ§ããããŸãïŒãšããŠå®çŸ©ããå¿
èŠããããšæããŸãã ãã¶ããlibmacroã®pub fn is_identifier(&str) -> bool
ãããªãã¯APIã䜿çšããŸãã
Unicodeæååãšãã€ãæååãªãã©ã«ã¯åäžã®ããŒã¯ã³ããªã¢ã³ããå
±æããŸããããããã®å€ã®ã¡ã¢ãªè¡šçŸã«ã¯ç°ãªãã¿ã€ãããããããããã¯ééã£ãŠãããšæããŸãïŒ str
ãš[u8]
ïŒã ãŸãã text: Symbol
ã³ã³ããŒãã³ããããœãŒã¹ã³ãŒãã®ãªãã©ã«ã¹ã©ã€ã¹ã§ããã®ããããã¯ã¹ã©ãã·ã¥ãšã¹ã±ãŒãã解決ããåŸã®å€ã§ããã®ãã¯æ確ã§ã¯ãããŸããã ééããªãåŸè
ã®ã¯ãã ãšæããŸãã ïŒæ¯èŒã®ããã«ã Char(char)
\u{A0}
ã¯æåéãè¡šãããã«è€æ°ã®char
ãå¿
èŠãšããããã Char(char)
ã¯åŸè
ã§ããå¿
èŠããããŸããïŒ
é«ã¬ãã«ã®ãã¯ããäœæããå¥ã®æ¹æ³ã¯ããã¯ãã®ãããªlispã䜿çšããããšã§ãããããã«ã¯ãrustastå šäœã®SåŒè¡šçŸãå¿ èŠã«ãªããŸãã
@SimonSapin ã
ä»ã®äººãRFCPRã§èšåããŠããããã«ãdoc-commentsã§ã¯ãªãã³ã¡ã³ããçç¥ãããå ŽåããããŸãã ïŒã³ã¡ã³ããä¿æããããŠãŒã¹ã±ãŒã¹ã¯ã空çœãä¿æãããå¯èœæ§ããããŸããïŒ
ããªãã§ãã ããã æ§æã«ã³ã¡ã³ãã䜿çšãããïŒä¿åã¯ããŸãããã代ããã«å¥ã®ã³ã³ãã€ã«è£œåã«æžã蟌ãŸããïŒãŠãŒã¹ã±ãŒã¹ããããŸãã
å ·äœçã«ã¯ãå¥ã®ãœãŒã¹ãã¡ã€ã«ããæååã®ç¿»èš³ãããŒããã翻蚳ãã¯ããäœæãããããã°ãã«ãã§å¯ç£ç©ãšããŠç¿»èš³ãããæååã®ãªã¹ããçæããããšæããŸãã ãããŠããã®ãªã¹ãã«åºåãããã³ã¡ã³ããå«ããæ¹æ³ãå¿ èŠã§ãïŒrust-locale / rust-localeïŒ19ïŒã ãããã£ãŠãã³ã¡ã³ãæ§æã䜿çšããããšã¯çã«ããªã£ãŠããããã¯ãã¯ããããåç §ããå¿ èŠããããŸãã
ç§ã¯ãã®æçš¿ã®ä»ã®ç¹ã«åæããŸãã
@ jan-hudec
TokenKind::Comment
ããªãã£ããšããŠããé£ç¶ããããŒã¯ã³éã®ã¹ãã³ã®å
容ã確èªããããšã§ãã³ã¡ã³ãã䜿çšã§ããŸãã
ãŠãŒã¶ãŒãã»ãã³ãã£ã¯ã¹ã®å€æŽãå¿é
ããã«ãã¯ãåŒã³åºãã«ã³ã¡ã³ããèªç±ã«è¿œå ã§ããããã«ãæç¶ãåãã¯ããã³ã¡ã³ããç¡èŠããããã«ä¿ãããã«TokenKind::Comment
ãçšæããã¹ãã§ã¯ãªããšæããŸãã
@ jan-hudecå±æ§ããœãªã¥ãŒã·ã§ã³ã§æ©èœããªãçç±ã¯ãããŸããïŒ
@abonander ãå±æ§ã¯çµ¶å¯Ÿã«æå³ããããŸããã 翻蚳å¯èœãªæååã¯ãã¢ã€ãã ãšããŠã§ã¯ãªãããªãã©ã«ãšããŠæ©èœããŸãã ãã ããã³ã³ãã€ã«äžã«ããããæœåºããã®ã¯äŸ¿å®äžã§ããããã¯åžžã«åå¥ã®è§£æãšããŠå®è¡ã§ããŸãïŒå®éãã¯ã¬ãŒãå ã§ãããã®ãã¹ãŠã確èªããå¿ èŠããããã€ã³ã¯ãªã¡ã³ã¿ã«ã³ã³ãã€ã«ã§ã¯ããã倱æãããããæçµçã«ã¯ãããªãå¯èœæ§ããããŸãïŒã
serdeã®æŽŸçã«åºã¥ãæç¶ãåãã¯ããäœæãããã®ã§ããïŒãããã£ãŠãserdeããŒã¯ã³ã¹ããªãŒã é¢æ°ãçŽæ¥åŒã³åºããŸãïŒãæç¶ãåãã¯ãã§ã¯ãªãã©ã€ãã©ãªãšããŠserde掟çãå©çšããããšèšãæ¹æ³ã¯ãããŸããã ããã¯ãã¯ããå°åºããããã ãã®ãã®ã§ã¯ãããŸããããéåžžã®ãæç¶ãåãã¯ãã«ãåæ§ã®ããšãæ±ããããŠããããšãããããŸãã
ç§ã®çŸåšã®å¯äžã®è§£æ±ºçã¯ãserde_deriveããã©ãŒã¯ããããšã®ããã§ãã
åé¡ã¯ãrustcããã®æ¬¡ã®ãšã©ãŒã¡ãã»ãŒãžã§ãã
error: the `#[proc_macro_derive]` attribute is only usable with crates of the `proc-macro` crate type
ãããåé€ããŠæ©èœãããã®ã¯ç°¡åã§ããã解決æ¹æ³ãããããªãè€éãããããŸã-æç¶ãåãã¯ãã¯ã¬ãŒãã¯ãå¥ã®æç¶ãåãã¯ãã¯ã¬ãŒããã掟çããproc-macroãšãé¢æ°ãåŒã³åºããŠãããŠã³ã¹ããªãŒã ãŠãŒã¶ãŒã®æŽŸçãçæããŸãã ããã¯ã©ã®ããã«èŠããã§ããããïŒ æ¶è²»ããŠããã¯ã¬ãŒãã®èŠæ±ã«å¿ããŠãã¯ã¬ãŒãã2ã€ã®ç°ãªãæ¹æ³ã§ãªã³ã¯ã§ãããçŸæç¹ã§ãã®ãããªé¡äŒŒã®ãã®ã¯ãããŸããïŒ
@aidanhs
æç¶ãåãã¯ãã¯ã¬ãŒãã¯ãå¥ã®æç¶ãåãã¯ãã¯ã¬ãŒããã掟çããproc-macroã䜿çšããããšãšãããŠã³ã¹ããªãŒã ãŠãŒã¶ãŒã®æŽŸçãçæããé¢æ°ãåŒã³åºãããšã®äž¡æ¹ãè¡ãå¯èœæ§ããããŸãã ããã¯ã©ã®ããã«èŠããã§ããããïŒ
proc-macro
ã¯ã¬ãŒãããé¢æ°ïŒãŸãã¯æç¶ãåãã¯ã以å€ã®ãã®ïŒã«ã¢ã¯ã»ã¹ããããšã¯ã§ããŸããã TokenStream -> TokenStream
é¢æ°ãšå¯Ÿå¿ããæç¶ãåãã¯ãã䜿çšããå Žåã¯ã TokenStream -> TokenStream
é¢æ°ãå¥ã®éproc-macro
ã¯ã¬ãŒãã«é
眮ããå¿
èŠããããŸãããããã®é¢æ°ã«å§ä»»ããã ãã®proc-macro
ã¯ã¬ãŒãã
ãã®RFCã¯ãïŒ40939ããªãªãŒã¹ããããšã»ãšãã©å®è£ ãããŸãã
proc_macro
äœæè ãããã¯ããŠãŒã¶ãŒãã¯ã¬ãŒãã«ãŒãã«extern crate foo;
ãå«ããå¿ èŠãªãã«ãäºåã«å®çŸ©ãããã¯ã¬ãŒãfoo
ã¢ã€ãã ã䜿çšããæ¡åŒµãäœæããæ¹æ³ãæäŸããŸã
éãã¯ãã¢ã€ãã ãšããã®ã¢ã€ãã ãåç §ããæç¶ãåãã¯ãã®äž¡æ¹ãå«ãåäžã®ã¯ã¬ãŒããæ瀺ãããšããŸãã ïŒ40939ãçéžãããšãããã®3ã€ã®æšæ ã®ãã¿ãŒã³ã¯ããã®ç®æšãéæããããã®æ £çšçãªæ¹æ³ã«ãªããŸããïŒ
foo_runtime
foo_runtime
ã®ã·ã³ãã«ãåç
§ããªããã foo_macros
ã«æç¶ãåãã¯ããå®è£
ããŸãfoo_runtime
ãšfoo_macros
ã®ã¢ã€ãã ãpub use
ã«ããæåŸã®ããã¡ãµãŒããã¯ã¬ãŒãfoo
ãè¿œå ããŸãç§ã®ãŠãŒã¹ã±ãŒã¹ã§ã¯2ã€ã®æšæ ãã€ã ãã§æžãŸããããšãã§ããã°ã䜿ãåæãè¯ããªããšæããŸãã
@lfairy ã2ã€ã®æšæ ãã®ãã¿ãŒã³ã¯æ £çšçãªæ¹æ³ã«ãªããšæããŸãã
foo
foo
ã·ã³ãã«ãåç
§ããŠã foo_macros
ã«æç¶ãåãã¯ããå®è£
ããŸãã#[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]
ããæããªãprocãã¯ãã¯ã¬ãŒãã§ãã
#[feature(proc_macro)]
ãä»ã®procãã¯ããåãšã¯ã¹ããŒãã§ããã®ãšåãããã«ãéåžžã®ã¯ã¬ãŒãã§ã«ã¹ã¿ã 掟çãåãšã¯ã¹ããŒãã§ããŸãã
@jseyfriedçŸæç¹ã§ã®ç¶æ³ã¯æ¿ç¥ããŠãããŸãããçæ³ãšã¯æããªãã®ã§è³ªåãæãããã話ãåããããšæããŸããã ããªãã説æããç¶æ³ã§ã¯ãå¥ã®ã¯ã¬ãŒãã®æç¶ãåãã¯ãã«ãå§ä»»ã/åå©çšããããšã¯ããã¯ãã®äœæè ïŒãã®å Žåã¯serdeïŒã«æç¶ãåãã¯ãã2ã€ã®ã¯ã¬ãŒãã«åå²ããããã«èª¬åŸããããšã®åé¡ã«ãªããŸãã éåžžã®é¢æ°ã®ããã«æç¶ãåãã¯ããåŒã³åºãããšãã§ããã°ãäžæµã®ã¯ã¬ãŒãäœæè ã¯ãç§ãã¯ã¬ãŒãã䜿çšããŠããããšãç¥ãå¿ èŠãããããŸããã
ãšã¯ãããäºææ§ã®å±éºæ§ãèªèããŠããŸã-ãã¯ãã«ãã£ãŠçæãããæ£ç¢ºãªããŒã¯ã³ããªãŒã¯å®å®ããã€ã³ã¿ãŒãã§ã€ã¹ã®äžéšã«ãªããããserdeããããããŒãžã§ã³ã§Derive
ãçæããæ¹æ³ãå€æŽããå£ãããããã¯ããäœæããå Žåããã¯ãã¯ãç§ã®ã¯ã¬ãŒãã®ãã¹ãŠã®æ°èŠãŠãŒã¶ãŒã«å¯ŸããŠå£ããŸãïŒçŸåšã®å Žåã®å£ãããããã¯ããšã¯å¯Ÿç
§çã«ãææªã®å Žåãç¹å®ã®å
¥åã«å¯ŸããŠã®ã¿æ©èœããŸãããäžè²«ããŠæ©èœããŸãïŒã
@jseyfried
ããã¯çŸåšã®è²šç©ãããªã¹ãããfoo
ãåŒãåºããŸããïŒ ããã¯æªãããšã®ããã«èãããŸãïŒã€ãŸããçŸåšã®ãã€ããªã«ãªã³ã¯ãããŠããfoo
ãšããååã®ã¯ã¬ãŒãã2ã€ããå Žåãç¹ã«æããªããšãããŸããïŒïŒã
@aidanhsããã¯ãç¬èªã®RFCãä¿èšŒããäž»èŠãªèšèªã®å€æŽ/è¿œå ã«ãªããŸãã
@ arielb1
ããã¯çŸåšã®è²šç©ãããªã¹ããã
foo
ãåŒãåºããŸããïŒ ããã¯æªãã§ãã
ãã-æ²ããããšã«ãåŒçšãããextern crate
ååã¯è¡ççã§ã¯ãããŸãããã€ãŸãã解決çã¯ãæç¶ãåãã¯ãã䜿çšãããã¹ã³ãŒãå
ã«ããã¯ã¬ãŒãåã«ãã£ãŠç°ãªããŸãã åãšã¯ã¹ããŒãã®ããªãã¯ã䜿çšããŠããã軜æžããããšã¯ã§ããŸããïŒã€ãŸãã foo
ãã¹ã³ãŒãå
ã«ããããšããããããã«foo
foo_macros
ãåãšã¯ã¹ããŒãããïŒãããã¯ä¿è·ãããŸããfoo
ãšããååã®ã¯ã¬ãŒãã2ã€ããå Žåã®ããããŸããã®ãšã©ãŒã«å¯ŸããŠã
ããã§ã®æåã®è§£æ±ºçã¯ã --target-extern
ã³ãã³ãã©ã€ã³åŒæ°ã䜿çšããŠããã§ãŒãº1ïŒã€ãŸããã¿ãŒã²ããwrtãã¹ããšã¿ãŒã²ããïŒã®äŸåé¢ä¿ãproc-macro
ã¯ã¬ãŒãã®Cargo.toml
ã«è¿œå ããããšã ãšæããŸãã ããã«ããã quote!
å
ã®ã¹ã³ãŒãå
ã®extern crate
åãæ瀺çã«ãªã¹ãã§ããŸãã
@jseyfried
ã¢ã€ãã¢ã¯ãproc-macroã¯ã¬ãŒãããã®ãã¿ãŒã²ãããã¡ã¿ããŒã¿ã«äŸåé¢ä¿ãæã€ãšããããšã§ãããïŒ
@ arielb1ããããã®éãã§ãã
ãã®RFCã¯ãïŒ40939ããªãªãŒã¹ããããšã»ãšãã©å®è£ ãããŸãã
@jseyfriedã®ããã«ããã®PRãçéžãããšãã«å®å®ããæºåã¯ã§ããŠããŸããïŒ ããã§ãªãå Žåãå®å®åããããã¯ãç¶ãããã®ã¯äœã§ããïŒ ç§ã¯ããããå®è£ ã«åããŠ95ïŒ ã®éã®ããæ©ã¿ã人ã ããã¹ãŠè奮ãããã®åŸç©äºãåæçã«è¡°éãããããªãããã«å¥ã®æ©èœã«ããããããŸããã
ã®ããã«ããã®PRãçéžãããšãã«å®å®ããæºåã¯ã§ããŠããŸããïŒ
ãããã extern crate
ååãå®å®ãããå°æ¥çã«ã¯è¡çç¶æ
ãä¿èšŒããåã«ãAPIã®çµéšãç©ã¿ãããšèããŠããŸãïŒã€ãŸãã @ arielb1ãææãããã®åé¡ã«å¯ŸåŠããŸãïŒã
ãã®APIã«é倧ãªå€æŽãå ããããšæãã§ãããã @eddybã¯ããã¹ãŠã®ããŒã¯ã³ããªãŒã«OpKind
ãäžè¬åããããšãææ¡/æ€èšããŸããã ãŸããããã¥ã¡ã³ãã³ã¡ã³ããæµ®åå°æ°ç¹ãªãã©ã«ãªã©ã®åŠçæ¹æ³ãå€æŽããå¯èœæ§ããããŸããå
šäœãšããŠããã®PRã®APIã¯ãå®å®åãæ€èšããã®ã«ååãªã»ã©æçããŠããŸããã
@bstrieæ²ããããšã«ã掟çãã¯ãå®å®åã倱æããããã«ãprocãã¯ãå®å®åãé«éåããRFCïŒããšãã°ãããŒã¯ã³ã¹ããªãŒã ã¯æååè¡šçŸãä»ããŠã®ã¿ã¢ã¯ã»ã¹ã§ããéãããAPIã䜿çšïŒïŒ https ïŒ
@ est31延æããã£ãšäŒŒãŠããŸã-ãã®APIãå°ãçµéšããåŸãå®å®åãžã®æ©éã«åæã§ãããµãã»ããã«åæãããããããŸããã
String
ããŒã¹ã®APIã¯ã宣èšåãã¯ã2.0ãšã®çžäºäœçšãæªãããã¯ã2.0ããªãã #[derive]
ã ãã§ããä»æ¥ãã§ã«å¶éãããŠããŸãã 人ã
ããã¯ã2.0ã«ç§»è¡ããéã®åé¡ãåé¿ããããã«ã String
ããŒã¹ã®APIã®æ¥å¢ãå¯èœãªéãåé¿ããããšèããŠããŸãã
#[proc_macro_attribute]
ããã¬ã€ãã¡ãœããã§æ¡åŒµãããŠããªãããã«èŠããåé¡ã
ãããproc_macro
ã¯ã¬ãŒããšãã®æ°ããAPIã®è¿œè·¡ã®åé¡ã§ãããããç§ãããã€ãã®èããæžãçãããšæããŸããã proc-macro2
ãšããã¯ã¬ãŒããå
¬éããŸãããããã¯ãå®å®ããRustã§ã³ã³ãã€ã«ããæ©èœãæäŸããããšãé€ããŠãããªãŒå
ã®proc_macro
ã¯ã¬ãŒããšãŸã£ããåãã«ããããšãç®çãšããŠããŸãã ãŸããæ©èœã䜿çšããŠå€éã®Rustã§ã³ã³ãã€ã«ããããè¯ãã¹ãã³æ
å ±ãå©çšããããšãã§ããŸãã ãã®ã©ã€ãã©ãªã¯ã syn
ãããªä»ã®ã©ã€ãã©ãªã®åºç€ãšãªãããšãç®çãšããŠããã syn
ã®éçºã§ã proc_macro
çŽæ¥å¯ŸåŠãããããã€ãã®æ¬ ç¹ãèŠã€ããŸããã
Literal
ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãããŸããã ããã¯ãæåååãšããã«ç¶ãæ§æ解æã«ãã£ãŠåé¿ãããŸãããæååAPIãçµç±ããã«ããããçŽæ¥æ§ç¯ã§ãããšäŸ¿å©ã§ããr###" foo "###
rb#" foo "#
b'x'
Literal
ããŒã¯ã³ãšããŠè¡šãããŠããŸããLiteral
ã調ã¹ãŠããã®å€ãæœåºããæ¹æ³ã¯ãããŸããã çŸåšããªãã©ã«æ¡åŒµã¯ã¬ãŒãã䜿çšããŠãªãã©ã«ãto_string
å解æããŠããŸãããçè«çã«ã¯ããã®æ
å ±ã¯ãã§ã«Literal
æ ŒçŽãããŠããããã次ã®ããšãã§ãããšäŸ¿å©ã§ããã¢ã¯ã»ã¹ããŸããLiteral
ã¿ã€ãã«ããããããŠããŸãããã以æ¥ããããã
#[proc_macro_derive(foo, attributes(foo))]
ãæã€ã«ã¹ã¿ã 掟çã«åœ±é¿ãã#![feature(proc_macro)]
ã§ãã¹ããããšãã«ãç ŽæãçºçããŸããã ã€ãŸããã«ã¹ã¿ã 掟çãšåãå±æ§ã®ååãæã€ã«ã¹ã¿ã 掟çã§ãã ãã®ãããªã¯ã¬ãŒãã®1ã€ã¯ã #[derive(error_chain)] #[error_chain(...)] struct ErrorKind { ... }
ãæã€mine-derive-error-chainã§ãã ãã1ã€ã¯derive-newã§ãããã«ã¯#[derive(new)] #[new] struct S;
ãŸãã ä»ã«ãããããããŸããã
ãã®ãããªã³ãŒãã®å Žåãã³ã³ãã€ã©ã¯2çªç®ã®å±æ§ã§"foo" is a derive mode
æå¥ãèšããŸãã ããã¯æå³çãªãã®ã§ããããããšãä¿®æ£ã§ããŸããïŒ æå³çã«ã«ã¹ã¿ã 掟çã®ååãErrorChain
ãªã©ã«å€æŽããæºåãããå¿
èŠããããŸãã
@Arnavion
ããã¯äžè¬çã«æå³çãªãã®proc_macro_attribute
掟çããåã«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
ãç¹å¥ãªã±ãŒã¹ã«ããããšãæ±ããŠããŸããã§ããã ããã¯ãç§ãç¥ã£ãŠãã2ã€ã®proc_macro_derive
ã®ãã¡ã®1ã€ããã®åãªãäŸã§ãããããã«ãã£ãŠå£ããŠããŸãã
ç§ã¯å¹³åç¹æ®ãªã±ãŒã¹ã§ã¯ãããŸããã§ãã- @Arnavionç³ãèš³ãããŸããããç§ã®æåŸã®ã³ã¡ã³ãã¯æãæ確ã§ã¯ãªãã£ãnew
ç¹ã«ãªããã§ããããã«#[derive(some_macro)] #[some_attr] struct S;
ãšãsome_attr
ã«è§£æ±ºãproc_macro_derive
ã some_attr
ãproc_macro_attribute
ã«è§£æ±ºãããå Žåãããã¯ãããŸããªãšã©ãŒã§ããå¿
èŠããããŸãã ä»æ¥ã some_attr
ãããããã®ãã¯ãã«è§£æ±ºããããšããããŸããªãšã©ãŒã«ãªããŸãã
ãããåã£ãã
ïŒããããã®ãããªè³ªåã«é©ããå Žæã§ããããšãé¡ã£ãŠããŸãã ïŒ
ããã®ç¶æ³ã¯ã©ãã§ããïŒ
- []
proc_macro
äœæè ãããã¯ããŠãŒã¶ãŒãã¯ã¬ãŒãã«ãŒãã«extern crate foo;
ãå«ããå¿ èŠãªãã«ãäºåã«å®çŸ©ãããã¯ã¬ãŒã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,
}
ããã¯ã (1)
ãå®å®ããŠåäœããããšãé€ããŠãçŸåšã®å®å®ããRustã®åäœãšäžèŽããŸãã ç§ãæ瀺çã«äœ¿çšããããŠãŒã¶ãŒãããããšãææžåããŠããŸãã#[macro_use]
ããŠerror-chain
ã¯ã¬ãŒããã€ã³ããŒãããåã«ãããã€ã³ããŒãããå¿
èŠããããŸãderive-error-chain
ã
ããããã«ã¹ã¿ã 掟çã®ååãErrorChain
ããŠã (1)
ãproc_macro
æ©èœïŒå®å®ããã³ãŒãã®1ã€ã®é倧ãªå€æŽïŒã§æ©èœãããå Žåã§ãã次ã®ããã«ãªããŸãã
#![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_rules
ãã¯ãã¯ã次ã®ããã«ãªãŒããŒã©ã€ããããã®ã§ã¯ãªããã«ã¹ã¿ã 掟çã«ãã£ãŠç»é²ãããå±æ§ãšæããã«ç«¶åããããã macro `error_chain` may not be used in attributes
æåã®ã±ãŒã¹ã§ã¯ã
ãããã£ãŠãã«ã¹ã¿ã 掟çãšãã®å±æ§ã®äž¡æ¹ã®ååãå€æŽããå¿
èŠãmacro_rules
ãã¯ãã®ååãåå©çšããŠããŸãïŒããããã¯ã«ã¹ã¿ã 掟çãå®å®ããã®ã§ãå幎åŸã«ã¯åé¡ã«ãªããšæãçç±ã¯ãããŸããã§ããã
ã«ã¹ã¿ã 掟çç©èªäœãmacro_rules
ãã¯ãããªãŒããŒã©ã€ãããã®ãšåãããã«ãã«ã¹ã¿ã 掟çç©ã®å±æ§ãmacro_rules
ãã¯ãããªãŒããŒã©ã€ãããããã«äœæã§ããŸããïŒ å®éããããã®éã«ãããŸãããã©ã®ããã«ãããã¯ããããŸããããåãååã®ã«ã¹ã¿ã 掟çã®åŸã«macro_rules
ãã¯ããã€ã³ããŒããããå Žåãšåãçç±ã§ãããšæããŸã-ãã¹ãŠã®ãã¯ãããã¯ãã®çš®é¡ãèæ
®ããã«åãåå空éã
procãã¯ãã«ã€ããŠè©±ãããã®ããŸãæ£åŒã§ã¯ãªããå Žæãã¯ãããŸããïŒ #rust-proc-macro
IRCãã£ã³ãã«ã®ããã«ïŒ ãã®æ©èœã«ã€ããŠæã
å°ããªè³ªåããããã®ã§ããããã®ã¹ã¬ãããã¹ãã ããã®ã¯ééã£ãŠãããšæããŠããŸãïŒsee_no_evilïŒãããŠ#rust
ãã£ãã«ã§ã¯ãã»ãšãã©ã®äººãproc-macrosãšç¹ã«æ°ãã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ã«ã€ããŠèª¬æããŸããããã¯ãç§ãæãããç¥ã£ãŠããããšã ããã§ãã
ç§ã¯èªåã®ãããžã§ã¯ãã§R7RSã¹ããŒã ã®syntax-rules
å®è£
ã«å人çã«åãçµãã§ããã syntax-case
ãéè¡ççããã³è¡ççãã¯ãã·ã¹ãã ïŒ defmacro
äž¡æ¹ããµããŒãããããã®åºç€ã圢æã§ããããšãçºèŠããŸãããããã³syntax-rules
ïŒã GNUGuileã¯ãããè¡ããŸãã syntax-case
ã¯ãæ§æãªããžã§ã¯ããªã¹ãïŒãŸãã¯Schemeã®TokenStream
ã®è¡ã®äžã®äœãïŒã§è¿œå ã®è¿°èªæ€èšŒãå®è¡ã§ãããã§ã³ããŒããµããŒãããŠããŸãã Mark
ãäœæ¥äžã§ãããã¹ã³ãŒãã®ã»ãããšããŠã®ãã€ã³ãã£ã³ã°ã«è§ŠçºãããŠããããã«èŠããŸãã
ãŸããã³ã³ãã€ã«æã®ä»»æã®èšç®ããµããŒãããå¿
èŠããããã©ããã«ã€ããŠã説æããå¿
èŠããããŸããïŒ Racketã¯å®éã«ã¯ãç©äºã«å¯ŸããŠå
šäœçãªããã§ãŒãºãã¢ãããŒããæ¡çšããŠããã begin-for-syntax
ãããšããã¯ãå±éäžã®ã³ã³ãã€ã«æã¬ãã«ã§ã®å®çŸ©ãšèšç®ïŒïŒïŒãå¯èœã«ãªããŸãã ã
Schemeã®(datum->syntax <thing-to-copy-scope-from> <thing-to-apply-scope-to>)
ãããšãè¡çç¶æ
ãå¶åŸ¡ã§ããŸããããã«ããããã¯ãã®ã¹ã³ãŒãããšã¹ã±ãŒããã代ããã«ãçŽæ¥ã®ã¹ã³ãŒãå€ã®ãªããžã§ã¯ãã®ã¹ã³ãŒããååŸã§ããŸãã
ãã®äŸã¯ãSchemeããã°ã©ãã³ã°èšèªã第3çããhttp ïŒ (include "filename.scm")
ãsyntax-case
ãã¯ããšããŠç€ºããŠãããã€ã³ã¿ãŒããªã¿ãŒããã¯ãã䜿çšããŠããã¡ã€ã«ããèªã¿åããè©äŸ¡ãç¶è¡ããããã«ã©ã³ã¿ã€ã ãèšå®ã§ããããã«ããŠããŸãã ããã§ã®ããæ·±ã質åã¯ããã¯ããã¯ãã·ã¹ãã ããã¯ãæ¡åŒµæã«ãã®ãããªããšãå®è¡ã§ããããã«ãããã¡ã€ã«ã€ã³ããŒãã®ããªã¬ãŒãªã©ã®ã³ã³ãã€ã«æã®èšç®ãããªã¬ãŒãããã©ããã§ãïŒãã ããããã¯çŽæ¥ã³ã³ãã€ã©æ©èœã§çºçããããã§ãããã ããå€åç§ãã¡ã¯ãããããããªãã§ãããïŒã
ãã¯ãã®éçã¯ã©ãããã¹ãã§ããïŒ Rustã¯ãã³ã³ãã€ã«æéãççž®ãããã®ã§ãã³ã³ãã€ã«æã®è©äŸ¡ãå¶éãããïŒãããŠç¹ã«ç¡éã«ãŒããé¿ãããïŒãšæããŸãã Racketã¯ãLisp in Small Piecesã§åç §ãããŠããããã«ããã§ãŒãºã䜿çšããŠãäœæè ãšæ¡åŒµæ©èœã®ã¿ã¯ãŒãã¢ãããŒããæ¡çšããŠããŸãã ã³ã³ãã€ã«æAPIãžã®ã¢ã¯ã»ã¹ãèš±å¯ããŠããã¡ã€ã«I / Oãå¶éä»ãã®ååž°èšç®ãå®è¡ã§ããããã«ããŸããïŒ æç¶ãåãã¯ããCSVã¹ãã¬ããã·ãŒãã®ä»æ§ãswitchã¹ããŒãã¡ã³ãã«å€æã§ããããã«ããå¿ èŠããããŸããïŒ
ä»ã®ã·ã¹ãã ã«ã€ããŠèããŠã¿ããã§ãïŒ ãã³ãã¬ãŒãHaskellã«ã¯ãASTãè¡šãããã«æ確ã«å®çŸ©ãããåã䜿çšããèå³æ·±ãã¢ãããŒãããããHaskellã®æ æ°ã¯ãå¶åŸ¡æ§é ã®ãã¯ãã®å€ãã®äœ¿çšã«åã£ãŠä»£ããããšãã§ãããšèããŸããã
ç§ãã©ã€ã³ããå€ããŠããå Žåã¯ç³ãèš³ãããŸããã
ãã¯ãã®éçã¯ã©ãããã¹ãã§ããïŒ
ãã®å·ã§èª¬æãããŠããæç¶ãåãã¯ãã®å Žåããªãã æç¶ãåãã¯ãã¯ã³ã³ãã€ã©ã®æ¡åŒµæ©èœã§ãã å°ãã®C ++ã³ãŒããåãããããclangã§å®è¡ããçµæã®ãªããžã§ã¯ããã³ã³ãã€ã«ã«è¿œå ããããšãã§ããŸãã SQLãå¿ èŠã§ãããŒã¿ããŒã¹ã«ã¯ãšãªãå®è¡ããŠå¯Ÿå¿ããçµæã¿ã€ããèŠã€ããé©åãªçµæã»ãããçæããããšãã§ããŸãã ãããã¯ã人ã ãããããå®éã®ãŠãŒã¹ã±ãŒã¹ã§ãã
Rustã«ã¯å¥ã®ãã¯ãã·ã¹ãã ãããããšã«æ³šæããŠãã ããã ãã®æŽæ°ã¯RFC1584ãšããŠæ¿èªãããŠãããå®è£ ã¯https://github.com/rust-lang/rust/issues/39412ã«ãã£ãŠè¿œè·¡ãããŠã
@ VermillionAzure ãåç §ããã¹ããŒã ãã©ãŒã ã
macro_rules
ãããã³RFC 1584ã«syntax-rules
䌌ãŠããŸãã ãããã匷åããããã®ææ¡ãããå Žåã¯ã httpsïŒ//github.com/rust-lang/rust/issues/39412ãããããããã«ã€ããŠè°è«ããã®ã«æé©ãªå Žæã§ãã
ãã®åé¡ã®å¯Ÿè±¡ãšãªãproc-macrosã¯ã 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ãã¯ããè°è«ã«è¿œå ããã®ã«é©åãªã¢ã€ãã¢ã§ãããã©ãããèŠããã£ãã ãã§ã-æç¶ãåãã¯ãã¯Schemeã®syntax-case
ãã¯ãã·ã¹ãã ãããã¯ããã«åŒ·åã§ããããšãæå³ãããŠããã®ã§ãããã¯äºçŽ°ãªããšã§ãããã§æäŸãããä»»æã®ãã¯ãŒã®èŠ³ç¹ããããã¹ãŠã®ãã¯ãã·ã¹ãã ãå®è£
ããŸãã
@ jan-hudecãããªãçš®é¡ã®ã»ãã¥ãªãã£ä¿èšŒããªãã«ãã³ã³ãã€ã©æ¡åŒµãšããŠä»»æã®èšç®ãèš±å¯ããã®ã¯è³¢æã§ããïŒ ç§ã¯ããã§æç¶ãåãã¯ããéåžžã«åŒ·åã«ãªããšããèãã«å®å šã«åºã匵ã£ãŠããŸãããRustã®æœåšçãªãŠãŒã¶ãŒã¯ãããããã±ãŒãžã䜿çšããããšã®æ¬ ç¹ãšèŠãªããŸããïŒ ç§ã¯æ±ºããŠã»ãã¥ãªãã£ã®å°é家ã§ã¯ãããŸããããã³ã³ãã€ã©æ¡åŒµæ©èœå ã§äœ¿çšãããã©ã€ãã©ãªã®è匱æ§ãç°¡åã«äœ¿çšããŠãRustã³ã³ãã€ã©ãæ»æãã¯ãã«ã«æªæãæã£ãŠå€ããããšãã§ããŸããã§ãããïŒ ããã«ãæç¶ãåãã¯ãã§äœ¿çšãããã©ã€ãã©ãªã«ãã°ãçºçããå ŽåïŒããšãã°ãäžæ£ãªCã©ã€ãã©ãªã³ãŒãã«ãã£ãŠããªã¬ãŒãããsegfaultïŒãããã¯segfaultãããªã¯ã«ã¢ããããé©åãªãšã©ãŒã¡ãã»ãŒãžãªãã§ã³ã³ãã€ã©ã倱æããããšãæå³ããŸããïŒ
æç¶ãåãã¯ãã§çºçãããšã©ãŒããã³ã³ãã€ã©ã®ä»ã®éšåã«åœ±é¿ãäžããªãæ¹æ³ã§ã«ãã»ã«åããæ¹æ³ã¯ãããŸããïŒ
å¥ã®ã¢ã€ãã¢ïŒæç¶ãåãã¯ãã¯ãã€å®è¡ãããŸããïŒ æç¶ãåãã¯ãããé¢é£ããå¯èœæ§ã®ããå¯äœçšïŒããšãã°ãã¹ããŒããã«ãªå€éšãµãŒããŒãšã®éä¿¡ãå€éšSQLããŒã¿ããŒã¹ã®å€æŽãå€éšã·ã¹ãã ã«ãã°ãèšé²ããããã®ã»ãã¥ãªãã£ããŒã®ååŸïŒãæã€ã³ãŒããšå¯Ÿè©±ã§ããå Žåãããã¯æç¶ãåãã¯ããã³ã³ãã€ã«ããã»ã¹ã«ãã£ãŠããªã¬ãŒãããé åºã¯éèŠã§ããïŒ
@VermillionAzure Cargoããã±ãŒãžã«ã¯ãã³ã³ãã€ã«æã«ä»»æã®ã³ãŒããå®è¡ãããã«ãã¹ã¯ãªããããã§ã«å«ãŸããŠããå¯èœæ§ããããããæç¶ãåãã¯ãã¯ãã®é¢ã§äºæ
ãæªåãããããšã¯ãããŸãããäŸåé¢ä¿ãä¿¡é Œããå¿
èŠããããŸãã ïŒããã¯ãcrates.ioãäžå€/è¿œå ã®ã¿ã§ããã Cargo.lock
ãã¡ã€ã«ãããå ŽåãäŸåé¢ä¿ãèªåçã«æŽæ°ãããªããããå€å°ç°¡åã«ãªããŸããç¹å®ã®ããŒãžã§ã³ã®ã¿ãä¿¡é Œããå¿
èŠããããŸããïŒãã«ãã¹ã¯ãªãããä¿¡é Œããªãã£ãå Žåã§ãååšããå Žåã§ããäŸåé¢ä¿ã¯å®è¡æã«ä»»æã®ã³ãŒããå®è¡ã§ããŸãã ã³ã³ãã€ã«æã¯ã¯ããã«æªãã§ããïŒ
ãã®è°è«ã¯ãç§ã«é¢é£ããŠãããç°ãªãåé¡ã«ã€ããŠèããããŸãã
ã¯ã¬ãŒãã2ã€ã®procãã¯ããå®çŸ©ãããšããŸãã foo!()
ã¯äžæãã¡ã€ã«ãæžã蟌ã¿ã bar!()
ã¯åããã¡ã€ã«ãèªã¿åããŸãã ãã®ã¯ã¬ãŒãã®ã³ã³ã·ã¥ãŒããŒã¯ãåãã¢ãžã¥ãŒã«ã§foo!()
ãšbar!()
äž¡æ¹ãåŒã³åºããŸãã 次ã«ãã³ã³ãã€ã«ãæåãããã©ããã¯ã foo!()
ãšbar!()
ã©ã¡ããæåã«å±éããããã«ãã£ãŠç°ãªããŸãã ãã®é åºã¯å®è£
ã«ãã£ãŠå®çŸ©ãããŠãããååãªæ°ã®äººããã®ãããªã³ãŒããäœæãããšãããã¡ã¯ãã¹ã¿ã³ããŒãã«ãªãå¯èœæ§ããããŸãã
ãããããããã©ãã»ã©ã®åé¡ã§ãããã¯ããããŸããã ãããæ§é äœã®é åºäœã®é åºäœã®ç¹°ãè¿ãã«ã€ãªãããã©ããã ããå¿é ã§ãã
@SimonSapin
ç§ã¯ããªãã®ç«å Žã«åæããŸãããã³ã³ãã€ã«æã®å®è¡ãšå®è¡æã®å®è¡ã«ã¯1ã€ã®éèŠãªéããããããšãææããŠããå¿ èŠããããŸãã
ç©äºã¯äžåºŠã³ã³ãã€ã«ãããŠããå€ãã®ãã·ã³ã«ãããã€ãããåŸåããããããããã¯ç°ãªãè åšã¢ãã«ãæäŸããŸãã ïŒäŸïŒLinuxãã£ã¹ããªãã¥ãŒã·ã§ã³ãã«ãã¯ã©ã¹ã¿ãŒã§ã®ã¡ã³ããã®äžæ³šæãšãµã³ãããã¯ã¹ã®æ¬ ç¹ã®æªçšãïŒ
@lfairyã¯ããããã¯Racketã10幎以äžåã«2002幎ã«æ±ããŠããæ£ç¢ºãªåé¡ã§ããComposable and Compilable MacrosïŒYou Want it WhenïŒ ããšããè«æãäœæããŸãããR6RSã©ã€ãã©ãªã®æé»çãªãã§ãŒãºãã§ã©ã€ãã©ãª/ã¢ãžã¥ãŒã«ã®è©äŸ¡ã®ãã§ãŒãºã«é¢ããè«æãæžããŠããŸãã
@SimonSapinã³ã³ãã€ã«æã¯ãããã«æªåããå¯èœæ§ããããŸãã ã³ã³ãã€ã©ãã©ã³ãã ã«ã¯ã©ãã·ã¥ããããã³ã³ãã€ã©ã«ãã£ãŠããªã¬ãŒãããæªæã®ããåäœãå®è¡ããããããšã誰ãããRustã®ã¢ãžã¥ãŒã«ã¯æ¬è³ªçã«å®å šã§ã¯ãªãããªã©ã®ã¿ã€ãã«ã®å·šå€§ãªRedditæçš¿ãæžãããšã«ãªããŸãã
@VermillionAzure ãç§ã¯èšäºãããŸã泚ææ·±ãèªãã§ããŸããã§ããããRustãçŽé¢ããåé¡ã¯SchemeãçŽé¢ããåé¡ãšã¯éåžžã«ç°ãªãããããããã¯è°è«ã«é¢é£ãããšã¯æããŸããã
ã¹ããŒã ã§ã¯ã1ã€ã®ã©ã€ãã©ãªãé¢æ°ãšãã¯ãã®äž¡æ¹ãæäŸã§ãããããã³ã³ãã€ã©ã¯ãã³ã³ãã€ã«æã«å¿ èŠãªé¢æ°ãšå®è¡æã«å¿ èŠãªé¢æ°ãæ£ããåé¡ããå¿ èŠããããŸãã ãã ããRustã§ã¯ãã¯ã¬ãŒãã¯æç¶ãåãã¯ããŸãã¯ã©ã³ã¿ã€ã é¢æ°ã®ãããããæäŸããããããã®åå²ã¯ïŒåœé¢ã¯ïŒæããã§ãã
ïŒã©ã³ã¿ã€ã é¢æ°ãæäŸããã¯ã¬ãŒãã¯ãã«ãŒã«ããŒã¹ã®ïŒè¡ççãªïŒãã¯ããæäŸã§ããŸãããRustã§ã¯ãããã¯å¥åã®ã¡ã«ããºã ã§ããããšã«æ³šæããŠãã ããïŒ
@lfairyã話ããŠããåé¡ã¯ããšãã¹ãã³ããŒé¢æ°ã®å®è¡é åºã®1ã€ã§ãã Rustã§ã¯ãã³ã³ãã€ã«ã¯åå¥ã®ãã¡ã€ã«ã«å¯ŸããŠäžŠåã§ãããå¢åã§ããå¯èœæ§ãããããããšã¯ã¹ãã³ãã®å®è¡é åºã¯å®çŸ©ãããŠããŸããã ããããã©ã¡ãã®èšäºãå®éã«ãããæ±ã£ãŠããŸããïŒ ç§ã¯ãããèŠãŸããã§ããã
@ jan-hudecãããããªãã¯æ£ãããšæããŸãã ãã ããç¹å®ã®ã¢ãžã¥ãŒã«ãå¯äœçšãçæããªãããšãä¿èšŒã§ããªãéããã³ã³ãã€ã«æã«å¯äœçšãèš±å¯ãããŠããå Žåãè©äŸ¡ã®é åºã¯ééããªãéèŠã§ãã ã¢ãžã¥ãŒã«ã¯ãå ¥åå¯èœãã§ããïŒ
äžéšã®è©³çŽ°ïŒä»¥äžãåç §ïŒã¯ä¿¡é Œã§ããªããããæç¶ãåãã¯ãã«ã¯ããããããªãã¯ããã®å¯äœçšããããšæããŸãããèšèªã«åã·ã¹ãã ã®ãããªã¡ã«ããºã ããªããçŽç²ã«åŒ·å¶ããããšã¯ã§ããªãã§ããããæ©èœçã
ãããã®è©³çŽ°ã«ã¯ãä»ã®procãã¯ããšæ¯èŒããå®è¡ã®é åºãšåæå®è¡æ§ãããã³proc-macroãã€ã³ã¯ãªã¡ã³ã¿ã«ãã«ãã§åå®è¡ããããã©ãããå«ãŸããŸãã åŸè
ã®å Žåããã«ãã¹ã¯ãªããã§rerun-if-changed
ãšåæ§ã®äŸåé¢ä¿ã宣èšããããã«äœããè¿œå ãããå ŽåããããŸãã ãŸãããã«ãã¹ã¯ãªãããšåæ§ã«ããããã®å®£èšã¯äžå®å
šãŸãã¯ãã°ãããå¯èœæ§ããããŸãã ãã¹ãŠã®ãã°ãéçã«é²ãããšã¯ã§ããŸããã
å¯äœçšã«ã€ããŠäœãä¿èšŒããªãããã«ããå¿ èŠããããšæããŸãïŒã€ãŸããprocãã¯ãã¯ã¬ãŒãã¯å¯äœçšã®åäœã«äŸåããããšã¯ã§ããŸããããŸããé©çšãããã¢ãžã¥ãŒã«ã®ã³ãŒãå€æŽä»¥å€ã®åããªã¬ãŒã«äŸåããããšãã§ããŸããïŒãããã£ãŠãã°ããŒãã«ç¶æ ã¯ãããŸããïŒã
åŸã§ãrerun-if-changedãªã©ãæå®ããæ¹æ³ã§ããã®èŠä»¶ãç·©åã§ããŸãã
ïŒç§ã¯ããã§ãããã圹ç«ã€äžéå端ãªäžè¬çãªãã«ãã¹ã¯ãªãã/ procãã¯ãã»ãã¥ãªãã£ã®ææ¡ãæã£ãŠããŸãããç§ã¯ãŸã ãããå®éã«æžããŠããŸããïŒ
IMO procãã¯ã/ã«ã¹ã¿ã 掟çã¯ãI / Oããã®ä»ã®å€éšæ¥ç¶ãªãã§ãµã³ãããã¯ã¹ç°å¢ã«é 眮ããmiriã«ãã£ãŠãããããã¯ã¬ãŒã³ãªããJITã䜿çšããŠè©äŸ¡ããå¿ èŠããããŸãã
@ est31ããã¯ããèãã§ããããã£ãŒãŒã«infer_schemaã®ãããªãã®ã§ãïŒ ãã§ã«
ååšããå Žåãbindgenã¯ãã¡ã€ã«ãèªã¿åããããã°ã©ã ãå®è¡ããå¿
èŠããããŸãã ãš
envïŒ I / Oã䜿çšããŸãã
2017幎11æ9æ¥06:19ããest31ã [email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
IMOprocãã¯ã/ã«ã¹ã¿ã 掟çã¯ãµã³ãããã¯ã¹ç°å¢ã«é 眮ããå¿ èŠããããŸã
I / Oããã®ä»ã®å€éšæ¥ç¶ãªãã§ã
ããªãå€åã¯ã¬ãŒã³ãªãã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ãã¯ãã®ããã«ã䜿çšãããŠãããã®ãšã¯å¥ã®ã¯ã¬ãŒãã«é 眮ããå¿ èŠããããŸãã
synã§ã¯ãä»æ¥proc_macro :: TokenNodeã®å¶éã«ééããŸãã-ãããã¯åºåãæå{
... }
ã¯å
¥åTokenStreamå
ã®1ã€ã®ã¹ãã³ã«ã®ã¿é¢é£ä»ããããŠãããããããªã¬ãŒããæ¹æ³ã¯ãããŸããçµäº}
ã®ã¿ãæããšã©ãŒã Rustcã«ã¯ãã®å¶éããªãããã§ãã
mod m {
type T =
}
error: expected type, found `}`
--> src/main.rs:3:1
|
3 | }
| ^
procãã¯ãã§å®è¡ã§ããæåã®ããšã¯ããããã¯å ã®æåŸã®ããŒã¯ã³ãæããããããã¯å šäœãæããããããã¯ã®åŸã®æ¬¡ã®ããŒã¯ã³ãæãããšã§ãããããã¯ãããããäžèšã®ãããªãšã©ãŒã«å¯ŸããŠå®éã«å¿ èŠãªãã®ã§ã¯ãããŸããã
äžè¬çãªè§£æ±ºçã¯ã Span::start
ãšSpan::end
ãçŸåšã®LineColumn
ã§ã¯ãªã1æåã®Span
è¿ãããã«ããŠããã Span
ããã¹ãã³ã®æåã®è¡/åã«ç§»åããŸãã
sp.begin().line // before
sp.line() // after
sp.end().line // before
sp.end().line() // after
sp.end() // after, not possible before
ïŒ43604ã§ãã®APIãè¿œå @abonanderã«èšåã
Span :: startãšSpan :: endã¯ãçŸåšã®ããã«LineColumnã§ã¯ãªã1æåã®Spanãè¿ããSpanããSpanã®æåã®è¡/åã«ç§»åããæ¹æ³ãå ¬éããŸãã
ããã«ãããSpanã¯åºåããªã¹ãã«å¿
èŠãªç¹å¥ãªåäœãæ¡çšããŸãããä»ã®ãã¹ãŠã®ã¹ãã³ã§ã¯æ£ãããããŸããã äžè¬çã«ã¯æ£ãããããŸããã ãã®ãçµåããŠfoo(hi)
ãããªåŒã®ã¹ãã³ãååŸããããšãæ€èšããŠãã ããã ä»ãããªãã¯ãæãããã«ãããfoo
ãšåãsp.begin()
ãã sp.begin()
ã®æåã®æåã«ã®ã¿ãã€ã³ããfoo
ã
ããè¯ã解決çã¯ã proc_macro::TokenNode::Group
2ã€ã®ã¹ãã³ãè¿œå ããããä»»æã®ã¹ãã³ãäœæã§ããããã«ããããšã ãšæããŸãã
Span::begin
/ end
ãªã¿ãŒã³ã¿ã€ãã¯å€æŽããå¿
èŠããããããããŸããïŒ https ïŒ
Span::def_site()
ãååŸããŠãæç¶ãåãã¯ãã®ã¹ã³ãŒãå
ã«ãããã®ã«å¯ŸããŠåé¡ã解決ããããšããŠããŸãã ãããã©ã®ããã«æ©èœããã®ã誀解ããŠããŸããïŒ
Span::call_site()
ã䜿çšããmain.rsã§MySend
å®çŸ©ããŠããå Žåãã»ãŒåãã³ãŒããæ©èœããŸããããã¯ãç§ãæåŸ
ãããšããã§ãã ãã ãã 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 ïŒ
@dtolnay
ããã§ã®åé¡ã¯ã MySend
ããã§ãŒãº0ïŒã€ãŸããã¯ãã¹ã³ã³ãã€ã«æã®ãã¹ãã¢ãŒããã¯ãã£çšïŒã§ã€ã³ããŒããããããããã§ãŒãº1ïŒã€ãŸããã¿ãŒã²ããã¢ãŒããã¯ãã£çšã«ã³ã³ãã€ã«ãããšãïŒã§ã¯äœ¿çšã§ããªãããšã§ãã
ããã§ã®è§£æ±ºçã¯ãproc-macro cratesã«ãã§ãŒãº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ã®åºå¥ã«åœãŠã¯ãŸããªãã®ã¯ãªãã§ããïŒ ããã¯æå³çã«æ©èœããŠããŸããããããšãå¶ç¶ã§ããïŒ
Send
ããã«ãç§ã®def_site()
ããŒã¯ã³ã§äœ¿çšã§ããã¹ã³ãŒãã«ã¯ä»ã«äœããããŸããïŒ
MySend
ãã©ã€ãã©ãªããååŸããå¿
èŠãããå ŽåïŒ serde::Serialize
å°åºããŠãããšæ³åããŠãã ããïŒããšã³ããŠãŒã¶ãŒã¯Cargo.tomlã«serde
ãå¿
èŠã§ãã extern crate serde
ãæžãå¿
èŠããããŸãã æç¶ãåãã¯ãã®Cargo.tomlã«å¯ŸããŠdef_site()
IDã䜿çšããŠextern crate
ãäœæããããŠã³ã¹ããªãŒã ã«å¯ŸããŠcall_site()
IDã䜿çšããŠextern crate
ã解決ããããšã¯å¯èœã§ããããã Cargo.tomlïŒ
å€éšã¯ã¬ãŒãã®å Žåãprocãã¯ãã«ãã£ãŠãã§ãŒãº1ã§ã¯ã¬ãŒããæ瀺çã«äœ¿çšã§ããããã«ããå¿ èŠããããšæããŸãã
#[proc_macro_derive(Serialize, attributes(serde), crates(serde))]
@dtolnay
以åã®ã³ã¡ã³ãã®ã³ãŒãã§ãimpl_mysend_forãå€æŽããŠãMySendã§ã¯ãªãSendã®implãçæãããšããã¹ãŠãã³ã³ãã€ã«ãããŸãã ããã¯ã©ã®éä¿¡å ã«è§£æ±ºããããªããã§ãŒãº0ãšãã§ãŒãº1ã®åºå¥ã«åœãŠã¯ãŸããªãã®ã§ããïŒ ããã¯æå³çã«æ©èœããŠããŸããããããšãå¶ç¶ã§ããïŒ
è¯ã質åã çŸåšããã¬ãªã¥ãŒãã¯å®çŸ©ãµã€ãã®ç¯å²å
ã«ããïŒproc-macro crateã#![no_implicit_prelude]
ãªãéãïŒãããã¯ïŒããæå³ã§ïŒãã§ãŒãº0ãšãã§ãŒãº1ã®éãã«ããäºæ
ã§ãã ã
ãã ãã人éå·¥åŠã®å Žåããã§ãŒãº1ã«ã¯proc-macroã«ãŒãã«std
ãæé»çã«å«ãŸããŠããå¿
èŠãããïŒåžžã«quote!(use std::...);
ãã§ããããã«ïŒãå©äŸ¿æ§/人éå·¥åŠã®å眮ããå«ãŸããŠããå¿
èŠããããŸãããããã¯ãã§ã«æé»çã§ããããã§ãããã§ãŒãº0ã§ããã§ãŒãº1ã®ã«ãŒãã«std
ãããã«è¿œå ããPRããããŸãã
Sendã®ããã«ãdef_siteïŒïŒããŒã¯ã³ã§äœ¿çšã§ããã¹ã³ãŒãã«ã¯ä»ã«äœããããŸããïŒ
äžèšã®ãã¬ãªã¥ãŒããšïŒãŸããªãïŒ std
ãŠããã§ãŒãº1ã®ã¹ã³ãŒãå
ã«ããä»ã®ãã®ã¯ãproc-ãã¯ãèªäœã ãã§ãïŒãã§ãŒãº0ã§ããproc-ãã¯ãé¢æ°ã§ã¯ãããŸããïŒã
äŸãã°ã
#[proc_macro]
fn f(input: TokenStream) -> TokenStream { ... }
#[proc_macro]
fn g(_input: TokenStream) -> TokenStream {
quote! {
f!(); ::f!(); // These both resolve to the above proc macro
f(); // This doesn't resolve since the function is in phase 0
}
}
æç¶ãåãã¯ãã®Cargo.tomlã«å¯ŸããŠdef_siteïŒïŒidentã䜿çšããŠextern crateã解決ããããŠã³ã¹ããªãŒã ã®Cargo.tomlã«å¯ŸããŠcall_siteïŒïŒidentã䜿çšããŠextern crateã解決ããããšã¯å¯èœã§ããããïŒ
ã¯ãããã ãã Span::def_site()
å€éšã¯ã¬ãŒãã¯ãæç¶ãåãã¯ãã®Cargo.toml
ã®ãã§ãŒãº1ïŒã¿ãŒã²ããïŒäŸåé¢ä¿ã«å¯ŸããŠè§£æ±ºãããã¯ãã§ããä»æ¥ã®ãã§ãŒãº0äŸåé¢ä¿ã¯ããã¹ããã©ãããã©ãŒã çšã«ã³ã³ãã€ã«ãããã©ã€ãã©ãªã«ãªã³ã¯ãããŠããŸãã ã ãã§ãŒãº1ã®äŸåé¢ä¿ã¯ãŸã ååšããªããããå€éšã¯ã¬ãŒãã®ååã¯éè¡ççã«è§£æ±ºãããŸããããã¯ããææã®ãšããåä»ã§ãã
ãã§ãŒãº1ã®äŸåé¢ä¿ãã§ããããæåã«åæ¡åŒµã§extern crate
ãåŒçšããå¿
èŠããªããããããã¯ããã»ã©åé¡ã«ã¯ãªããŸããã ãã ããããã§ãä¿®æ£ããå¿
èŠããããŸããçŸåšã®èšç»ã§ã¯ãæåã«proc-macro crateã®ã¿ãŒã²ããäŸåé¢ä¿ã解決ããŠããããã£ãŒã³ãåé¿ããããã«åªå
床ã®äœãèŠåãµã€ã¯ã«ã§éè¡ççãªè§£æ±ºã«ãã©ãŒã«ããã¯ããŸãã
å€éšã¯ã¬ãŒãã®å Žåãprocãã¯ãã«ãã£ãŠãã§ãŒãº1ã§ã¯ã¬ãŒããæ瀺çã«äœ¿çšã§ããããã«ããå¿ èŠããããšæããŸãã
#[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ããã®ãã¹ãŠã®ã¿ãŒã²ããäŸåé¢ä¿ã¯ããã§ãŒãº1ã®proc-macroã¯ã¬ãŒãã«ãŒãã§èªåçã«ã¹ã³ãŒãã«å«ãŸããŸãã
ç§ã®ã³ãŒãã§ã¯ãåå解決ãå¶åŸ¡ããç®çãšãšã©ãŒã¡ãã»ãŒãžãå¶åŸ¡ããç®çã®2ã€ã®ç®çã§ã¹ãã³ã䜿çšããŠããããã«èŠããããšãããããŸããã ããã2ã€ã¯äžå¯åã«ãªã³ã¯ãããŠããŸããããããšã1ã€ã®ã¹ãã³ã®åå解決ã®åŽé¢ãšå¥ã®ã¹ãã³ã®è¡/åã®ãšã©ãŒã¡ãã»ãŒãžã®å Žæãæ··åšãããã¹ãã³ãäœæããããšã¯å¯èœã§ããããïŒ ããã¯äžè¬çãªããŒãºã ãšæããŸãã
å ·äœçã«ã¯ãã«ã¹ã¿ã 掟çã®def_siteå ã«ãã¬ã€ããã¹ã³ãŒãã«å ¥ãããŠãŒã¶ãŒã®æ§é äœã®ãã£ãŒã«ãã§ãã¬ã€ãã¡ãœãããåŒã³åºããããšèããŠããŸãã ãã£ãŒã«ãã¿ã€ããæ£ããç¹æ§ãå®è£ ããŠããªãå Žåã¯ããšã©ãŒã¡ãã»ãŒãžã§å¯Ÿå¿ããæ§é äœãã£ãŒã«ãã«äžç·ãä»ããå¿ èŠããããŸãã
ã³ã³ãã€ã«ããŠå®è¡ããdef_sitespanã䜿çšããŠã¡ãœããåŒã³åºããçæã§ããŸãããæ®å¿µãªããããã¯ã1.1ã§èŠãããã«ããšã©ãŒã¡ãã»ãŒãžã¯åžžã«æŽŸçå±æ§ãæããŸãã
|
4 | #[derive(HeapSize)]
| ^^^^^^^^
ãŸãã¯ãæ§é äœãã£ãŒã«ãã®identãŸãã¯typeãšåãã¹ãã³ã§ã¡ãœããåŒã³åºããçæã§ããŸããããã¯ãæ£ããäžç·ã瀺ããŠããŸãããdef_siteã®ã¹ã³ãŒãå ã®ç¹æ§ã«è§£æ±ºã§ããŸããã
|
7 | bad: std::thread::Thread,
| ^^^^^^^^^^^^^^^^^^^^^^^^
ã©ãããã°æ£ãã解決ããŠãåžæã©ããã«ãšã©ãŒã衚瀺ã§ããŸããïŒ
@dtolnayããã¯çŽ æŽããããã€ã³ãã§ããããããšãã
https://github.com/rust-lang/rust/issues/46489ãä¿®æ£ããé©åãªæ¹æ³ã¯ãçæããã#[derive(âŠ)]
ããŒã¯ã³ãåãåå解決ã¹ãã³ãæã€ããã«ããããšã ãšæããŸããã¿ã€ãå®çŸ©ãšããŠã®ã¹ã³ãŒããããã³ããããäœæããquote! {}
ãã¯ãåŒã³åºãã§ã®ãšã©ãŒã¡ãã»ãŒãžã¹ãã³ã
çŸåšã®è¡çã®è©±ã¯äœã§ããïŒ ç§ã¯ïŒ4ãæåã«ïŒæ©èœããŠããæç¶ãåãã¯ãã®ãããªæ©èœãæã£ãŠããŸãããrustc 1.24.0-nightlyïŒb65f0bedd 2018-01-01ïŒã®æç¹ã§ãåŒæ°ãã¹ã³ãŒãå ã«èŠã€ãããªããšæå¥ãèšããŸãã
ç³ãèš³ãããŸããããæåã«èª²é¡è¿œè·¡ã·ã¹ãã ãæ€çŽ¢ããå¿ èŠããããŸãããhttpsïŒ//github.com/rust-lang/rust/issues/46489ã«ã¢ã¯ã»ã¹ããããã§ãã
ç§ã¯çŸåšãderiveïŒDeserializeïŒã®æ£ããå®è£ ããããã¯ããŠãããšæãïŒ47311ãæåºããŸããã æç¶ãåãã¯ãã¯ããã©ã€ããŒããã£ãŒã«ããæã€æ§é äœãæ§ç¯ã§ããŸããã
self.0
ãããªååã®ãªãã¿ãã«æ§é äœãã£ãŒã«ããžã®ã¢ã¯ã»ã¹ãself.x
ãããªååã®ä»ããæ§é äœãã£ãŒã«ããžã®ã¢ã¯ã»ã¹ãšã¯ç°ãªã.
ããŒã¯ã³ã®ã¹ãã³ã®èŠä»¶ãæã€å¥ã®ïŒ47312ãæåºããŸããã
äžèšã®2ã€ã®PRãã¬ãã¥ãŒ/ã³ã¡ã³ããåŸ ã£ãŠããŸãã
https://github.com/rust-lang/rust/pull/41029ãå®äºããããã«èŠã
ãã®PRã¯æŸæ£ãããŸãããã埩掻ããïŒ48465ã§åŒãç¶ãåãçµãã§ããŸãã çŸåšã¯ã¬ãŒã¿ãŒãåŸ ã£ãŠããŸãã
@petrochenkov @nrc
syntax::ext::expand
ãèŠããšã proc_macro_attribute
ã¯çŸåšãããã€ãã®ã³ã³ããã¹ãã§åŠçãããŠããªãããã§ãïŒç¶²çŸ
çã§ã¯ãããŸããïŒã
fold_block()
ã¯noopã§ãïŒextern {}
ãããã¯å
ïŒïŒ48747ïŒRFC 1566ã«ã¯ãå±æ§ãã¯ããé©çšã§ããç¹å®ã®ASTããŒãã®çš®é¡ããªã¹ããããŠããªããããã»ãŒãã¹ãŠã«é©çšã§ããã¯ãã§ãã ããããããã¯å°ãã°ãããŠããå¯èœæ§ãããã®ã§ãåŠçããå¿ èŠããããåŠçããå¿ èŠããªããã®ãããã³å±æ§ã¯èš±å¯ãããã¹ãã§ã¯ãªããçŸåšã¯èš±å¯ãããŠããå¯èœæ§ãããå Žæãæ確ã«ç¢ºç«ããå¿ èŠããããŸãïŒïŒ43988ïŒ
@abonanderã®æå³ã¯ãprocãã¯ãå±æ§ã¯ãéåžžã®å±æ§ããããä»ã®å Žæã§ã¯äœ¿çšã§ããªãããšã§ããããã¯ãäžèšã®ãã¹ãŠãã«ããŒããŠãããšæããŸãïŒãã ããäžéšã¯å®å®ããŠããŸãããprocãã¯ããå®å®ãããå Žåã¯ã次ã®ããšã«æ³šæããå¿ èŠããããŸããä»ã®å±æ§ã«å¯ŸããŠå®å®ããŠããçšéã®ã¿ãå®å®ãããŸãïŒã
@nrcã¯ããããã®å Žæãåæããå Žæã«ãããŸããããã¢ã€ãã ã«é©çšã§ãããšã ãèšèŒãããŠããããã§ãã ãã ããlintå±æ§ã¯ãããã¯ãã¹ããŒãã¡ã³ãã«ãé©çšã§ãããšã»ãŒç¢ºä¿¡ããŠããŸãã
@nrcã¯ããããã®å Žæãåæããå Žæã«ãããŸããããã¯ãåç §ã§ã¯ãå±æ§ã¯ä»»æã®ã¢ã€ãã ã«é©çšã§ãããšã ãèšèŒãããŠããããã§ãã ãã ããlintå±æ§ã¯ãããã¯ãã¹ããŒãã¡ã³ãã«ãé©çšã§ãããšã»ãŒç¢ºä¿¡ããŠããŸãã
afaikã¯ãããŸãã-åãå ¥ããããRFCãšãä»»æã®åŒã®å±æ§ã«å¯Ÿããäžå®å®ãªæ©èœãã©ã°ããããŸãããã¹ããŒãã¡ã³ããšãããã¯ã§ã®ã¿å®å®ããŠãããšæããŸãã åç §ãããŒã¿äžè¶³ã§ãã
ãã®åé¡ïŒ
å®å®æ§ãã§ãã¯ïŒproc-ïŒãã¯ãïŒåé¡ïŒ34079ïŒã
çŸåšãWRTproc-macrosã¯éããããŠããŸãã ç§ã®PRã¯ãMacros 2.0ãã¯ãã®å®å®æ§ãã§ãã¯ãè¿œå ããªãã£ããããåé¡ã¯ãŸã 解決ãããŠããŸããïŒãã ããããããæ°ããåé¡ã§ããã¯ãã§ãïŒã
@rfcbotfcpããŒãž
Rust1.28ãªãªãŒã¹ã®ãã¯ã1.2ãšããŠå®å®åããããã¯ã2.0ã¹ããŒãªãŒã®ãµãã»ãããææ¡ããããšæããŸãã Rust 1.28ã¯2018幎5æ10æ¥ïŒãã®èšäºã®å·çããçŽ2.5é±éïŒã«æ¯æ©å ¥ãã2018幎8æ2æ¥ã«å®å®ããŸããFCPã¯1.27ã®ããŒã¿çã«å ¥ã5æ10æ¥ã®ã«ãããªãã®åã«çµäºããå¯èœæ§ããããšæããŸãããä¿æããããšæããŸããã®ã«ãããªããçºçãããŸã§ããã§å®å®åããªãã«ããããã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ã«3çªç®ã®åå空éãå°å
¥ãããŸãïŒå€/ã¿ã€ãã«å ããŠïŒ
åå空éïŒããã¯ãåå空éã å±æ§ãmacro_rulesãããã³æç¶ãå
ãã¯ãã¯ãã¹ãŠmaroåå空éã«ãããŸãã
æ¬æ Œçãªã¢ãžã¥ãŒã«ã·ã¹ãã ãšã®éãã¯ã 1ã€ã®èŠçŽ ã ãã§ãããšããããšã§ããã¹ã¯åŒã³åºãããšãã§ããŸããã¯ãã
ããšãã°ã #[foo::bar]
ãŸãã¯::bar::baz!()
ã¯èš±å¯ãããŸããã ãã®
å¶éã¯ãã€ã解é€ããããããããŸããããããã¯
ç®åãã«ã
å±æ§ã¯éã¢ãžã¥ãŒã«ã«ã®ã¿é©çšã§ããŸãã¢ã€ãã ã
ããã§ã®ãã¢ã€ãã ãã«ã¯ããã¬ã€ãã¢ã€ãã ãimplã¢ã€ãã ãå€éšã¢ãžã¥ãŒã«ãªã©ãå«ãŸããŸã
ã¢ã€ãã ã ã¢ãžã¥ãŒã«ã®æ¡åŒµã¯ãè¡çç¶æ
ãš
å®è£
ã®åœ±é¿ã ãããæå®ããŠå®å®ãããã®ã¯
åŸæ¥ã
ã¹ããŒãã¡ã³ããšåŒã®å±æ§ãã¯ãã¯ãŸã å®å®ããŠããŸããã ããã¯
äž»ã«ãçºçŸã¬ãã«ã§ã®è¡çã®çã®å¿
èŠæ§ã«ãããã®ã§ãïŒ
ã¢ã€ãã ã¬ãã«ãšã¯å¯Ÿç
§çïŒã ããã¯åŸæ¥å®å®ãããããã«æ®ãããŠããŸãã
æåŸã«ãå±æ§ãã¯ãã«ã¯å
éšã«åŒæ°ãå¿
èŠã§ãåºåãæåã
ããšãã°ã #[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ã¢ã€ãã ãçæããéã®è¡çç¶æ
ã«ã€ããŠã®ã¿å¿é
ããå¿
èŠããããŸãã
ããŒãã
æ°ããã¢ã€ãã ã¯ãä»æ¥ã®macro_rules!
ãšåãè¡çç¶æ
ã«ãªããŸãã 圌ãã¯
è¡ççã§ã¯ãããŸããã ASTã«è¿œå ãããæ°ããã¢ã€ãã ã¯ããšåãåå空éã«å
¥ããŸã
ã¢ãžã¥ãŒã«å
ã®ä»ã®ã¢ã€ãã ã
proc_macro
APIãããããã¹ãŠå¯èœã«ããããã«ã次ã®è¡šé¢ç©ãå®å®ããŸã
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ã·ã¹ãã ã¯ãè³ãæã§åºãããã°ããŒãã£ã³ã°ãããŠããŸã
ããªãé·ãéãçæ
ç³»ã ç¹ã«ããã®ææ¡å
šäœã
proc-macro2
ã¯ã¬ãŒãã®0.3ãªãªãŒã¹ãéããŠåºç¯å²ã«ãã¹ããããŸãã
syn
ã¯ã¬ãŒããåæ§ã§ãã ãã¹ããéããŠãå€ãã®ãã°ãçºçããŸãã
èå¥ãããä¿®æ£ãããçŸåšã®ã·ã¹ãã ã¯ã
å®å®ããŸããã ïŒãã°ããªããšããããã§ã¯ãããŸããïŒïŒ
ããŒã ã¡ã³ããŒã®@alexcrichtonã¯ããããããŒãžããããšãææ¡ããŸããã 次ã®ã¹ãããã¯ãã¿ã°ä»ããããæ®ãã®ããŒã ã«ããã¬ãã¥ãŒã§ãã
çŸåšãªã¹ããããŠããæžå¿µã¯ãããŸããã
ã¬ãã¥ãŒã¢ã®éåæ°ãæ¿èªãããšïŒãããŠå察ã¯ãããŸããïŒãããã¯æçµã³ã¡ã³ãæéã«å ¥ããŸãã ãã®ããã»ã¹ã®ã©ã®æç¹ã§ãæèµ·ãããŠããªã倧ããªåé¡ãèŠã€ããå Žåã¯ã声ãäžããŠãã ããã
ã¿ã°ä»ããããããŒã ã¡ã³ããŒãç§ã«äžããããšãã§ããã³ãã³ãã«ã€ããŠã¯ããã®ããã¥ã¡ã³ããåç §ããŠãã ããã
cc @ rust-lang / compilerãy'allç§ãç¥ã£ãŠããããšã§ãããããã«ãéåžžã«èå³ããããŸããç°è°ãå±ããŠãã ããã ããããã³ã°ã®ç°è°ãããå Žåã¯ãç»é²ããããšãã§ããŸã
å®å®åã®ããã«ææ¡ãããæäŸãããAPIã䜿çšãããšãprocãã¯ãã¯ããããçš®é¡ã®ããŒã¯ã³ãç°¡åã«çæããããå
¥åããåºåã«ã³ããŒãããã§ããŸãããè¡šé¢çãªã¬ãã«ã§ããããŒã¯ã³ã®ã¹ããªãŒã ãç°¡åã«æ€æ»ã§ããªãããã§ãã ããšãã°ã Literal
ã¯Eq
ãŸãã¯PartialEq
å®è£
ããŠããŸããã ãã®ç¹å¥ãªçç±ã¯ãããŸããïŒ ïŒããã§ããå€ãæœåºããŠã³ãŒãã§åŠçããã®ã§ã¯ãªããæå®ãããå®æ°å€ãšã®æ¯èŒããã§ããŸãããïŒ
TokenStream
äžããããå Žåãprocãã¯ãã®å®è£
å
ã§ãprocãã¯ãã¯ãªãã©ã«ãã€ã³ããã¹ãã¯ãããããã«äœãã§ããŸããïŒ ãŸãã¯ããã®ããšã«ã€ããŠã¯ã1ã€ã®å€ãæœåºããŸããïŒ ããã¯åã«ãŸã ãµããŒããããŠããŸãããïŒ ä»åŸããµããŒãããäºå®ã¯ãããŸããïŒ
ïŒç§ã¯ææ¡ããããµãã»ããã®å®å®åããããã¯ããããšã¯ããŠããŸããããã®ãµãã»ãããšãã®æå³ãããæ©èœãããããç解ããããšæããŸããïŒ
@alexcrichtonæ°ããã¢ã€ãã ã¯
è¡ççã§ã¯ãããŸããã ASTã«è¿œå ãããæ°ããã¢ã€ãã ã¯ããšåãåå空éã«å ¥ããŸã
ã¢ãžã¥ãŒã«å ã®ä»ã®ã¢ã€ãã ã
ç§ã¯Rustã³ã¢ããŒã ã«æå±ããŠããããéå»ã®ãã¹ãŠã®è°è«ãååã«æ€èšããŠããŸããããããã¯ç§ã«ãšã£ãŠæ¬åœã«æªãããšã®ããã«æããŸãã ãã¯ããããã¯ãããã®ã¿ã¢ã¯ã»ã¹ã§ãããã«ããŒã¢ã€ãã ãçæãããå Žåã¯ã©ããªããŸããïŒ
è¡çç¶æ ãæšãŠãããããå®å šãª100ïŒ ã®è¡çç¶æ ã匷å¶ããæ¹ãè¯ããšæããŸããããã¯ããç¹å®ã®å€æ°ã®è¡çç¶æ ãæ瀺çã«ãªããã¢ãŠãããæ¹æ³ãæäŸããŸãã
@joshtriplettã¯ããªãã©ã«ã®
@joshtriplettããã @ dtolnayãèšã£ãããã«ã Display
ã䜿çšããŸããããã¯ã literalextã®ãããª
ãã®äžé£ã®å®å®åã¯ããã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ãã«ããŒããããã«æå°éã®æ©èœãæäŸãããšããæå³ã§ãæ倧éã«æå°éã«æãããããšãç®çãšããŠããŸãïŒ Literal
å Žåã¯Display
ã§ãããããã解éãããã®ã¯ä»ã«ãããŸããïŒã ïŒã
@Pauanããã¯çŽ æŽãããããšã§ã¯ãããŸããããããã¯macro_rules!
ãšãŸã£ããåãã§ããããã¯ãäœå¹Žãã®éå®å®ããŠããŠãããŸããŸãªã³ã³ããã¹ãã§æ©èœããŠããŸãã ããã§è¡çãšããè¯ãæ²»çãå¯èœã«ããããšSpan::call_site()
ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãããã§ã®èŠã§ãããããã䜿çšããããšã§ãè¡çç¶æ
ãªãããèŠæ±ããŸãã æçµçã«ã¯ãããå€ãã®ãªãã·ã§ã³ãå®å®ãããŸãã
æ®å¿µãªããããå®å šãª100ïŒ è¡çãã¯æ°å¹Žå ã«ããããã®ææ¡ã®ç®çã¯ãRust2018ã§å®å®ãããã®ãå ¥æããããšã§ãã
@alexcrichtonã§ã¯ãä»ã¯è¡çããŒã«ã§å®å®ããããã®åŸãããã€ãã®ãšããã¯/æ代/ãšãã£ã·ã§ã³ã§ãã®è¡çããŒã«ãä¿®æ£ããèšç»ã§ããïŒ
Span::call_site()
ãååšããã®ã§ãçŸåšå®å
šãªè¡çç¶æ
ãä¿ã€ããšãã§ããªãçç±ã¯ãããŸããïŒ ããã¯äººçè³æº/æéã®äžè¶³ã§ããããããšãRFCã§å
·äœåããå¿
èŠãããçè«ç/æå³è«çæžå¿µããããŸããïŒ
@Pauanã¯ãä»æ¥ãã§ã«ååšããŠãããšããæå³ã§ãæ¬åœã®ãç©Žãã¯ååšããªãããšãç¹°ãè¿ãè¿°ã¹ãŸãã ããã¯ã macro_rules!
ãšã«ã¹ã¿ã 掟çã®ãŸã£ããåãè¡çã¹ããŒãªãŒã§ãã ãã®ææ¡ã¯äºå®äžãã®å»¶é·ã§ãããæ°ãããã®ãå°å
¥ãããã®ã§ã¯ãããŸããã
ãå®ç§ãªè¡çã¹ããŒãªãŒããèãããšãç§ãã¡ã¯åžžã«äœããã®åœ¢ã®ãªããã¢ãŠããæãã§ããŸãã çŸåšããã®ãªããã¢ãŠãã¯Span::call_site()
ïŒäºå®äžïŒã å®å®ãããã ãã§ãè¡çã®ãªããã¢ãŠãã¡ã«ããºã ãå®å®ãããã ãã§ãã æçµçã«ã¯ãå¿
èŠã«å¿ããŠã¢ã€ãã ãå®å
šã«è¡ççã«ããããã«ãããå€ãã®æ©èœãå®å®ãããŸãã
è¡çç¶æ ã®å®å®åã¯ã¯ããã«é ãã§ãã ïŒAFAIKïŒæªè§£æ±ºã®ç 究ã®è³ªåããããŸããããã¯äººçè³æºã®åé¡ã§ã¯ãããŸããã
@dtolnayããããªãã»ã©ã ã§ã¯ãããã¹ããçæããŠãããããã¹ããå解æããŸããïŒ ãšããããã¯ããŸããããšæããŸãã
cc @ rust-lang / compilerãy'allç§ãç¥ã£ãŠããããšã§ãããããã«ãéåžžã«èå³ããããŸããç°è°ãå±ããŠãã ããã ããããã³ã°ã®ç°è°ãããå Žåã¯ãç»é²ããããšãã§ããŸã
ç§ã¯ãŸã ã¬ãã¥ãŒããããšãããã€ããããããã€ãã®proc-macroAPIã®èª¿æŽãé²è¡äžã®PRããããŸãã
ããã¯ãmacro_rulesãšãŸã£ããåãè¡çã¹ããŒãªãŒã§ãã ãšã«ã¹ã¿ã 掟çã
ãã¡ããã§ãããç®æšã®1ã€ã¯ããè¯ããã¯ãã·ã¹ãã ãäœãããšã ãšæã£ãã®ã§ãæ¢åã®ïŒå£ãããå¶éãããïŒã·ã¹ãã ãæãããšã¯ç§ã«ã¯ããŸã説åŸåããããŸããã
ãå®ç§ãªè¡çã¹ããŒãªãŒããèãããšãç§ãã¡ã¯åžžã«äœããã®åœ¢ã®ãªããã¢ãŠããæãã§ããŸãã
ãã¡ããã§ãããç§ã®ãã€ã³ãã¯ãå¿
èŠã«å¿ããŠSpan::call_site()
ã䜿çšããŠè¡çç¶æ
ãç Žãããšãã§ããããïŒãããã£ãŠã macro_rules!
æ©èœãååŸã§ããããïŒ ãããã©ã«ãã§è¡çç¶æ
ã«ããããšã§ã ãã§ç«ã¡åŸçããŠ
æçµçã«ã¯ãå¿ èŠã«å¿ããŠã¢ã€ãã ãå®å šã«è¡ççã«ããããã«ãããå€ãã®æ©èœãå®å®ãããŸãã
ãããè¿·æãªïŒãšæ··ä¹±ãæãïŒãã³ããšã€ãã®ãããªããã¯é³ïŒPROCãã¯ãã¯ãã»ãšãã©ã®ç¶æ³ïŒãã ãé ç®ïŒã§è¡ççã«ãªããŸãããããªãã¯ãã®åŸãã¢ã€ãã ã®ããã«ãªããã€ã³è¡çãžã®æ°æ©èœã䜿çšããããšãã§ããŸãã ç§ã¯ãã®æš©å©ãç解ããŠããŸããïŒ
ïŒAFAIKïŒæªè§£æ±ºã®ç 究ã®è³ªåããããŸããããã¯äººçè³æºã®åé¡ã§ã¯ãããŸããã
ããŠãããã¯ååã«å ¬å¹³ã§ãã ç§ã¯äŸ¿å®ãšå®çšäž»çŸ©ãžã®æ¬²æ±ãç解ããŠããŸãã åŸã®ãšããã¯/æ代/ãšãã£ã·ã§ã³ã§æçµçã«ããã©ã«ãã§ãã£ããããè¡çç¶æ ã«ãªãèšç»ã§ããéããäžæçã«æªãè¡çç¶æ ã«ãªã£ãŠã倧äžå€«ã§ãã åŸã§åŸæãããããªãã®ãå®å®ãããããªãã ãã§ãã
ããæå³ã§ãããã¯ãã§ã«ãããããã©ã«ãã§è¡ççããããã¯ããã©ã«ãã¯ãŸã ãµããŒããããŠããªãã ããšããããšã§ãã Span::call_site
ã¯ãªããã¢ãŠãã§ãã :)
@Pauan @alexcrichtonãèšã£ãããšã詳ãã
èå¥åãäœæããã«ã¯ãè¡çæ
å ±ãå«ãSpan
ãå¿
èŠã§ãã ïŒ Term::new
ïŒ
å°æ¥çã«ã¯ã Span
ãæ§ç¯ããããã®ããŸããŸãªæ¹æ³ãå
¬éããå¯èœæ§ããããŸããããã¯ãè¡çã«é¢ããããŸããŸãªãªãã·ã§ã³ãåæ ããŠããŸãã ãã ããçŸæç¹ã§ã¯ãåŒã³åºãå
ã®ã¹ã³ãŒããååŸããSpan::call_site
ã®ã¿ãå
¬éããŸãã
ãã®ããã«ããŠãåŸã§è¡çç¶æ ãè¿œå ããæ©èœãéãããŸãŸãè¡çã·ã¹ãã å šäœãããã«å®å®ãããããšãåé¿ã§ããŸãã ãã®åé¡ãåé¿ããã®ã¯ããªãè³¢ãããªãã¯ã ãšæããŸãïŒ
@rpjohnstã€ãŸããprocãã¯ãããæ°ããã¢ã€ãã ãè¿ãå¯äžã®æ¹æ³ã¯ã Span::call_site
ã䜿çšããããšã§ãã
ãããããªããããã¯å®ç§ã«èãããŸãïŒãã®å Žåãè¡çã¯ç¢ºãã«å°æ¥ãã¯ãªãŒã³ã§äžäœäºææ§ã®ããæ¹æ³ã§è¿œå ããããšãã§ããŸãã
@lfairyããããªãã»ã©ã Span::call_site
ã䜿çšããå¿
èŠã
ãã®ããããã以äžç°è°ã¯ãããŸããã
@alexcrichton
å±æ§ãmacro_rulesãããã³æç¶ãå
ãã¯ãã¯ãã¹ãŠmaroåå空éã«ãããŸãã
æåŸã«#[feature(proc_macro)]
ã§ç¢ºèªããŸããããããã§èª¬æããããã«ã derive-error-chainã¯ã¬ãŒãã®å®å®ããã³ãŒãã«åŸæ¹äºææ§ã®ãªãå€æŽããããŸããã åŒçšãããã¹ããŒãã¡ã³ãããããã¯ã1.2ã§ã¯ãã®ããã«ãªãç¶ããããã§ãã ããã¯æ£ããã§ããïŒ
@Arnavionãããããã¯æªãã§ããïŒ åŸæ¹äºææ§ã®ãªã倧ããªå€æŽãå®éã«è¡ãããšã¯ã§ããªãããããããæ©èœããç¶ããæ¹æ³ãèŠã€ããå¿
èŠããããŸãã èãããã解決çã®1ã€ã¯ããããã¯å±æ§ã§ã¯ãããŸããããšã©ãŒã#[derive]
æ¡åŒµåŸãŸã§å»¶æããããšã§ãã
ïŒ48644ãšïŒ47786ãå®äºããããã§ãã 誰ããOPãæŽæ°ã§ããŸããïŒ
@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
implãäœæããããšãã§ããŸãã
@abonanderãããããã¯è°è«ãããŸããããçµè«ã¯ãå®å®åã®æåã®ãã¹ã«å¿
èŠã«ããã®ã§ã¯ãªããåŸã§ããããè¿œå ããããšã§ããã ãããã¯ã Display
å®è£
ã䜿çšããŠcrates.ioäžã«æ§ç¯ã§ããå°æ¥çã«è¿œå ããäœå°ããããŸãã
@alexcrichton
procãã¯ãAPIã¿ã€ãã®!Send
ããã³!Sync
implsã¯æ瀺çã«èšè¿°ãããŠããŸããããæšæž¬ãããŸãã
äžéšã®æ§é äœïŒäŸïŒ Op
ïŒã®å Žåãæšæž¬ãããimplã¯https://github.com/rust-lang/rust/issues/38356#issuecomment-383693017ã§æå®ãããŠãããã®ãšã¯ç°ãªããŸãã
implãæ瀺çã«è¿œå ããããšã¯ããããçã«ããªã£ãŠããŸãã
ã¯ãã確ãã«ããã§ãïŒ ããã«å¯ŸåŠããããã«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
ãæäŸããããã§ããããã¯ã Term::as_str
æåããå
éšã¹ã³ãŒããããå³å¯ã«çããªããŸãã
äžè¬ã«ã proc_macro
æ¡åŒµãè¡ãããæ¹æ³ãããã³Term
ã¯ã¹ã¬ããããŒã«ã«ã§ããããã Term
ããšã¹ã±ãŒãããæ¹æ³ã¯ã»ãšãã©ãªãã thread_local!
ãæ³å®ããŸãããäºå®äžå¯äžã®ãã®ã§ããã
ãããã Box::leak
ãååšããŸãïŒ ãŸã äžå®å®ã§ãããä»æ¥ã Box::leak(Box::new(term)).as_str()
ã¯&'static str
è¿ããŸãã Box::leak
ïŒcc @RalfJungïŒã«ãã£ãŠå£ãããä»ã®æœè±¡åãããã®ã ããã
OTOHãããã¯è€éã§ãã Term
ã¯Copy
ãããæååããŒã¿ãææã§ããªãããã§ãã
Term
ã®Copy
ãåé€ãããšãããã«æ æ°ãªOption<Cell<Rc<String>>
ãä¿æã§ããŸãã
@eddyb oh Term::as_str
ã¯åé€ãããäºå®ã§ãããããã§ã¯å®å®åã«å«ãŸããŠããªãã£ãã®ã§ãå¿é
ããå¿
èŠã¯ãããŸããã proc-macro2
å£ããªãããã«åºå·ããŠããã ãã§ããããããå®å®ãããã proc-macro2
å£ããå€æŽããªãªãŒã¹ã§ããŸãã
@eddybããã§ã®ã³ã³ããã¹ãã¯ããããŸããããæ£åŒãªã¢ãã«ã§ã¯Box::leak
ãæ£åœåãããŸãã ããªããæ°žé ã«ïŒããªãã¡ãç®±ã®äžã«ïŒããããã®èšæ¶ãææããŠãããªããããªãã¯ãããã©ããªå¯¿åœãæã£ãŠãããšå®å
šã«èšãããšãã§ããŸãã
ããã€ãã®è³ªåãèããããã§ãïŒ
quote!
ã¯å®å®ããŠããŸãããïŒquote!
ã«ã¯proc_macro_non_items
æ©èœã²ãŒããé©çšãããŸããïŒ Commit 79630d4fdfc775b241cae0a209edec2687a29f0fã§å¿
èŠã«ãªããŸãããã quote!
ã¯åŒãç¶ã#[unstable(feature = "proc_macro" ...
ããŒã¯ãããŠããŸããproc_macro_path_invoc
ã proc_macro_mod
ã proc_macro_expr
ãããã³proc_macro_non_items
ã®å®å®åã®ããã«ã远跡ã®åé¡ãæåºãããŸããïŒç¡é¢ä¿ãªå¯æ¬¡çãªè³ªåïŒ quote!
ã¯ã©ãã«å®è£
ãããŠããŸããïŒ
ãã£ãã楜ããç©èª@mjbshawïŒãããã§å®è£
ãããŠããproc_macro::quote
ã
rustc_metadata
ã¯ã proc_macro
ãšããååã®ã¯ã¬ãŒãã«quote
ãšããååã®æç¶ãåãã¯ããå«ãŸããŠããããã«èŠããããŸããã䜿çšãããå®è£
ã¯proc_macro
rustc_metadata
ã«å¯Ÿãããªã³ã¯ã
ç§ã¯ãŸã ã¬ãã¥ãŒããããšãããã€ããããããã€ãã®proc-macroAPIã®èª¿æŽãé²è¡äžã®PRããããŸãã
PRã®ã¬ãã¥ãŒïŒ https ïŒ
1.2 APIã®æ©èœãªã¯ãšã¹ãïŒå±±ãã£ãïŒ <
/ >
ïŒã®åºåãæåãè¿œå ããŠã <T>
ïŒ fn foo<T>() {}
ïŒã®ãããªãã®ã次ã®ããã«è§£æãããããã«ããŸãã Group
ã ãããè¡ããªããšãããšãã°ãžã§ããªãã¯ã®è§£æãäžå¿
èŠã«è€éã«ãªããŸãã
@mjbshaw 2ã€ã®<
>
ãäºãã«ã°ã«ãŒãåãããŠãããã©ãããå€æããããšããããšã¯ãããŒã¯ã³ã¬ãã«ã§ã¯æ©èœããªããšæããŸãã ããšãã°ã次ã®ãã¯ãå
¥åã§ã¯ã次ã®ããã«ãªããŸãã
m!($A<$B, $C>=$D);
ããã¯ã2ã€ã®ããŒã«åŒ$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ãå°ãæŽæ°ããŸããããçµæã«å¿ããŠãè¡çã«é¢é£ãã2ã€ã®å¯èœæ§ã®ããã·ã§ãŒããããŒãã°ã®ããã«èŠããŸãã
ãã®ã¹ã¬ããããã©ããŒããŠããå ŽåãAPIã¯@petrochenkovã«ãã£ãŠææ¡ãããhttps://github.com/rust-lang/rust/pull/50473ã®å ã®FCPã³ã¡ã³ãããå€æŽãããå¯èœæ§ããããŸãã ãããŸã§ã®èŠçŽã¯æ¬¡ã®ãšããã§ãã
Term::new
ååãTerm::ident
ã«å€æŽããå
¥åãæ€èšŒããŸãTerm::lifetime
ãè¿œå ããå
¥åãæ€èšŒããŸãTerm::raw_ident
ãè¿œå ããå
¥åãæ€èšŒããŸãOp
ååãPunct
Punct::new
å
¥åãæ€èšŒããŸãOp::op
ååãPunct::as_char
ç§ãè¡ããã€ããŒãªAPIãªã¯ãšã¹ãã®1ã€ïŒããããïŒ50473- @ petrochenkovïŒã¯ãTokenStreamã«ããŒã¯ã³ãè¿œå ããæ¹æ³ã§ãã ããããïŒ
impl Extend<TokenTree> for TokenStream
ããã«ããã quote::Tokens
ã¿ã€ãïŒåºæ¬çã«ã¯Vec<TokenTree>
ïŒãæé€ãããã¹ãŠãããã€ãã®ããŒã¯ã³ããæå³ãããšã³ã·ã¹ãã å
ã®ããŸããŸãªã¿ã€ãã®æ¡æ£ãæžããããšãã§ãããšæããŸã-httpsã§è¿œè·¡
@dtolnayã®äžèšã®ææ¡ã«+1ã
äžèšã®ããŒãžããåŸåã®ããæåŸã®ã³ã¡ã³ãæéãå®äºããŸããã
2ã€ã®è³ªåããããŸãïŒ
ãã§ã«ããã§å°ããããããquote!
ã©ãã§ããïŒ æçµçãªTokenStream
ãäœæããããã®ããã©ã«ãã®æ¹æ³ã¯äœã§ããïŒ æåã§è¡ãå¿
èŠããããŸããïŒ ãŸãã¯ã quote
ã¯ã¬ãŒãã䜿çšããå¿
èŠããããŸããïŒ proc_macro::quote!
ã¯å°æ¥ã®ããæç¹ã§å®å®ããã¯ãã§ããïŒ
é¢æ°ã®ãããªãã¯ããšå±æ§ã®ãããªãã¯ãã®å®£èšã®éãã¯åŒæ°ã®æ°ã ãã§ãããšããç¹ã§ãç§ã®ç解ã¯æ£ããã§ããïŒ NSïŒ
/// Invoked as `foo!()`
#[proc_macro]
pub fn foo(a: TokenStream) -> TokenStream {
// ...
}
/// Invoked as `#[bar]`
#[proc_macro]
pub fn bar(attr: TokenStream, item: TokenStream) -> TokenStream {
// ...
}
å¯äžã®éãã¯ãäžæ¹ãåŒæ°ãšããŠ1ã€ã®TokenStream
ãåããããäžæ¹ã2ã€ãåãããšã§ãã ããã¯å°ã埮åŠã§ã¯ãããŸãããïŒ ä»£ããã«#[proc_macro_attribute]
ãš#[proc_macro_function_like]
䜿çšããŠã¿ãŸãããïŒ ããã¯ã©ããã§è°è«ãããŸãããïŒ ãããããªãã誰ããè°è«ããªã³ã¯ããããšãã§ããã°ç§ã¯å¹žãã§ãã
ããã«åãçµãã§ãããŠããããšãïŒ :)
@LukasKalbertodtå±æ§ã¯çŸåšã #[proc_macro_attribute]
宣èšãããŠããŸãã ãããå€æŽããæå³ãããã®ãââããããšãFCPææ¡ã®ã¿ã€ããã¹ãªã®ãã¯ããããŸããã
åé¡ïŒæååãã解æãããããŒã¯ã³ã¯Span::call_site
ã¹ãã³ãååŸããŸããïŒ https ïŒ//github.com/rust-lang/rust/issues/50050#issuecomment-390520317ã
ãããå€æŽãã Span::call_site
ãè¿ããã®ãå€æŽããŠãåŒã³åºããµã€ãã¹ãã³ã䜿çšããããŒã¯ã³ã®ãã¯ãããã¯ãã¬ãŒã¹ãã¯ãªãããããã³ãšãã£ã·ã§ã³ã®è¡çç¶æ
ãä¿®æ£ããå¿
èŠããããšæããŸãã
@LukasKalbertodt proc_macro
ã¯ã¬ãŒãã®quote!
ãã¯ãã¯ããã®FCPã®äžéšãšããŠå®å®åãããŠããŸããããcrates.ioã®quote
ã¯ã¬ãŒãã¯ãããã§ææ¡ãããŠããAPIã«åºã¥ããŠããŸãã ãŸãã @ abonanderãææããããã«ãå±æ§ãã¯ãã¯#[proc_macro_attribute]
宣èšããã #[proc_macro]
ã¯foo!()
ã¹ã¿ã€ã«ã®ãã¯ãå°çšã«äºçŽãããŠããŸã
#[proc_macro_attribute]
ã«#[proc_attribute_macro]
ãŸãã¯#[attribute_proc_macro]
ãšããååãä»ããã¹ãã§ã¯ãããŸãããïŒ
@Zoxcãã§ã«#[proc_macro_derive]
å®å®ããŠããã®ã§ãå±æ§ãã¯ãã§ããã«åŸããªãã®ã¯äžæè°ã§ãã
æã
ã¯åŸãããšãã§ããŸãPartialEq<char>
ãšPartialEq<Punct>
ã«ã€ããŠPunct
ïŒã«äŒŒIdent
ã®PartialEq
ã®å®è£
ãïŒïŒ è¿œå ããã®ã¯ããªãå®å
šãªããã§ãã ç§ã¯PRãæžããŠããããã§ãããã¢ã€ãã¢ã倱æããå Žåã¯æžããããããŸããã
@mjbshaw PartialEq<Punct>
ãã¹ãã³ãæ¯èŒããŸããïŒ PartialEq<char>
ã¯åé¡ãªãããã§ããOTOHã
@eddyb PartialEq
for Ident
ã¯ã¹ãã³ãæ¯èŒããŸããïŒããã¯proc-macro2ãœãŒã¹ã§ãããproc-macroãœãŒã¹ã§Punct
ãšIdent
ã¯ãã®ç¹ã§åæ§ã«åäœãããšäºæ³ãããŸãã Punct
ãç¬èªã®Spacing
ãããã¯æ¯èŒã«å«ãŸãããšæããŸãïŒãã ããä»ã®äººã®èãæ¹ã¯ç°ãªããããããŸããïŒã
ä»ã®ãšããã Punct
ã«å¯ŸããŠPartialEq<char>
ãå®è£
ããã ãã§åé¡ãããŸããã PartialEq<Punct>
ã¯åŸã§ããã·ã¥åã§ããŸãã
@mjbshaw proc-macro2ã¯ã¬ãŒãã«ã¯ã proc_macro
ãäžæµã«ãããã®ãšproc_macro
ã«è¿œå ã§ãããšæããŸããããã¡ããã proc_macro
ã«è¿œå ããããšã¯äžäœäºææ§ããããããæäœéã®æ¹æ³ããå§ããŸããå®å®ããããããããã¹ã±ãŒã«ã¢ããã§ããŸãã
ãã¯ã1.2ã«é¢é£ãããã¹ãŠã®ãã°ã«å¯ŸããŠããªã¢ãŒãžäœæ¥ãè¡ããŸããã ã»ãšãã©ã®ãã°ã¯ããé倧ãªãã°ããŸãã¯ããã¹ãŠã®ã¹ãã³ã«é¢é£ãããã°ãã«åé¡ã§ããŸãã çŸåšãã¹ãã³é¢é£ã®ãã°ã¯çŽç²ã«ãšã©ãŒã¡ãã»ãŒãžã«åœ±é¿ããŸãïŒãã¯ã1.2ã®ç®çã¯è§£å床ãå€æŽããããšã§ã¯ãªãããïŒã æ®ãã®ã¹ãã³ã«é¢é£ããªããã°ïŒå¥åæ·±å»ïŒã¯https://github.com/rust-lang/rust/issues/50050ã§ã @ petrochenkovã«ã¯è§£æ±ºçããããŸãã
Gnomeã¯ã©ã¹ã¯ãproc_macro2 / syn / quoteã®å€æŽã«å ããŠãprocãã¯ãããã¢ãžã¥ãŒã«ãçæããããã®æ©èœã²ãŒãã§æ©èœããªããªããŸããã 幞ããªããšã«ãçŸåšã¯ä¿®æ£ãããŠããŸãã
ãã®å°ããªãšã³ã·ã¹ãã ã®å€åãææ¡ããã«ã¯ãäœãç£èŠããå¿ èŠããããŸããïŒ
@federicomenaquinteroäžå®å®ãªæ©èœã䜿çšããå Žåã¯ãææ°ã®Nightlyã§ã³ãŒããã³ã³ãã€ã«ãã倱æããå Žåã«éç¥ããå®æçãªCIãžã§ãïŒæ¯æ¥ãæ¯é±ã
@SimonSapinããããšããããã¯ããèãã§ãã ãããã®ã¯ã¬ãŒãã®ããŒãžã§ã³ãCargo.tomlã«åºå®ããŸãããããŒãžã§ã³çªå·ãåé€ããŠãCargoã«ææ°ã®ãã®ãããŠã³ããŒããããææãããããŸããã ããã¯æ£ããæ¹æ³ã§ããïŒ
@federicomenaquinteroããã¯ãŸããŸã話é¡ããå€ããŠããã®ã§ããã®è°è«ãç¶ãããå Žåã¯ãIRCãhttp://users.rust-lang.org/ãªã©ã®ä»ã®å Žæã§è¡ã£ãŠãã ããããã ããäžè¬çãªæšå¥šäºé
ã¯ãã¢ããªã±ãŒã·ã§ã³ïŒã©ã€ãã©ãªãšã¯å¯Ÿç
§çã«ïŒã¯ãäŸåé¢ä¿ãå¹æçã«åºå®ãããœãŒã¹ã³ãŒããšäžç·ã«Cargo.lock
ãåºè·ããå¿
èŠããããŸãã Cargo.toml
ã§ã¯ã foo = "1.2.3"
ãããªäŸåé¢ä¿ã宣èšããããšããå§ãããŸããããã¯ããSemVerã«åŸã£ãŠäºææ§ãããå Žåã¯ããã®ããŒãžã§ã³ä»¥éããæé»çã«æå³ããŸãã
ãã®ãããäœæãããã¯ã¬ãŒãã®éçºã劚ããŠããæç¶ãåãã¯ãã®åé¡ã«ééããŸããã
次ã®ããšãèæ ®ããŠãã ããã
#[my_attribute]
struct MyStruct {
#[other_attribute]
field: String,
}
proc_macro
ãšcustom_attributes
äž¡æ¹ã®æ©èœãå¿
èŠã§ãããåæã«äœ¿çšããããšã¯ã§ããªããããããã¯çŸåšæ©èœããŸããã procãã¯ãã®å®å®åã«ãããæ©èœãã©ã°ãäžèŠã«ãªãããšãç解ããŠããŸããïŒ
ãã1ã€ã¯ããã®æ¹æ³ã§#[my_attribute]
ãã #[other_attribute]
å®è¡ã劚ããã³ãŒããçæããå¯èœæ§ãããããšã§ãã ãouterãå±æ§ã§ã #[derive(Foo)]
ãšåãããã«æ©èœããå
éšå±æ§ãç»é²ã§ããããæ¬åœã«ãã°ãããã§ãããã
ãããŒã»ãã·ã§ã³ã«é¢ãã
ãã®ãããã¯ãæé»çã«ãããŒã®ãã»ãã·ã§ã³ããäœæããããšã§çœ®ãæããããšã¯å¯èœ/æãŸããã§ããããïŒ ãŸãã¯ããããªãã¯APIïŒå®å®åãžã®ãã¹ãå«ãïŒãè¿œå ããŠäœæããŸããïŒ
ãããŒã»ãã·ã§ã³ããããšãšãŠã䟿å©ã ãšæããŸãã proc-macro
ã¯ã¬ãŒãã®åäœãã¹ããäœæããããšã¯ã»ãšãã©äžå¯èœã§ããããå°ãªããšããã以å€ã®å Žåã¯éåžžã«äžäŸ¿ã§ãã ããã«ãããã¯TokenStream::from_str
ã§ãªããã»ãã·ã§ã³ãå¿
èŠãšããä»ã®é¢æ°ã§ããããŸãã
@alexcrichton
ãã¯ã1.2ã«é¢é£ãããã¹ãŠã®ãã°ã«å¯ŸããŠããªã¢ãŒãžäœæ¥ãè¡ããŸããã ã»ãšãã©ã®ãã°ã¯ããé倧ãªãã°ããŸãã¯ããã¹ãŠã®ã¹ãã³ã«é¢é£ãããã°ãã«åé¡ã§ããŸãã
https://github.com/rust-lang/rust/issues/50504ããé倧ãã¹ããŒã¿ã¹ã«ã¢ããã°ã¬ãŒãããã-ã¢ãžã¥ãŒã«ã®åé¡ã¯ãããæ·±ãåé¡ã®çç¶ã®ã¿ã§ãããšèª¬æãããŠããŸã-procãã¯ãã®æ¡åŒµIDã¯æ£ããç»é²ãããŠããã ãããä»ã«ã©ã®ãããªçµæããããããã¯ããããŸããã
æ ¹æ¬çãªåé¡ãä¿®æ£ããPRããããŸãïŒhttps://github.com/rust-lang/rust/pull/51952ïŒããä¿®æ£ããã®ãªã°ã¬ãã·ã§ã³ããããç§ã¯ãŸã ãããã調ã¹ãŠããŸããã
ããå€ãã®æç¶ãåãã¯ããå®å®ãããããã®PRãhttps://github.com/rust-lang/rust/pull/52081ã«æçš¿ããŸãã
@petrochenkovã¯ç§ã«ã¯ããã§ãããPRã«ã€ããŠã³ã¡ã³ãããŸã
proc_macro_derive
åå±æ§ã®åé¡ãšãããããããŒãã³ã°ã·ã¹ãã ãšã©ã®ããã«çžäºäœçšãããã«ã€ããŠããã¯ãããŒãã³ã°ãã©ããã³ã°ã®åé¡ã«ã€ããŠæçš¿ãproc_macro_derive
åå±æ§ãã¹ã³ãŒããšååä»ããšçžäºäœçšããæ¹æ³ã«ã¯å¥ã®åé¡ããããŸãããããã§åãäžããæ¹ãé©åãªããã§ãã å±æ§ã®ãã¹ã¯çŸåšå®å®åã®éçšã«ãªãããã #[derive(foo::Parent)]
ãåå±æ§#[foo::Child]
æã€å¯èœæ§ããããŸããã掟çãã¯ãã¯ããã®è¡šé¢äžãååæ€çŽ¢ãå®è¡ã§ããªããããåå±æ§ãå®éã«ããèªäœã®åã§ãããã©ãããèå¥ããŸãã ä»ã®ãšãããç°¡åãªè§£æ±ºçã¯ãããŸããããçžäºã«äŸåããå±æ§ã®å°æ¥ã®ããã«æ³šç®ãã¹ããã®ã ãšæããŸãã proc_macro_attribute
å±æ§ããåæ§ã®ã«ãã¯ã¢ããã®åé¡ã«ééãããããªæ¹æ³ã§çžäºäœçšããããšãæãŸãªãã£ãçç±ã¯ãããŸããã
ä»æ¥ããããžã§ã¯ããã³ã³ãã€ã«ããããšããŸãããããããããã®åé¡ã«é¢é£ããäœããå£ããŠããŸãã ãã¹ãŠã®ãšã©ãŒã¡ãã»ãŒãžã«ã¯ããïŒåé¡ïŒ38356ãåç
§ïŒããšããã¡ãã»ãŒãžãå«ãŸããŠããŸããã ãããç§ãããã«ãã©ãçããæ¹æ³ã§ãã
ããã«ãã³ã³ãã€ã«äžã«è¡šç€ºããããšã©ãŒã¡ãã»ãŒãžãå«ããŸãã Cargo.tomlãå«ããŸãã
ç§ã®ãããžã§ã¯ãã¯ç¹å®ã®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ããã§ã¯åé¡ã¯ãªããšæããŸãã ãšã©ãŒã¡ãã»ãŒãžã«ã¯ã©ãã§ãproc-macro2-0.4.8
ãšè¡šç€ºãããŠããã®ã§ã @ realcrã¯ãã§ã«proc-macro2
æŽæ°ããŠãããšæããŸãã åé¡ã¯ããã€ããªãŒããŒãžã§ã³ãïŒ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 ïŒé¢ä¿ããªããšæãããå Žåã¯ãèªç±ã«ç·šéãŸãã¯åé€ããŠãã ããã ç§ã¯ããªããå©ããããã«æåãå°œãããŸããç§ã話é¡ã«ãªã£ãŠãããã®ãšããã§ãªããã®ãç¥ãããšã¯é£ããã§ãã ãšã©ãŒã¡ãã»ãŒãžãïŒissueïŒ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-macrosã®æ¡åŒµã¯ãããŸã§ããªãããåå³ãããŠããã®ã§ãåå解決ã®éšåãããã¯ããã«å¿é ããŠããŸããã ç§ã¯å人çã«ååŠçãèªèããŠããŸãããã掟çãæåŸã«å®è¡ãããcfgãæåã«å®è¡ãããæ¡åŒµé åºãããããšãç¥ã£ãŠããŸãããã以å€ã®å Žåã¯ãã»ãšãã©ãå埩çã§ãã
ç£æ»ããã®ã¯è¯ãããšã§ãããç§ã¯åæããŸãïŒ
å€åç§ã¯æçœãªäœããéããŸããã ããããproc_macroããé¢æ°ãåŒã³åºããããåã䜿çšãããããæ¹æ³ã¯ãããŸãã-æç¶ãåãã¯ãå±éããã¯ã¬ãŒããå®çŸ©ããŸããïŒ ïŒãŸãã¯proc_macroã¯ã¬ãŒããFWIWããç¥ãããŠããä»ã®ã¯ã¬ãŒãïŒ
åé¿çã¯ãããŸãããæç¶ãåãã¯ãã®ãŠãŒã¶ãŒãã¯ã¬ãŒãã®ååãå€æŽãããšãAFAIUã¯æ©èœããŸããã
@Ekleog proc-ãã¯ãã¯ã¬ãŒãã¯éåžžããããã䜿çšããã¯ã¬ãŒããæ§ç¯ããç®çã§ã®ã¿ã³ã³ãã€ã«ãããŸãã ãããã¯å®è¡æã®äŸåé¢ä¿ã§ã¯ãããŸããã proc-macro crateå šäœã¯ããéåžžã®ãã©ã€ãã©ãªã§ã¯ãªããäžçš®ã®ã³ã³ãã€ã©ãã©ã°ã€ã³ãšèããããšãã§ããŸãã
ããã¯ãã¯ãã¹ã³ã³ãã€ã«æã«ç¹ã«é¡èã§ãããã«ãã¹ã¯ãªããã®ããã«ãproc-macrosã¯ãã¿ãŒã²ãããã©ãããã©ãŒã ã§ã¯ãªãããã¹ããã©ãããã©ãŒã çšã«ã³ã³ãã€ã«ãããŸãã
@SimonSapinç§ã¯ããªãã«åæããŸããããããproc-macroã¯ã¬ãŒãã§ã¯ãªãå Žåã§ããã¯ã¬ãŒãã«ãã£ãŠæäŸãããé¢æ°ã«äœæ¥ã®äžéšãå§ä»»ããããšã¯æ¬åœã«åœ¹ç«ã€ãããããŸããïŒããšãã°ãäžèšã®ç§ã®ãªã³ã¯ã§ã¯ã X-derive
crateã¯ã X
crateã®é¢æ°ã䜿çšããããšããŸãïŒã ãã以å€ã®å Žåã¯ãproc-macrosã«ãã£ãŠçæããããã¹ãŠã®ã³ãŒããèªå·±å®çµåã§ããããåŒã³åºããµã€ãã®ç¶æ
ãæ³å®ããå¿
èŠãããããšãæå³ããŸãã
次ã«ã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
ãã ãããã®åé¿çã§ã¯ããŠãŒã¶ãŒãã«ãŒãã¯ã¬ãŒãã®ååãå€æŽããåé¡ïŒããšãã°ã
#![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
ã®ã¹ããªãŒã ã§ãããåTokenTree
ã¯ã¹ã³ãŒãæ
å ±ãéã¶Span
ãé¢é£ä»ããããŠããŸãã çŸåšããåŒã³åºããµã€ããïŒãŸãã¯ç©ºïŒä»¥å€ã®ã¹ã³ãŒãã®ã¹ãã³ãäœæããæ¹æ³ããªãããšãé€ããŠã åºæ¬çã«ãç¹å®ã®ã¯ã¬ãŒããåç
§ããŠSpan
ãäœæããããã®åççã«äººéå·¥åŠçãªæ¹æ³ãèãåºãããšããå¿
èŠãªããšã§ãã
ç§ãå°ããçç±ã¯ããã§ãã¯ããã¯ã¹ããã§ãã¯ãããŠããªãããã§ãã ãããªãããããã§ãã¯ããã®ãããã§ãããïŒ
#![feature(proc_macro)]
å®å®ããç¶æ
ã§ããã®åé¡ã®æ®ãã¯äœã§ããïŒ
@ jan-hudecãããåæã®ããã°æçš¿ã§ãã®åœ¹å²ãæãããHygiene
ïŒãŸãã¯åæ§ã®ååã®ïŒæ§é äœã«ã€ããŠèšåãããŠããããã Span
ã¯ãšã©ãŒå ±åå°çšã ãšæããŸããã ç§ã¯ããããæ¶ãããšæã£ãŠããŸããããããŠæããã«ééã£ãŠããŸããã ããããšãïŒ :)
ïŒïŒ[featureïŒproc_macroïŒ]ãå®å®ããç¶æ ã§ããã®åé¡ã®æ®ãã¯äœã§ããïŒ
çæ³çã«ã¯ãå®å®ããæ©èœã§ã¯ãªããæ®ã£ãŠãããã¹ãŠã®åã ã®åé¡ã«ã€ããŠæ°ããåé¡ãæåºããå¿ èŠããããŸããããããã°ããã®åé¡ãéããããšãã§ããŸãïŒhttps://github.com/rust-lang/rust/issues/ã§è¡ãããã®ãšåãæ¹æ³ã§ïŒ 44660ïŒã
ãããåæã®ããã°æçš¿ã§ãã®åœ¹å²ãæãããè¡çïŒãŸãã¯åæ§ã®ååã®ïŒæ§é äœã«ã€ããŠèšåãããŠãããããã¹ãã³ã¯ãšã©ãŒå ±åå°çšã ãšæããŸããã ç§ã¯ããããæ¶ãããšæã£ãŠããŸããããããŠæããã«ééã£ãŠããŸããã ããããšãïŒ :)
IIUCãã¹ãã³ã¯ãè¡çç¶æ³ã远跡ããããã®äž»èŠãªæ¹æ³ã§ãã
@ mark-imçš®é¡ã ãããã«ã¯ããœãŒã¹ã³ãŒãã®å Žææ å ±ïŒãŠãŒã¶ãŒåãã®ã¡ãã»ãŒãž/蚺æçšïŒãšæ§æã³ã³ããã¹ãïŒã€ãŸããè¡çæ å ±ïŒã®äž¡æ¹ãå«ãŸããŸãã
ãã®åé¡ãçºçãããã£ã¹ã«ãã·ã§ã³/ãã©ãã£ãã¯ã®éãèãããšã proc_macro_diagnostic
ãç¬èªã®è¿œè·¡åé¡ã«ç§»åããããšã¯çã«ããªã£ãŠããŸããïŒ ãŸãããã®æ©èœãå®å®ãããããã®ãããã«ãŒãäœã§ããããç解ãããããæŒãéãããšãã§ãããã©ããã確èªããããšæããŸãã ãã£ãŒãŒã«ã¯ããã䜿çšããŸãããããŠããã¯ãããŸã§çŽ æŽãããã§ãã å®å®çã«ãã®æ©èœããªããããã³ãã¥ããã£ã¯ã代ããã«compile_error!
ã䜿çšããsynã®ææ°ããŒãžã§ã³ã®ããã«ããã¡ã³ããŒãªåé¿çãäœæããŠããŸãã
@sgrifç§ã¯ãã®ãããªåé¡ãéããïŒ https ïŒ
ã ããç§ã¯SpanãšLineColumnæ§é äœã®ã¡ãœãããå®å®ãããã®ãæäŒãããšã«èå³ããããŸãã æåã®ã³ã¡ã³ãã§æªè§£æ±ºã®åé¡ãèŠãŠãããŸããã誰ããåå¿è ã«ç¹å®ã®æ¹åã§ã³ã³ãã€ã©ãŒã玹ä»ãããå Žåã¯ããããããã ããã°å¹žãã§ãïŒ+1ïŒ
proc_macro_gen
æ©èœã²ãŒãã¯ããã§ç§ãæããŠããŸãããäžéšã®ãã§ãã¯ãªã¹ãã«ã¯ãä»ã®ãã¯ãå®çŸ©ãçæããïŒproc_ïŒãã¯ããæããã«åç
§ããŠãããã®ã¯äœããããŸããã ããã¯ïŒrustcã®æ©èœã²ãŒã以å€ã§ïŒèª¬æãããŠããŸããïŒ
@jjpeçŸæç¹ã§ã¯ããããã®æ©èœã²ãŒãå°çšã®è¿œè·¡åé¡ãã¹ãã³ãªãããã®ãããããæåã§ãããã®åé¡ã¯ãäž»ã«å®å®åã®æåã®æ³¢ã«æ§ããããŸããã
@alexcrichtonç§ã¯ããã§å®å
šã«å
æ°ã§ããããã¯proc_macro_gen
æ©èœãèŠãéçšã§ãããã¯ããã«ã€ããŠã®èšåããªãã®ãšåããããè¯ããã®ãèŠã€ããããã«ããã§ç§ã玹ä»ããã ãã§ãã ããã¯ç§ã«ã¯å°ãå¥åŠãªã®ã§ãå°ãªããšãããã«ã€ããŠèšåããããšã«ããŸããã
@xieyuheng CodeString
/ Code
ã¯ã©ã®ããã«èŠããã§ãããããã€ãŸãããã®ã»ãã³ãã£ã¯ã¹ã¯ã©ããªãã§ããããã
TokenStream
ã¯ãé¢åãªããã¹ãã§ã¯ãªãäžé£ã®ããŒã¯ã³å€ãé€ããŠããã®ãŸãŸã®ãœãŒã¹ã³ãŒãã«ãããªãããšã«æ³šæããŠãã ããã
TokenStream
ïŒ TokenTree
ïŒã®æ¡åŒµAPIã¯1.29ã§å®å®ããŠããŸãã é¢æ°ã®ãããªprocãã¯ãã®ã€ã³ããŒãã¯1.30ã§å®å®ããŸãã
rustc 1.30.0-nightly (63d51e89a 2018-09-28)
以éãã¢ãžã¥ãŒã«å
ã®ã³ãŒããå¥ã®ãã¡ã€ã«ã§ãã©ããŒã¹ããããšã¯ã§ããªããªã£ãããã§ãã mod module;
ãåŠçãããšã mod module;
ãWYSIWYGãå«ãTokenStream
ãåŸãããŸãã
ããã¯ãã¹ãã³ãè¡çç¶æ ãããã³åŠçãããã³ãŒããšã®äžè²«æ§ãç¶æããããã«å¿ èŠã§ããããšãç解ããŠããŸãã å¥ã®ãã¡ã€ã«ã®ã¢ãžã¥ãŒã«ã®ã³ã³ãã³ããæäœããæ¹æ³ã¯ãããŸããããŸãã¯ãããŸããïŒ ã¢ãžã¥ãŒã«æ§æã®äºçŽ°ãªãªãã¡ã¯ã¿ãªã³ã°ããã¯ãã®åäœã«å€åãããããå Žåããã®æ¬ åŠã¯ãšã³ããŠãŒã¶ãŒãæ··ä¹±ãããå¯èœæ§ããããŸãã
ããããŸããããã®åé¡ã¯å€§èŠæš¡ã§ããããã以äžéãããŸãŸã«ããŠ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]
ãåé€ã§ãããããåå解決ã«å°éãããããæªè§£æ±ºã®å±æ§ããšã©ãŒãå ±åãããããããšã¯ãããŸããã
ïŒ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
æ€æ»ãã®æç¹ã§ãããçµäºããŸãããä»ã®è¿œè·¡ã®åé¡ãåå²ããã®ãå¿ããå Žåã¯ããç¥ãããã ããã ç§ã¯ç¢ºãã«ããã€ãã®ãã©ããŒã¢ãããéãããšãã§ããŸã