rust-lang / rfcsïŒ1681ã®è¿œè·¡ã®åé¡ã
cc @alexcrichton
ãªããã¹è©ŠéšïŒ
ç¹åŸŽïŒ
proc_macro
proc-macro
#[proc_macro_derive(Foo)]
å±æ§proc-macro
ã¯ã¬ãŒãã-L
ãš#[macro_use]
ã§ããŒãããŠããŒãããŸãproc-macro = true
æ¢ç¥ã®ãã°ïŒ
mod foo
ããŒã¯ã³ã¹ããªãŒã ã倱æãã-ïŒ36691proc_macro
å
¬éãããŠããŸãã-ïŒ38749[x]-ã³ã³ãã€ã©ã«ãã£ãŠçæãããå±æ§ã«ãããã«ã¹ã¿ã 掟çäœæè ã®ç掻ãå°é£ã«ãªããŸã-https
[x]- rustc_macro
ã¯ã¬ãŒããäœæããŸã
librustc_macro
ãlibsyntax
ãªã³ã¯ããŸãã librustc_driver
librustc_macro
ã«äŸårustc_macro
ãæšæºããããŒã§äžå®å®ãªã¿ã°ãä»ããŸããrustc_macro
ã«#![crate_type = "rlib"]
ã¿ã°ãä»ããã ãã§ãdylibãçæããŸãããlibsyntax
ã®TokenStream
å
éšçã«äœ¿çšããŠã rustc_macro
ã®APIãå®è£
rustc_macro
ã«TokenStream
langã¢ã€ãã ãã¿ã°ä»ãããŠãã³ã³ãã€ã©ãŒããããèªèã§ããããã«ããŸããrustc_macro_derive
å±æ§ãè¿œå ããŸãfoo(bar)
ã§ããããšãæ€èšŒããä»ã®åŒæ°/圢åŒã¯ãããŸããTokenStream
langã¢ã€ãã ã䜿çšããŠçœ²åã確èªããŸãrustc_macro_derive
ãå«ããã¹ãŠã®é¢æ°ã·ã³ãã«ãããããã䜿çšããã掟çã¢ãŒããšãšãã«ã¡ã¿ããŒã¿ã«ãšã³ã³ãŒãããŸããrustc-macro
ã¯ã¬ãŒãã¿ã€ããè¿œå ããŸãrustc-macro
ã¯ã¬ãŒããdylibãšããŠãªã³ã¯ã§ããªãããã«ãã#[rustc_macro_derive]
ã¿ã°ä»ããããã¢ã€ãã 以å€ã®_å°éå¯èœãª_ã¢ã€ãã ããªãããšã確èªããŸãcfg
ãã£ã¬ã¯ãã£ããšããŠcfg(rustc_macro)
ãè¿œå ãã rustc-macro
ã¯ã¬ãŒãã¿ã€ãã«èšå®ããŸãrustc-macro
ã¯ã¬ãŒããlibsytnaxã«åçã«ãªã³ã¯ããããšã確èªããŸãrustc-macro
ã¯ã¬ãŒãã®#[macro_use]
ãµããŒãã«èšå
¥ããŸãrustc-macro
ã¯ã¬ãŒããæ€çŽ¢ããŸãrustc-macro
ã¯ã¬ãŒãã®ã¡ã¿ããŒã¿ã解æããŠãã·ã³ãã«/掟çã¢ãŒãã®ãã¢ã«ã€ããŠåŠç¿ããŸãdlopen
dylibplugin = true
ãšåæ§ã«rustc-macro
èªèããŸã--crate-type=rustc-macro
æž¡ããŸã#[derive]
ç¹æ§ãããŒãããã¹ã¢ãŒã¯ãã¹ãäœãããå¿ èŠããããã®ãã§ãã¯ãªã¹ãã§åé¡ã®èª¬æãæŽæ°ããŸããã ç¶²çŸ çã§ã¯ãªãå¯èœæ§ããããŸãããããŸãããã°ããããŸã§ã®éã®ãã®90ïŒ ãåŸãããã¯ãã§ãã
ããããŸãããä»æ¥ã¯ããã調ã¹ãŠãã©ããŸã§å°éã§ãããã確èªããŸãã
cc https://github.com/rust-lang/rust/pull/35957 ãå®è£
ïŒ35957ããïŒlibrustc_macroã¯ã¬ãŒãã®ååãããå°ããã€ã¯ã·ã§ããããå¿
èŠããããŸãã ç¹ã«ãããã¯ãã¹ãŠã®ãã¯ãäœæè
ã«ãšã£ãŠäžå¯æ¬ ãªãã®ãå«ãé·å¯¿åœã®ã¯ã¬ãŒãã§ããããšãæå³ãããŠãããããrustc_macroïŒå°ãªããšãç§ã®èãã§ã¯ïŒã«å¶éããããšã¯1.1ã®ã¢ã€ãã¢ã«ã€ããŠã¯æªãããã§ãã 以åã¯ããã«libmacroãå¿
èŠã§ãããã macro
ã¯äºçŽèªã§ããããïŒå°æ¥çã«ã¯ããŒã¯ãŒããšããŠå¿
èŠã«ãªãå¯èœæ§ããããŸãïŒãäžå¯èœã§ãã @cgswordsãšç§ã¯
@nrc ïŒããŠãåœåã«ã€ããŠã®ç§ã®åœé¢ã®èãïŒ
extern crate macros;
-çããŠçãã§ããããã¯ããæžãããã®ãµããŒãã³ãŒãã§ã¯ãªãããã¯ããå«ããã®ãšããŠèªã¿åãããå¯èœæ§ããããŸãextern crate macro_runtime;
-猶ã«æžãããŠããéãextern crate metarust;
-Rustãæäœããããã«ãRustã«ã€ããŠRustãèšè¿°ããŸãextern crate bikeshed;
-æç¶ãåãã¯ãã䜿çšãããšã奜ããªè²ã®Rustã䜿çšã§ããŸããextern crate macrame;
-ãmacromake [r]ãã®ããã«èãããŸãã ãããããçã®ã©ã€ãã©ãªãããå°æ¥ã®ãçŽ æµãªãAPIã«æ®ããã»ããããã§ãããã@nrcãã®è³ªåã®éèŠãªåŽé¢ã¯ãããŸããŸãªãã¯ãã¹ã¿ã€ã«ã®ååä»ãã§ããç¹ã«ã libproc_macro
å Žåã¯ããæç¶ãåãã¯ããã«æžåœã«åãçµãã§ããŸããçšèªã ããã§ã¯åŒ·ãæèŠã¯ãããŸããããå°éçšèªã®åéãå
¬ç¶ãšæ¢æ±ãããã©ããã¯ããããŸããã
æ確ã«ããããã«ãä»æ¥ã®macro_rules
ã¯åã«ããã¯ãããã€ãŸããæç¶ãåãã¯ããã修食ããå¿
èŠãããäžæ¹ã§ããã¯ããæå³ããããã©ã«ãã®ããšã ãšæããŸããïŒ ããã¯ç§ã«ã¯ããªãåççãªèšç»ã®ããã«æããŸãã ãããŠãã®äžçã§ã¯ã libproc_macro
ã¯libmacros
ãããåªããŠãããšç§ã¯äž»åŒµããŸãã
ããã§ã®ç§ã®èãã¯ããã¹ãŠã®ãã¯ãã¯ããã¯ããã§ãããå®è£ ã«åºã¥ããŠåºå¥ããå¿ èŠãããå ŽåïŒäœ¿çšæ³ã¯ãã¹ãŠã®çš®é¡ã§ãŸã£ããåãã§ããå¿ èŠããããŸãïŒããæç¶ãåãã¯ãããšãäŸã«ãããã¯ããã䜿çšããŸãã ãæ§ææ¡åŒµããšãã³ã³ãã€ã©ãã©ã°ã€ã³ããå®å šã«å»æ¢ããããšæããŸãïŒãããŠãã€ãåŸè ãå®éã®ãã©ã°ã€ã³ã«åå©çšããŸãïŒã
ããããããã§ããç§ã¯ãæç¶ãåãã¯ãããšããçšèªãåŸåãã«ãããã®ã§ãã
@nrcç§ã«ã¯çã«ããªã£ãŠããŸãïŒ ãäŸã«ãããã¯ããã¯å°ãæ±ãã«ââããã§ãããéåžžã«åºæ¿çã§çŽæçãªçšèªã§ããããŸãã ãæç¶ãåãã¯ããã«ã€ããŠç§ãå¿é ããŠããã®ã¯ããæç¶ãåãã¯Rustã§ã¯åé¡ã§ã¯ãªããšããããšã§ãã ããçŽæ¥çãªã€ãªãããäœãæ¹æ³ãããã®ã ãããã ãé¢æ°ãã¯ããã¯æ£ãããããŸããããç§ãäœãæå³ããŠããã®ããç解ã§ãããããããŸããã
ãããããã¯å®å šã§ã¯ãããŸããããRust以å€ã§ããç¥ãããŠãã/䜿çšãããŠããçšèªã§ããããšãèãããšãç§ãã¡èªèº«ã®çšèªãäœããããè¯ããšæããŸãã ãããã°ã©ã ãã¯ãããå¯èœã§ãããç§ã¯ãæç¶ãåãã奜ãã§ãã
ãæç¶ãåãã¯ããã«æãè¿ãPerlã®çšèªã¯ãããœãŒã¹ãã£ã«ã¿ãŒãã§ããããã¯ïŒç¹ã«ASTããããŒã¯ã³ãžã®ç§»è¡ã«äŒŽãïŒéåžžã«é©åãªèª¬æã§ãã
ããããããæ§æãã©ã³ã¹ãã©ãŒããŒããŸãã¯ãããã°ã©ããã£ãã¯ãã¯ããã¯ååãšããŠããŸãæ©èœããŸããïŒ ãã ããæç¶ãåãã¯ãã«ã¯åé¡ã¯ãããŸããã
ãæç¶ãåãã¯ãã§ã«äººã ããããåŒãã§ãããã®ã§ãããç¹ã«ãäŸã«ãããã¯ãããšã¯å¯Ÿç §çã«ããããäœãæå³ããã®ãã¯æ確ã«ç解ãããŠãããšæããŸãã å¥ã®ååãæ¢ãå¿é ã¯ãããŸããã
ç§ã¯ãé垞䜿çšãããæç¶ãåãã¯ããïŒãŸãã¯ãã«ã¹ã¿ã ãã¯ããïŒãšããçšèªã奜ãã§ãã ç§ã¯ç¹ã«_macro_ãšããåèªã䜿çšããã®ã奜ãã§ããããããã°ããéåžžã®ãã¯ãããšåãããã«ïŒæçµçã«ã¯...ïŒäœ¿çšã§ããããšãæ確ã«ãªããŸãã ãã®ãããããœãŒã¹ãã£ã«ã¿ãŒãã¯å¥œãã§ã¯ãããŸããïŒãã®çšèªãäž¡æ¹ã«äœ¿çšãããŠããããšã¯ããã£ãŠããŸããããã£ã«ã¿ãŒãããŒã¿ãå€æããã®ã§ã¯ãªããåã«ããããããããšãæåŸ ããŠããŸãïŒã
libproc_macro
ãŸãã¯libmacros
ã©ã¡ãã§ãåé¡ããlibproc_macro
ã ç°¡åã«åé¿ã§ããã®ã«ãã¯ã¬ãŒãåã«_
ãå«ããã®ã奜ãã§ã¯ãªããšããçç±ã ãã§ãåŸè
ã®æ¹ã奜ãã§ãã =ïŒ
1ã€ã®è³ªåïŒéæç¶ãåãã¯ããã䜿çšã§ããããµããŒãã«ãŒãã³ãããããšæåŸ
ããããšã¯ãããŸããïŒ ç§ã¯ãã®ãããªèšç»ãç¥ããŸããããããç§ãã¡ãããããåãæšæ ã«ããããå
¥ãããã®ã§ããã°ã libmacros
ãããè¯ãååã§ãããã =ïŒ
ïŒããšãã°ãç±å¿ãªæ¡åŒµRFCããã®@dhermanã®ã³ã¡ã³ãã«ã€ããŠå°ãèããŠããŸããïŒ
@nikomatsakis ïŒé¢é£ããŠããã埮åŠã«ç°ãªã質åã¯ã httpsïŒ//github.com/rust-lang/rfcs/pull/1561#discussion_r60459479ã§åãäžãããŠãŒã¹ã±ãŒã¹ã§ã-æç¶ãåãã¯ãã®å®è£ é¢æ°ã§åŒã³åºãããšãã§ããããã«ããŸããïŒä»ã®æç¶ãåãã¯ãã®å®è£ é¢æ°ïŒ
ããã«ã¹ã¿ã 掟çç©ãå¥ã®ã«ã¹ã¿ã 掟çç©ãåŒã³åºããããã«ãããããšã¯ç°¡åã«ããããŸããããã«ãããåºæ¬çã«ãæç¶ãåãã¯ãå®çŸ©èªäœããã®ãããªããµããŒãã«ãŒãã³ããšããŠäœ¿çšã§ããããã«ãªããŸãã
ããããã¯ãã @ dhermanã®gensym
äŸã¯ããªã説åŸåããããšæããŸãã ãã¡ãããäžèšã®ç§ã®è³ªåã«å¯Ÿããçãããã¯ããã®å Žåãgensymã¯ãã¯ãïŒäŸãšããŠãã¯ãã§äœ¿çšã§ããŸãïŒãšãµããŒãé¢æ°ïŒæç¶ãåãã¯ãã§äœ¿çšã§ããŸãïŒã®äž¡æ¹ã§ãã
貚ç©PRhttps ïŒ//github.com/rust-lang/cargo/pull/3064ãããããã§ãã¯ãªã¹ãã®ãã¹ãŠã®ã貚ç©çµ±åãããã¯ã¹ããã§ãã¯ããå¿ èŠããããŸãã
貚ç©PRã«ã€ããŠã³ã¡ã³ããæ®ããŸããããç°ãªãã¿ã€ãã®_package_ã ãã§ãªããç°ãªãã¿ã€ãã®_dependency_ãå¿ èŠã ãšæããŸãã 第äžã«ãããã¯çŸçã«ã人éå·¥åŠçã«ãåªããŠãããšæããŸãããããã¯ç§ã®æèŠã§ãã ããããç§ã«ã2ã€ã®å ·äœçãªçç±ããããŸãã
ããã瀺ãããã«ãåãã¯ã¬ãŒãã¯ãæç¶ãåãã¯ãã®å¥ã®ã¯ã¬ãŒãã®éåžžã®æ·±ãããŸãã¯å¥ã®ã¯ã¬ãŒãã®ãã¯ãã®æ·±ãã§ããå¯èœæ§ããããŸãã
Serdeã¯æ©èœããŸããïŒ
ã¯ãhttps://github.com/serde-rs/serde/releases/tag/v0.8.6
ïŒå Žåã«ãã£ãŠã¯ã³ã³ããå±æ§ãé€ãïŒ36211ïŒ
çŽ æŽãããã@ dtolnayã®ã¢ããããŒãã«æè¬ããŸãïŒ
ãããã®ãã¯ãã«é¢ããããã¥ã¡ã³ãã¯ãããŸããïŒ ãããã䜿çšããå¯äžã®äŸã¯serdeã§ãããšæããŸããç§ã¯æ£ããã§ããïŒ
OK貚ç©ãäžéžããŸããã ããã¯åé¡ãããŸããããå®å®åããåã«https://github.com/rust-lang/rust/issues/35900#issuecomment-243976887ã«å床
ãäŸã«ãããã¯ãããšãæç¶ãåãã¯ããã¯ãããããã宣èšåãã¯ãããšãåœä»€åãã¯ãããšããŠããé©åã«åé¡ã§ãããšæããŸãã ããã¯ãããã°ã©ãã³ã°èšèªã®ããåºãç¥ãããŠãã宣èšå/
ãã®åœåã¹ããŒã ã«ããã macro_imp
ã¯ã¬ãŒããšã¢ãžã¥ãŒã«ãmacro_rules
ãšäžŠåã«ãªããŸãã macro_rules
ã¯ãæçµçã«ã¯ããäžè¬çãªmacro_dec
ã¯ã¬ãŒãã®ã¢ãžã¥ãŒã«ã«ãªãå¯èœæ§ããããŸãã
@nrc ããå®éã®ãã©ã°ã€ã³ããšã¯ã metacollectãclippyã®ãããªãã®ã rustw ã rustfmt ã Rust Language Serverã®ãããªãã®ããŸãã¯ãã®ä»ã®ã«ããŽãªã®ããã°ã©ã ãå«ã¿ãŸããïŒ
䟡å€ãããã®ã§ãç§ã¯ãäŸã«ãããååãããå«ããŸãïŒ $foo
ãã¿ãŒã³ã¯ç§ã®å¿ã®äžã§ãäŸãã§ã¯ãªãããïŒã 宣èšåãšå¿
é åã®æ¹ãç§ã«ã¯ããèãããŸãã
ãããããã£ãŠã¿ããšã1ã€ã®åé¡ã«æ°ã¥ããŸããã RustãæäŸãã掟çç©ã¯ãã³ã³ãã€ã©ãŒãç¡èŠããããšãç¥ã£ãŠããå±æ§ãè¿œå ããããšãããããã§ãã ãã®ã³ã³ããã¹ãã¯ãã«ã¹ã¿ã 掟çãééãããšå€±ãããŸãã ã«ã¹ã¿ã 掟çãšããŠæå®ãããèå¥é¢æ°ã¯äœãããªããšæããŸããã #[structural_match]
å±æ§ãè¿œå ããããšãšã©ãŒãçºçããŸãã
è€è£œã¹ã¯ãªãã
ïŒ demo_plugin
ãšããååã®ã¯ã¬ãŒãå
ïŒ
#![feature(rustc_macro, rustc_macro_lib)]
extern crate rustc_macro;
use rustc_macro::TokenStream;
#[rustc_macro_derive(Foo)]
pub fn derive_foo(input: TokenStream) -> TokenStream {
input
}
ïŒå¥ã®ã¯ã¬ãŒãã§ïŒ
#![feature(rustc_macro)]
#[macro_use] extern crate demo_plugin;
#[derive(PartialEq, Eq, Foo)]
struct Bar {
a: i32,
b: i32,
}
#[derive(Eq)]
ãåé€ãããšããã¹ãŠãæ£åžžã«æ©èœããŸãã
@sgrifããã¯ããæ¬åœã«ç§ã«æãåºãããŠãããŠããããšãïŒ
ãããã£ãŠãããã§èµ·ãã£ãŠããããšãããã€ããããŸãã
#[derive(PartialEq, Eq)]
ãšãã³ã³ãã€ã©ã¯PartialEq
掟çãå®éã«ãã®ã³ã³ãã©ã¯ããå®è¡ããããšãéçã«ç解ããããããµã€ã¬ã³ãã«#[structural_match]
è¿œå ããŸãã#[rustc_copy_clone_marker]
ãè¿œå ããã#[derive(Copy, Clone)]
ãåæ§ã®å±æ§ãçºçãããšæããŸããã ãããç§ãã¡ãã§ããããã€ãã®è§£æ±ºçïŒ
#[derive(Foo, Eq, PartialEq)]
ãããã®å±æ§ãçºè¡ããªãããå¥ã®ã¡ã«ããºã ã䜿çšããããšã«è³æã§ãã ãã ãã #[derive(Copy, Foo, Clone)]
ãæ©èœããå¿
èŠãããããïŒå®çŸ©ãå€æŽããå¯èœæ§ã®ããã«ã¹ã¿ã ã³ãŒããéäžã§å®è¡ãããå ŽåïŒãããã¯éåžžã«æ³šæãå¿
èŠã§ãã
ç§ã奜ãè¡åæ¹éã¯ãã«ã¹ã¿ã 掟çãæ€åºããå Žåã«ãããã®å±æ§ãåºåããªãããšã§ãã ããã§ããäºçŽ°ãªããšã§ã¯ãªããããããŸããã ä»ã®ãšããããã«ã¹ã¿ã ãã¡ãŒã¹ããšã¹ã¿ã³ããŒãã©ã¹ããã®æ £ç¿ã§ååã§ãããå®å®ãããåã«ãããä¿®æ£ããå¿ èŠããããšæããŸãã
å 責äºé ïŒç§ã¯ã³ã³ãã€ã©ã®å€èŠ³ããæã£ãŠããªãã®ã§ãããããªãããšããããããããŸãã ^^
ããããç§ãç解ããŠããããšããããã¯ã1.1ã«ã¹ã¿ã 掟çã®çŸåšã®ã¢ãããŒãã¯ãäžæçãªåé¿çã®ãããªãã®ã§ãã äžæçãªåé¿çã¯ããããªãã®æéãã«å€æãããå ŽåããããŸãã ããããé·æçã«ã¯ïŒ= macros 2.0ïŒãæåå解æã©ãŠã³ãããªããã¯å®è¡ãããªããªããŸããããã«ãããçŸåšãã¹ãã³æ å ±ã倱ãããŸãã ASTã®ãããã®é ãããå±æ§ã¯ããã¯ã2.0ã®äžçã§ã¯ããã»ã©æªãããšã§ã¯ãªãã£ãã®ã ãããã ãã¶ããã³ã³ãã€ã©ã«ã€ããŠããå€ãã®å éšç¥èãæã£ãŠãã人ãèšãããšãã§ããŸãã ãããã®é ãããå±æ§ããã®å°æ¥ã®äžçã§å®éã«æå³ããªãã®ã§ããã°ãåŸæ¥ã®ã«ã¹ã¿ã 掟çãåãã£ãŠçœ®ãããšã«ãã£ãŠåé¿çããšãããšã䞻匵ããããšæããŸãã ãšã«ããããã¹ãŠã¯ãã§ã«åé¿çã§ãããïŒ
@ colin-kiegelç§ãã¡ãä»ããŠããããšã¯å°æ¥æ§ããªããšããæå³ã§ããªãã¯æ£ãããšæããŸãã ããšãã°ã次ã®ããã«ãªã£ãŠãããšããŸãã
#[derive(Eq, Foo, PartialEq)]
ä»æ¥ã¯ã Eq
å®è£
ãè¿œå ãã次ã«Foo
ã®ã«ã¹ã¿ã ã³ãŒããå®è¡ããŠããã PartialEq
å®è£
ãè¿œå ããŸãã æ§é ã¯Eq
ãšPartialEq
éã§_å€æŽ_ãããå¯èœæ§ãããããã #[structural_match]
ã«ãã£ãŠè¿œå ãããEq
ã¯ã Foo
å®è¡åŸã«å®éã«ã¯æ£ãããªãå¯èœæ§ããããŸãã
ãã®æå³ã§ããããã«ãããå¿ ãããå°æ¥ã«ããã£ãŠå©çšã§ãããšã¯éããªãããšã«åæããŸãã
ç§ã®æãã§ã¯ãæ§é ã®å€åã«äŸåããã«ã¹ã¿ã 掟çã¯ããããã®é ãããå±æ§ãšã¯é¢ä¿ãªããäžè¬çã«ããŸãããŸãæ§æãããŸããã v2.0ã«ã¹ã¿ã 掟çç©ã¯ã¢ã€ãã ã®æ§é ãå€æŽã§ããŸããããããšãã©ããããããè£ é£Ÿã®ã¿ã«å¶éãããŸããïŒ
ããããã®èœåã¯åžžã«ããã«ãããšç§ã¯ä¿¡ããŠããŸãïŒTokenStream-> TokenStreamã€ã³ã¿ãŒãã§ãŒã¹ã«åºæã§ãïŒãã #[derive]
åççãªå®è£
ã¯å
ã®æ§é ã®æ§é ãä¿æãããšæããŸãã
æ§é äœãå€æŽãããªãããã«ããããã«ãåºåããŒã¯ã³ã¹ããªãŒã ã«æ§é äœèªäœãå«ãŸããŠããªãããšãèŠæ±ã§ãããšã¯æããŸãããïŒ å ¥åæ§é äœTokenStreamã¯äžå€ã®ãã¬ãã£ãã¯ã¹ã«ãªããŸããïŒ å€§ããªåé¡ã¯ããã«ãã®å®äºåŸã«ãã©ã°ã€ã³ã䜿çšããŠããèªèãããªãå±æ§ã確å®ã«ç¡èŠããããšã§ãã ãããããåïŒ[deriveïŒïŒ]ã«ã¯æ¥é èŸãä»ããããšãã§ãïŒããšãã°ãïŒ[deriveïŒFooïŒ]ã«ã¯æ¥é èŸFoo_ããããŸãïŒãç解ããå±æ§ã¯æåããå§ããå¿ èŠããããŸããåã«ã¹ã¿ã 掟çãåŠçããåŸããããã®å±æ§ãåãé€ããŸããïŒ
@mystorããããã®ã¢ãããŒãã®åé¡ã¯èªèãããªãå±æ§ã§ãããã®ãããæ§é äœå šäœãå ¥åãšããŠäœ¿çšããŸãã ããã¯éåžžãç¹å®ã®ãã¬ãã£ãã¯ã¹/ãµãã£ãã¯ã¹/ç»é²ãªã©ã«äŸåãããããæè»æ§ããããŸãã
v2.0ã«ã¹ã¿ã 掟çãã«ã¹ã¿ã å±æ§ã_used_ãšããŠããŒã¯ã§ããå Žåãæ®ãã®ã¢ã€ãã ããŒã¯ã³ã¹ããªãŒã ãžã®_èªã¿åãå°çš_ã¢ã¯ã»ã¹ã«å¶éãããå¯èœæ§ããããŸãã ãã®ããã«ããŠãã«ã¹ã¿ã 掟çç©ã®ããè¯ãæ§æå¯èœæ§ãIMOã«ä¿èšŒãããå¯èœæ§ããããŸãã v2.0ãã¯ãã§ã¢ã€ãã ã®æ§é ãå€æŽããå¿
èŠãããå Žåã¯ãå¥ã®APIã䜿çšããå¿
èŠããããŸãããã«ã¹ã¿ã 掟çã¯å¿
èŠãããŸããã ãã®ããã«ã #[structural_mach]
ãšïŒã«ã¹ã¿ã ïŒæŽŸçã®é åºã«é¢ããåé¡ã¯ããã¯ã1.1ã«ã®ã¿ååšããŸãã ããã¯çã«ããªã£ãŠããŸããïŒ
å¥ã®åé¡ã æ§é äœã«2ã€ã®ç°ãªãã«ã¹ã¿ã 掟çãããã2çªç®ã®ãã®ããããã¯ã«ãªã£ãå Žåããšã©ãŒã¹ãã³ã¯ããããã¯ã«ãªã£ããã®ã§ã¯ãªããæåã®ãã®ãæããŸãã
è€è£œã¹ã¯ãªãã
demo_plugin
ãšåŒã°ããæšæ ã§
#![feature(rustc_macro, rustc_macro_lib)]
extern crate rustc_macro;
use rustc_macro::TokenStream;
#[rustc_macro_derive(Foo)]
pub fn derive_foo(input: TokenStream) -> TokenStream {
input
}
#[rustc_macro_derive(Bar)]
pub fn derive_bar(input: TokenStream) -> TokenStream {
panic!("lolnope");
}
å¥ã®æšæ ã§
#![feature(rustc_macro)]
#[macro_use] extern crate demo_plugin;
#[derive(Foo, Bar)]
struct Baz {
a: i32,
b: i32,
}
Bar
ãããã¯ã«ãªã£ãå Žåã§ãããšã©ãŒã¯Foo
ã匷調衚瀺ããŸãã
@sgrifã®ã¬ããŒããããããšãïŒ ãã®åé¡ã®èª¬æãæŽæ°ããŸããããã¯ã1.1ã«é¢é£ãããã¹ãŠã®æªè§£æ±ºã®åé¡ã远跡ããããšæããŸãã
ããŒããã«ã¹ã¿ã 掟çãš#[structural_eq]
ã®çžäºäœçšã¯ãç§ã以åã¯èããŠããªãã£ããã®ã§ãã ããã¯ãããç§ãæ©ãŸããŸãïŒ
ããŒã¯ã³ã¹ããªãŒã ã«ããã¹ãããè¿œå ãããæ¹æ³ããããšã1æ¥ã®çµããã«åªããã€ã³ã¿ãŒãã§ã€ã¹ã«ãªãå¯èœæ§ããããŸã...ã¹ãã³æ å ±ãä¿æãããã®åé¡
ããäžè¬çãªã€ã³ã¿ãŒãã§ã€ã¹ã®å©ç¹ã®1ã€ã¯ãããã±ãŒãžããã£ãŒã«ãã«å±æ§ãæã€ããšãã§ããããšã§ããããã¯ããã¯ãã®å®è¡æã«åé€ã§ããŸãã ããã¯ãã«ã¹ã¿ã 掟çãã¯ããå ã®ã¢ã€ãã ãå€æŽã§ããããã«ããããã«ç§ãç¥ã£ãŠããå¯äžã®å®éã®ãŠãŒã¹ã±ãŒã¹ã§ãã
ã€ã³ã¿ãŒãã§ã€ã¹ã®è³ªåã¯ãã«ã¹ã¿ã 掟çããåãªãå¥ã®ãã¯ããã«ãããã©ããã«ããã£ãŠãããšæããŸãããã®å Žåãä»ã®æç¶ãåãã¯ãïŒå ã®ã¢ã€ãã ãå€æŽããå ŽæïŒãšåãã€ã³ã¿ãŒãã§ã€ã¹ãæã€ããšãéèŠã§ãã ãŸãã¯ããããç¹å¥ãªã€ã³ã¿ãŒãã§ãŒã¹ãåããç¬èªã®ãã®ã§ããå¿ èŠããããã©ããããã®å Žåãããå¶éçãªïŒè¿œå ïŒã€ã³ã¿ãŒãã§ãŒã¹ãçã«ããªã£ãŠããŸãã
æ§ææ¡åŒµã«ã¯é·ãé修食åãšãã³ã¬ãŒã¿ã®éãããããé¢ä¿è å šå¡ããã®éããæ¬åœã«å«ã£ãŠãããšæããŸãã ãããã£ãŠãã«ã¹ã¿ã 掟çãå°ãç¹å¥ãªãã®ã«ãããšããéããã©ãã®ã¯å°ãæ°ãé²ãŸãªãïŒè°è«ããã代æ¿æ¡ã¯ãããçš®ã®éåžžã«ç¹å¥ãªã«ã¹ã¿ã 掟çã§ããããããã宣èšåã®åœ¢åŒã§ããããïŒã
@nrcãããšãããã§ãtokenstream-> tokenstreamã§ããå¯èœæ§ããããŸããããã§ã¯ãæåããéå§ããnew
ã¡ãœãããå
¬éããŠããŸããã
ã«ã¹ã¿ã 掟çãæ¬åœã«æå³ããªãããã«ã¯ããã£ãŒã«ãã«ã«ã¹ã¿ã å±æ§ãæã€ããšãå¯èœã§ãªããã°ãªããªãããšã«åæããŸãã ããããããããè¿œå ãã¹ã¿ã€ã«ã§å®è¡ã§ããæ¹æ³ã¯ãããããããšæããŸãããã¡ãããããã«ã€ããŠã¯èª¬æããå¿
èŠããããŸãã 掟çãã¯ããã¢ã€ãã ãå€æŽãããæ§æå¯èœã§ãããããã«#[structural_eq]
åé¡ã解決ããäžçã奜ãã®ã§ãç§ã¯ééããªãè¿œå ã¹ã¿ã€ã«ã奜ã¿ãŸãã ããã¯ã¡ããã©ããéã®èªç±IMOã§ãã
人ã ããã®ç®çå°ãæ°ã«å ¥ããªãã£ãã®ãªãããªã以åã«ãã®åºå¥ãããã®ã«ååãªçç±ããã£ãã®ã§ãç§ã¯çç±ãå°ããããšæããŸããã
ïŒç§ãææ¡ããã®ã¯äžæçãªããã¯ã§ãããé·æçãªæ§æå¯èœæ§ã®åé¡ã«ã¯å®éã«ã¯å¯ŸåŠããŠããªããšæããŸããïŒ
ç§ã®ããŸããŸãªã©ã€ãã©ãªã«ã¯çŸåšã foo!(Bar, parameters...)
ãããªãã¯ããããããã©ã¡ãŒã¿ãŒããæ§é äœBar
ãçæããŸãã
IRCã«é¢ããããã€ãã®è°è«ã®äžã§ã代ããã«#[derive(Foo)] #[params] struct Bar;
ãèšè¿°ãã foo!
ãæ§é äœã®æ¬äœãçæãã#[derive(Foo)]
眮ãæãããšããã¢ã€ãã¢ããããŸããã
ããã¯æããã«åŒ·ãè°è«ã§ã¯ãããŸããããæ§é äœãæ§ç¯ãããŠããããšããŠãŒã¶ãŒã«ãšã£ãŠããæ確ã§ãããããç§ã¯ãã®ã¢ã€ãã¢ãæ¬åœã«å¥œãã§ããã
代ããã«ãçæãããimplã«é
眮ãããããã« #[structural_match]
ãäœãçŽãããšãã§ããã§ããããã
ïŒå®éã«ã¯åé¡ã解決ããŸããïŒ
SerdeãšDieselã®äž¡æ¹ããã£ãŒã«ãã§ã«ã¹ã¿ã å±æ§ãé »ç¹ã«äœ¿çšããããã眮æãå¯èœã«ããããã«ã«ã¹ã¿ã 掟çã確å®ã«å¿ èŠã§ããããšã¯æ³šç®ã«å€ããŸãã
ã§ããããå®éãç§ã¯#[structural_match]
åé¡ã«ã€ããŠãŸã£ããã«èããŠããŸããã çµå±ã®ãšãããã«ã¹ã¿ã 掟çã¯äœãã§ããã®ã§ããããïŒ
#[structural_match]
å±æ§ã誀ã£ãŠæ¿å
¥ããå Žåãå®å®æ§ãã§ãã¯ã«å€±æããã¯ãã§ãã ããã§ãªããã°ãããèªäœããã°ã®ããã§ãïŒ ïŒãã ãããã®ã³ãŒããæ©èœããè€éã§å¥æãªæ¹æ³ãèãããšãããã¯ç§ãé©ãããŸãããïŒããããã®å°ããªã³ã¡ã³ããæžããŠå£°ãåºããŠèããŠç³ãèš³ãããŸãããããã1ã€ã®æžå¿µããããŸãã ã«ã¹ã¿ã 掟çã¯#[structural_match]
ã¢ãããŒã·ã§ã³ããæ¹ãããã§ããªãå ŽåããããŸããïŒãããžãã¯ã¹ãã³ãããªããšçµäºããããïŒãæ¢åã®ã¢ãããŒã·ã§ã³ã®ã¹ãã³ãå°ç¡ãã«ããŠããŸãå¯èœæ§ããããŸãã掟çã¯æ£ããé åºã§é©çšãããŸãããããã¯æ®å¿µãªããšã§ãã åºæ¬çã«ã@ colin-kiegelã話ããŠããéæ§æå¯èœæ§ã®ã€ã³ã¹ã¿ã³ã¹ã§ãããé£è¡äžã®æ§é äœãå€æŽããè©Šã¿ã¯ãããŸããã
ïŒã€ãŸããå®å®ãããã®ã䜿çšã§ãããã©ãããå€æããã®ã¯ã¹ãã³ã«äŸåããŠãããããã¹ãã³æ å ±ã倱ããšãããã§ããã€ãã®åä»ãªåé¡ãçºçããå¯èœæ§ããããŸããïŒ
ç·šéïŒããããŸãããèªã¿è¿ããŠã¿ããšã åå°åºããããšã
ãŸããäžå®å®ãªå®è£
ã®è©³çŽ°ãå®å®ããã³ãŒãã«å
¬éããŠããããšãæå³ãããããããã¯ããç²éã§ãã çæ³çã«ã¯ãå®å®ããã³ãŒãã¯#[structural_match]
ã¢ãããŒã·ã§ã³ãååšããããšããç¥ããªãã§ãããã
@nikomatsakisããã
@ colin-kiegel
掟çãã¯ããã¢ã€ãã ãå€æŽãããæ§æå¯èœã§ãããããã«ïŒ[structural_eq]ã®åé¡ã解決ããäžçã奜ãã®ã§ãç§ã¯ééããªãè¿œå ã¹ã¿ã€ã«ã奜ã¿ãŸãã ããã¯ã¡ããã©ããéã®èªç±IMOã§ãã
ãã¡ãããæ§æå¯èœæ§ã®æ¡ä»¶ã¯ç°ãªããŸããããã¯ãã®å€æŽã¯æ§æå¯èœã§ããå¯èœæ§ããããšæããŸãã ã³ã³ãã€ã©ãŒãŸãã¯æ £äŸã«ãã£ãŠåŒ·å¶ãããã掟çã®æäœã«é¢ããäžé£ã®äºåæ¡ä»¶ãšäºåŸæ¡ä»¶ãæ確ã«ååšããå¿ èŠããããŸãã éçªç¶å€ç°ã¯ãããã§éžæããå¯èœæ§ã®ããäžå€æ¡ä»¶ã®ã¹ãã¯ãã«ã®1ã€ã®æ¥µç«¯ãªããã«æãããŸãããã§ã«ããããåãããããšãã§ããæ¹æ³ïŒããšãã°ã䜿çšãããå±æ§ã®ããŒãã³ã°ïŒã«ã€ããŠèª¬æããŠããããšã«æ³šæããŠãã ããã äžè¬çã«ã¯ãæãåçŽãªæ¡ä»¶ã奜ã¿ãã³ã³ãã€ã©ãŒã«ãã£ãŠãããã匷å¶ããããšããå§ãããŸãã ãã ããããã¯ãç¹å¥ã«ã«ã¹ã¿ã 掟çãã©ã®ããã«åŠçããå¿ èŠãããããšããåé¡ã«ããçšåºŠå«ãŸããŠããŸãã
人ã ããã®ç®çå°ãæ°ã«å ¥ããªãã£ãã®ãªãããªã以åã«ãã®åºå¥ãããã®ã«ååãªçç±ããã£ãã®ã§ãç§ã¯çç±ãå°ããããšæããŸããã
åœæã¯åŒ·ãã¢ãããŒã·ã§ã³ããã£ããšã¯æããŸããã å®è£ ã¯ç°¡åã§ããè¯ãã¢ã€ãã¢ã®ããã«æããããšæããŸãã å®è£ ãããè€éã«ãªããéåžžã¯ç¡é¢ä¿ãªãã¯ãäœæè ã®åºå¥ãè¿œå ãããå€æŽãããè£ é£Ÿããããéžæããå¿ èŠãããããããã¯ãã®æè»æ§ãäœäžãããããå«ãããŠããŸãã
ã«ã¹ã¿ã ããªããã£ãã®é·æçãªèšèšãæ€èšããæ£ããæ¹åã«åãã£ãŠããããšã確èªããããšæããŸãã 1.1ãœãªã¥ãŒã·ã§ã³ã®å¶çŽãšãã§ããã ãæ©ããããããšããé¡æãããã®æ°Žãæ¿ãããŠãããç§ãã¡ã¯ãã倧ããªããžã§ã³ãèŠå€±ã£ãŠããããã«æããŸãã
äœããã®æ¹æ³ã§ã«ã¹ã¿ã å±æ§ããµããŒãããããšã¯é£ããèŠä»¶ã®ããã«æããããšããç¹ã§ã @ jimmycuadraã«åæããŸãã @nikomatsakisãæ£ããã§ãããçŸåšã®#[derive(PartialEq, Eq)]
æ±ãã¯æšæºä»¥äžã§ãããå®å®ãããã¹ãã§ã¯ãããŸããã æåŸã«ã @ mystorã«ã¯ãã«ã¹ã¿ã 掟çã¢ãŒãããã®éæ³ã®å±æ§ã«ã€ããŠããç¥ããªãã¯ãã§ãããšããéåžžã«è¯ãç¹ããããŸãã å°æ¥çã«ã¯ããã«è¿œå ããããšæãã¯ãã§ããããã¯ã1.1ã§ãããã§ããªãããã«ããããããŸããã
ãŸããã«ã¹ã¿ã 掟çã®é·æèšèšã«é¢ãã@nrcã®ææ
ãåæ ããŠãããã®å€ãã¯#[derive]
å®éã«ã©ã®ããã«æ©èœãããã«èŠçŽããããšæããŸãã ä»»æã®å±æ§ããµããŒãããå Žåã @ nrcã¯ä¿®é£Ÿåã®ã¿ãæã¡ããã³ã¬ãŒã¿ãæããªãããšã«ã€ããŠã¯è¯ãç¹ããããšæããŸããã #[derive]
ã¯ãã«ã¹ã¿ã 掟çãæ°ããå±æ§ãå®çŸ©ããã®ã§ã¯ãªããåã«ããã«åãçµããšããç¹ã§éåžžã«ç¹å¥ã§ããæ¢åã®ãã®ã
çŸåšãå®è£
ã«ã¯#[derive]
ã¢ãŒãã®å³å¯ãªå·Šããå³ãžã®æ¡åŒµããããŸãã ãã¹ãŠã®å
éšæŽŸçã¢ãŒãã¯ã«ãŒãã§å±éãããã«ã¹ã¿ã 掟çã¢ãŒããããããããã³ã«ãåã·ãªã¢ã«åããŠå±éããã¹ããŒãž1ã«æ»ããŸããããã¯ãã³ã³ãã€ã©ã#[derive]
å±æ§ã1åã«è€æ°åå®è¡ã§ããããšãæå³ããŸããã¿ã€ãdefinition_ã ããã¯æ¯ãããããã®æã«ã€ãªãããŸãã
ç§ãæã£ãŠãããããããªã1ã€ã®ææ¡ã¯#[derive]
ã®æ¡åŒµé åºã埮調æŽããããšã§ãïŒ
#[derive(Clone, Foo)]
ãããå Žåãæåã«Foo
å°åºããŸããããã§ãæ§é äœã«ã¯#[derive(Clone)]
ã¢ãããŒã·ã§ã³ããããŸãã ãã®#[derive]
æç¶ããå Žåã¯ãã«ã¹ã¿ã ã®çµã¿èŸŒã¿ç¹æ§Clone
å°åºããŸãã#[derive_Bar]
å±æ§ã«å±éãããŸãã ããã¯ãããæç¹ã§åé€ããå¿
èŠãããäžäœäºææ§ã®ããã¯ã§ãããå±æ§ãæ¡åŒµããããã«äœ¿çšãããæ¹æ³ã§ãã#[derive]
å±æ§ãæ¡åŒµããŸãããã«ã¯ãå·Šããå³ã«æ¡åŒµããŠããªããšããé©ãã¹ãå¹æããããŸãããããã¯#[derive]
ãããªãããšãããäžåºŠèŠããŠãããŠãã ããã ããã«ãããã³ã³ãã€ã©ãŒã¯æ§é äœå®çŸ©ã«ã€ããŠæ倧éã®ç¥èãåŸãããšãã§ããçµã¿èŸŒã¿ã®ç¹æ§ãæ¡åŒµãããšãã«ãåã®æ§é ãå€æŽãããããšã¯ãªãããšãããããŸãã
ããã¯ã©ã®ããã«èãããŸããïŒ ç§ã¯ãããããã§ãã¹ãŠã®å¶çŽã解決ãããšä¿¡ããŠããŸããïŒ
@nikomatsakis impl
å±æ§ãé
眮ããæŠç¥ãæ©èœãããã©ããã¯ããããŸãããããã¯ãä»ã®ã«ã¹ã¿ã 掟çã¢ãŒãã«ãã£ãŠãçè«çã«ã¯æ§é äœã®ã¬ã€ã¢ãŠããããã«ã¯ãã£ãŒã«ãã®ã¿ã€ããå€æŽãããå¯èœæ§ãããããã§ãã ããã¯ãæåã«æ¡åŒµããããšãã®ã³ã³ãã€ã©ã®ä»®å®ã«éåãããšæããŸãã
掟çç©ãåŠçãããé åºã¯ãRuståç §ãªã©ãä»ããŠãå·Šããå³ãžãšå ¬åŒã«å®£èšãããããšããããŸããïŒ ããäžè¬çã«ã¯ãå±æ§ã®é åºã¯éèŠã§ããïŒ ããããã®ããã«å®è£ ãããã®ã¯å¶ç¶ã®ããã«æããŸãããããŠãã¯ãã®äœè ã¯å·Šããå³ã®é åºã«é Œãã¹ãã§ã¯ãããŸããã§ããã ã«ã¹ã¿ã ãåŠçãããšããAlexã®ææ¡ã¯ãã³ã³ãã€ã©ã«ãã£ãŠè¿œå ãããéæ³ã®å±æ§ã決ããŠèŠãããªãããã«ãæåã«å°ãåºãããŸãã
ã«ã¹ã¿ã 掟çãæ§é äœã®ã¬ã€ã¢ãŠããå€æŽããå¯èœæ§ããããšããèããæ°ã«å
¥ããªãããšãä»ãå ããããšæããŸãã å®å
šã«é
æ
®ãããã®ã«äœ¿ããããã«ããããšæããŸãã äŸãšããŠã rust-gc
ã«ãã£ãŠäœ¿çšããã#[derive(Trace)]
å®è£
ã«ã€ããŠèããŠã¿ãŸãã
#[derive(Trace)]
struct Foo {
a: Gc<i32>,
}
å±éå ïŒ
struct Foo {
a: Gc<i32>,
}
unsafe impl Trace { // NOTE: Strawman impl
unsafe fn trace(&self) { Trace::trace(&self.a) }
}
ãã ããæ§é äœã®ãã£ãŒã«ãã®å€æŽãèš±å¯ããå Žåã¯ã Evil
ã«ã¹ã¿ã 掟çãå®çŸ©ã§ããŸãã
#[derive(Evil)]
struct Foo {
a: Gc<i32>,
}
å±éå ïŒ
struct Foo {
a: Gc<i32>,
b: Gc<i32>,
}
ããããçµã¿åããããšã次ã®ããã«ãªããŸãã
#[derive(Trace, Evil)]
struct Foo {
a: Gc<i32>,
}
å±éå ïŒ
struct Foo {
a: Gc<i32>,
b: Gc<i32>,
}
unsafe impl Trace {
unsafe fn trace(&self) { Trace::trace(&self.a) }
}
ããã¯Trace
äžå¥å
šãªå®è£
ã§ãã rust-gc
ãšäžç·ã«äœ¿çšãããšã b
ãã¶ãäžãã£ãŠããåç
§ã«ãªãå¯èœæ§ããããããã¯ã²ã©ãå®å
šã§ãªããå¥å
šã§ã¯ãããŸããã ããã¯ã Trace
ãã¿ã€ãã§#[derive]
ã«ãšã£ãŠå®å
šãªãã®ã§ã¯ãªããªã£ãããšãæå³ããŸãããããã¯éåžžã«æ®å¿µãªããšã§ãã
ç§ã¯å人çã«ãè¡åã®è¯ã#[derive]
ã¯æ§é ã®ã¬ã€ã¢ãŠã/æ§æãå€æŽããªããšæããŠããŸããå€æŽããå Žåã¯ãéãæªãã ãã§ãã ã«ã¹ã¿ã 掟çãå±æ§ãåé€ããæ©èœã¯éèŠã§ãããããããããããããšã¯åå¿è
ã§ã¯ãããŸããã ããã«ãäœããã®åœ¢ã®ãã¯ã€ããªã¹ããå«ãä»ã®å®è£
ã¯ãçŸåšã®åçŽãªã€ã³ã¿ãŒãã§ã€ã¹ãšã¯å€§ããç°ãªããŸãã
èšãæããã°ã #[derive]
ãæ§é äœãå€æŽããªããšãããçŽç²ããã¯ãã³ã¹ãã«èŠåã䟡å€ããããšã¯æããŸããã
ãã£ãŒã«ããè¿œå ãŸãã¯åé€ããã«å±æ§ãåé€ããæ¹æ³ãããã®ã ãããïŒããšãã°ãå解æãããæ§é äœã®ãã£ãŒã«ããå ã®æ§é äœãšåãã§ããããšã確èªããããã§ãªãå Žåã¯ãšã©ãŒãçºçããïŒ tããã ãä»ã®ãã®ãå€æŽãããŠãæå¥ã¯ãããŸããïŒã
掟çã«æ§é äœã®å€æŽãèš±å¯ããããšã«ã€ããŠãç§ã¯æªãæ°æã¡ãæã£ãŠããŸãã @mystorã®äŸã¯ãç§ãæ§æå¯èœæ§ã«ã€ããŠé«ã¬ãã«ã§è©±ããŠãããšãã«ç§ã念é ã«çœ®ããŠãããã®ã§ãïŒ
å©çšå¯èœã§ããã°ã人ã ã¯ãããæªçšãããšæããŸãã ãããŠãããã«ãããæ¶è²»è ã¯ã«ã¹ã¿ã 掟çå®è£ ã®è©³çŽ°ãšãã®å®è¡é åºã«ã€ããŠæšè«ããå¿ èŠããããŸãã
ãããããããäœãããã®ãããããªãããä»ã®ãã®ã¯ç解ããŠããããšèšãã°ãçžäºäŸåé¢ä¿ã¯ãããŸããã ããã§ãªããã°ãããã¯ã€ãŸå ã®çã¿ã«ãªããç§ã¯ãããèµ·ãããšä¿¡ããŠããŸãã
æªæã®ããããšãè¡ãæç¶ãåãã¯ãã¯ãæªæã®ããããšãè¡ãããã«äœ¿çšããã¯ã¬ãŒããšã¯æ¬åœã«ç°ãªããŸããïŒ ã©ã®ã¯ã¬ãŒãã«ããå®å šã§ãªãã³ãŒããå«ãŸããŠããå¯èœæ§ããããŸãã ãã®ã±ãŒã¹ã¯ãã³ãã¥ããã£ã®è©å€ããœãŒã¹ã®èªåã§ã®æ€æ»ãªã©ãèªåã§äœæããŠããªãã³ãŒãã®ä¿¡é Œæ§ãå€æããæ¹æ³ã«é¢ä¿ããŠããããã§ãã
ã¯ã¬ãŒããæªæã®ããããšãããããšã¯æããªããããããã¯ã¬ãŒãããè³¢ãããå®è£ ãããå¹ççã«ããããããŸãã¯ã§ãããããä»ã®ã«ã¹ã¿ã 掟çå®è£ ãå£ãããã«å·§åŠãªããªãã¯ãè¡ãããšãæåŸ ããŠããã äžéšã®ã«ã¹ã¿ã 掟çç©ããå®è£ ã§ã®ã¿äœ¿çšãããæ§é äœã«ãã£ãŒã«ããè¿œå ãå§ãããããããã¬ãŒã¹ã®ãããªãã®ãå£ããŠããŸãå Žåã§ããç§ã¯ããã»ã©é©ããªãã§ãããã
@mystorçè«çã«ã¯é¢é£æ§ãããããã«èãããŸãããå®éã«ã¯Rustã§æ§é äœã®ãã¹ãŠã®ãã£ãŒã«ããæäŸããå¿ èŠããããããããšãã°C ++ããããã®ããã«ãµã€ã¬ã³ãã«åäœããå¯èœæ§ã¯ã¯ããã«äœããªããŸãã
@alexcrichton
ç§ãæã£ãŠãããããããªã1ã€ã®ææ¡ã¯
#[derive]
æ¡åŒµé åºã埮調æŽããããšã§ã
ç§ã¯ãã®èãã奜ãã§ãã ãããããããã¥ã¡ã³ãã®èŠ³ç¹ããè¿°ã¹ãããšã¯ãåã«æ¡åŒµã®é åºããæªå®çŸ©ãã§ãããšããããšã§ãã æè¿ãPartialEq / Eqãæ¡åŒµããŸããããå³å¯ãªçç±ã¯ãããŸããã
æ§é äœã®å®çŸ©ãå€æŽãã掟çç©ã«ã€ããŠã¯ã埮åŠã«èããããããããŸããããããã»ã©æ°ã«ãªããŸããã ãŸãããèªåæ¿å ¥ããã£ãŒã«ãã¯éåžžã«äŸ¿å©ã ãšæããŸãããäž»ã«äººã ã«é åºã«äŸåãããããªãããããã®ãããªä¿®é£Ÿåã¯æŽŸçãªã¹ãã«å ¥ããã®ã§ã¯ãªããåå¥ã®å±æ§ã«ããããšããå§ãããŸããã¡ããã©ä»æ¡åŒµã®ã
PSã ã¯ã¬ãŒãããã·ã¥ãªã©ã§ã·ãŒããããïŒæ±ºå®è«çïŒRNGã䜿çšããŠããŠãŒã¶ãŒã®ã«ã¹ã¿ã 掟çã®å±éã䞊ã¹æ¿ããããšãçå£ã«æ€èšããŸããããã«ããããŠãŒã¶ãŒã¯å±éé åºã«äŸåã§ããªããªããŸãã æé»ã®äŸåé¢ä¿ãé²ãããã«ãç§ã¯åžžã«äœããã®ã³ã³ããã¹ãã§ãããå®è¡ããããšæã£ãŠããŸãããããã£ã³ã¹ã¯ãããŸããã§ããã ;ïŒ
ç·šéïŒæ°ãå€ãã£ãã®ã§ãæ§é äœã®
ãããã£ãŠãç§ã®ç解ã§ã¯ãã«ã¹ã¿ã
#[derive]
ãæ§é äœãå€æŽã§ããããã«ããããã®åŒæ°ã¯æ¬¡ã®ãšããã§ãã
- å Žåã«ãã£ãŠã¯åœ¹ç«ã€ãããããŸããïŒäŸã¯èŠãŠããŸããããååšãããšæããŸãïŒ
- 䜿çšåŸã®å±æ§ãåé€ã§ããããã«ããã
- ã«ã¹ã¿ã 掟çäœè ã«ããå€ãã®åãäžãã
ã«ã¹ã¿ã
#[derive]
å®è£ ã«å¶éãè¿œå ããããã®åŒæ°ïŒæ§é äœã®ååãšæ§é äœã®ãã£ãŒã«ã/ãã£ãŒã«ãã®ååãåããŸãŸã«ããå¿ èŠããããªã©ïŒã¯æ¬¡ã®ãšããã§ãã
- ããã«ãããã«ã¹ã¿ã
#[derive]
ã«ãã£ãŠçæãããã³ãŒãã¯ãå¥å šæ§ã®ããã«æŽŸçããŠããã¿ã€ãã®æ§é ã«äŸåã§ããŸãïŒããšãã°ãå®éã®ãããã³ã°ã¿ã€ãã確èªããå¿ èŠãããrust-gcããã®#[derive(Trace)]
ããŸãã¯ãããã¯å¥å šã§ã¯ãªããæœåšçã«ã¯è§£æŸåŸã®åŸ®åŠãªäœ¿çšæ¹æ³ã§ãïŒ- æ§é äœãä»ããŠãã¯ãå±ééã§äŒéãããæ å ±ãå°ãªãããããã¯ãå±éã§ã®æé»çãªäŸåé¢ä¿ã®å¯èœæ§ãäœããªããŸãã
ç§ã®æèŠã§ã¯ã
unsafe trait
implsãŸãã¯å®å šã§ãªãã³ãŒãã«äŸåããã³ãŒããçæããå¥å šãªã«ã¹ã¿ã 掟çå®è£ ãäœæããæ©èœã¯éåžžã«éèŠã§ãããæåã®ã»ã¯ã·ã§ã³ã®æ©èœã®ã»ãšãã©ãéæããæ¹æ³ããããšæããŸãïŒå®å šãªæ¹æ³ã§æ§é äœãã£ãŒã«ããè¿œå ããæ©èœãé€ããŠïŒã ãªãããã®å¶çŽããªããã°ãrust-gcã®ãããªã¯ã¬ãŒããå®å šã«å®è£ ã§ãããšã¯æããŸããã ç§ã«ã¯2ã€ã®ã¢ã€ãã¢ããããŸãïŒã¢ã€ãã¢1
ã«ã¹ã¿ã 掟çãã¹ãå®è¡ããåã«ãæ§é äœã®ååãšåãã£ãŒã«ãã®ååãèªã¿åããŸãã ãã¹ãå®äºããæ§é äœãå解æãããããæ§é äœã®ååãåãã§ãããã©ãããããã³åãã£ãŒã«ãã®ååïŒããã³ãã£ãŒã«ãã®æ°ïŒãåãã§ãããã©ããã確èªããŸãã ããã§ãªãå Žåã¯ããšã©ãŒãçºçãããŠãã«ãã匷å¶çµäºããŸãã
ããã«ãããã«ã¹ã¿ã 掟çãã©ã°ã€ã³ãäŸåãããšäºæ³ãããåºæ¬çãªæ§é ããããã£ãå£ããªãããšãä¿èšŒãããããå€ãã®å¥å šãªã«ã¹ã¿ã 掟çãã©ã°ã€ã³ãããããšãæå³ããŸãã ããã«ã¯ãçŸåšã®ã¢ãããŒããšã®äžäœäºææ§ããããšããå©ç¹ããããããå°æ¥çã«ããã奜ãã ãšå€æããå Žåã¯ãåãæ¿ããŠèª°ã®ã³ãŒããå£ãããšãã§ããŸããã ãŸããä»æ¥ãšåãããã«ãæªäœ¿çšã®å±æ§ã®å ŽåãåŠçããŸãã
ã¢ã€ãã¢2
ãã¹ãŠã®ã«ã¹ã¿ã 掟çãã©ã°ã€ã³ã«åãå ¥åTokenStreamïŒããã°ã©ã ã§èšè¿°ãããå ã®ããã¹ãïŒãäžããŸãã çµæãå解æããããšãã«ãåºåæ§é äœã«ãŸã ååšããå±æ§ãèšé²ããŸãã ãã¹ãŠã®åºåããŒã¯ã³ã¹ããªãŒã ã«å±æ§ãååšããå Žåã¯ãæªäœ¿çšã®å±æ§ã«ã€ããŠæå¥ãèšããŸãã
ããã¯ãé åºã®äŸåé¢ä¿ãæã€ããšãäžå¯èœã§ããããšãæå³ãïŒæŠå¿µçã«ã¯ããã¹ãŠã®ã«ã¹ã¿ã 掟çãã©ã°ã€ã³ã¯åãå ã®ãªããžã§ã¯ãããæ©èœããŸãïŒããã©ã°ã€ã³ã®æ§é ãå°ç¡ãã«ããããšãäžå¯èœã«ãªããŸãã ãã¹ãŠã®ã«ã¹ã¿ã 掟çãã»ãŒæ£åžžãªæ¹æ³ã§åäœããæ¢åã®æ§é äœã«åºã¥ããŠæ°ããã¢ã€ãã ãçæããã ãã§ããããããã®ã¢ã€ãã¢ãæ°ã«å ¥ã£ãŠããŸãã ããã¯ãçŸåšã®ãœãªã¥ãŒã·ã§ã³ãå€æã§ãããœãªã¥ãŒã·ã§ã³ã«å€æããã®ãç°¡åã§ãã
TL; DR
èŠçŽãããšãæ§é äœã®å€æŽãèš±å¯ããããšã®ç¹å®ã®å©ç¹ãšããããå®å šãª
#[derive(Trace)]
ãåžžã«æ£ãã#[derive(Serialize)]
ãªã©ãå¯èœã«ãããšããå®å šäžã®æžå¿µãäžåãçç±ãç解ããããšæããŸãã æ§é äœã®å€æŽã«ãŒãããã©ã£ãŠããŸãå Žåã¯ãæ£åœãªçç±ããããšç¢ºä¿¡ããŠããŸãããTraceã«ã¹ã¿ã 掟çã®ååã#[derive(unsafe_Trace)]
ã«å€æŽããã®ã¯éåžžã«æ²ããããšã§ãã
@alexcrichtonã®ãœãªã¥ãŒã·ã§ã³ã¯è¯ããã¬ãŒããªãã ãšæããŸãã äžéšã®ã«ã¹ã¿ã 掟çãè¡ãå€æŽã¯ãããã©ã«ãã®å€æŽãé©çšãããããšãééããªãæåŸ ããŸãã
@mystorã«ã¯ãäžå¿«ãªé©ãã«ã€ãªããå¯èœæ§ããããšããè¯ãç¹ããããŸããã struct
ãå€æŽããå¯èœæ§ãããããšã¯å¿
é ã®ããã§ãã äžæ¹ãæç¶ãåãã¯ãã®ãŠãŒã¹ã±ãŒã¹ãçµã¿åãããã¯ã¬ãŒããå®å
šã§ãªãã³ãŒããããã³ã»ãã¥ãªãã£äžã®æžå¿µã¯ãããªãçããããã§ãã
ãªããããã¯ïŒãã®å®è£ ã¯ããã¯ãããšã©ãŒãé©åã«å ±åããæ¹æ³ãæäŸããŸããïŒ
ã«ã¹ã¿ã 掟çã®å±éé åºãã©ã³ãã åãã@nikomatsakisã®ã¢ã€ãã¢ã奜ãã§ãã ããã¯ééããªããæªããç¿æ £ãããŸãã«ã人æ°ã«ãªãã®ãé²ãã®ã«åœ¹ç«ã¡ãŸã-ãããŠãããããã®ã«ããŸãåªåããã¹ãã§ã¯ãããŸããã
@mystorã®3çªç®ã®ãªãã·ã§ã³ã¯ããã¹ãŠã®æŽŸçãé©çšãããåŸããããã®å®å šæ§ãã§ãã¯ã1åã ãå®è¡ããããšã§ãã ããã¯100ïŒ å¥å šã§ã¯ãããŸãããïŒ2ã€ã®æŽŸçãåããã£ãŒã«ããè¿œå ããã³åé€ããå¯èœæ§ããããŸãïŒããã¥ãŒãªã¹ãã£ãã¯ãªå¯Ÿçã®èŠ³ç¹ãããã«ã¹ã¿ã 掟çã§æ§é äœå®çŸ©ãå€æŽããããšããè©Šã¿ãæåããé²ãã ãã§ååã§ãã
æ§é äœã®å€æŽã«é¢ããæžå¿µã¯å®éã«ã¯èŠãããŸããã ãã£ãŒã«ããç®ã«èŠããªã圢ã§è¿œå ããããšã¯ã§ããŸãããåæåäžã«äœã泚æããå¿ èŠããããŸãã ãããèµ·ãã£ãŠããããšã_æ¬åœã«_å¿é ããŠããå Žåã¯ã掟çç©ãèšè¿°ããŠãæ§é äœå šäœãç°¡åã«è¡šç€ºãããªãå Žåã«ã³ã³ãã€ã«ã«å€±æããã³ãŒããçæã§ããŸãã
@sgrifã¯ãããããã»ãšãã©ã®å Žåã«åœãŠã¯ãŸããŸãããããã©ã«ãã®ç¹æ§ãŸãã¯åçã®ãã®ãå°åºããŠäœ¿çšããå Žåã¯ããã»ã©ã§ã¯ãããŸããã
@sgrif PSïŒã»ãšãã©ã®éã®äœè ã¯ããããèªåã®ã³ãŒãã§äœãèµ·ãã£ãŠããã®ããç解ããŠããã®ã§ãæå³çã«ãã®ãããªãã¯ãã䜿çšããããšãéžæããå Žåãæ§é äœã®å€æŽã«é©ããªããããããŸããã
æ§é äœã«ãã¯ããé©çšããäžè¬çãªäœ¿çšäŸã¯ã確ãã«æ§é äœã®å€æŽãšè£ 食ã®_çµã¿åãã_ã§ãã ããããäžè¬çãªæ¯çã¯ãè£ é£Ÿãå€ããããå€æŽãå°ãªãããšäºæ³ããŠããŸãã ããã§æ確ã«åé¢ããããšã¯ãèªã¿ããããšæè»æ§ãåäžãããã®ã§è¯ãããšã§ãã
ãããã£ãŠã @ mystorã®è°è«ã®ãã®éšåã¯èª¬åŸåããããšæããŸããã次ã®ããã«ãªããŸãã
ã«ã¹ã¿ã ïŒ[derive]ã«ãã£ãŠçæãããã³ãŒãã¯ãå¥å šæ§ã®ããã«æŽŸçããŠããã¿ã€ãã®æ§é ã«äŸåããããšãã§ããŸãïŒããšãã°ãå®éã®ãããã³ã°ã¿ã€ãã確èªããå¿ èŠãããrust-gcããã®ïŒ[deriveïŒTraceïŒ]ããŸãã¯ããã¯äžå¥å šã§ãããæœåšçã«ã¯è§£æŸåŸã®åŸ®åŠãªäœ¿çšæ¹æ³ã§ãïŒ
掟çã§ããã匷å¶ããããšããããšã¯ãç©äºãé²ããããã®ééã£ãæ¹æ³ãããããªããšæããŸãã å
·äœçã«ã¯ãæã
ã¯ãããããäžè¬çãªå Žåã®æ§æå®çŸ©ãå€æŽããæ©èœããããã§ãïŒã¯ããããã¯éæã§ã¯ãªãã ããããã ããäœïŒã ã€ãŸããåŸã§æ§é äœãå€æŽãããªãããšãä¿èšŒã§ããããµãŠã³ãã Trace
ã䜿çšãããšããã¢ã€ãã¢ã¯ãäœããã®æ¹æ³ã§è§£æ±ºããå¿
èŠããããããããŸããã ãã³ã¬ãŒã¿ãäžããäžã«é©çšããããã©ãããæ€èšããŸãã
#[mangle] // <-- custom decorator that does bad things to struct definition
#[derive(Trace)]
struct Foo {
x: T, y: U
}
Trace
implã¯ã struct
å®çŸ©ãå€æŽãããå Žåã«_it_ãã³ã³ãã€ã«ã«å€±æããããã«èšè¿°ã§ãããšèãããããããããŸããã äŸãã°ïŒ
unsafe impl Trace for Foo {
fn trace(&self) {
let &Foo { ref x, ref y } = self;
<T as Trace>::trace(x);
<U as Trace>::trace(y);
}
}
ãã ãã #[mangle]
ãæ¬åœã«æªéçãªãã®ã§ããå Žåã¯ãimplããã蟌ãããšãã§ããŸãã =ïŒããã§ã§ããããšã¯ãããããããŸãã
ãããã®äŒè©±ã®ãªãã¶ãŒããŒãšããŠã #[derive]
ã¯impl
ãããã¯ãè¿œå ããå
åŒã¢ãããŒã·ã§ã³ãå°å
¥ããããšã®ã¿ãèš±å¯ããããšããå
¬åŒãŸãã¯éå
¬åŒã®ã«ãŒã«ãæã£ãŠããããšãå¬ããæããŸãïŒ #[mangle(Foo, Bar)]
ãµãŠã³ãåã®æ§é ã_å€æŽ_ããããšã«å°å¿µããŠããðžïŒã #[mangle]
ã¯ãå®çŸ©ãããè©äŸ¡é åºã
泚éã®éã«ãŸã å®çŸ©ãããŠããªãå Žåã¯ãããããè©äŸ¡é åºãå®çŸ©ããå¿ èŠããããŸãã
ããã«ã€ããŠã®ç§ã®æèŠã¯ãªã©ãã¯ã¹ãããšæããŸãã @nikomatsakisã¯ãïŒ[ let Foo{ ... }
ããªãã¯ã¯ãé©åãªå Žåã«ã¬ã€ã¢ãŠããæ£ããããšã確èªããããã«æ©èœããããã§ãã ãã ãã誰ããç¬èªã«çºèŠããå¿
èŠããªãããã«ãããããã©ããã«ææžåããå¿
èŠããããŸãã
@nikomatsakis
ããããåŸã®å€æŽã«å¯ŸããŠã«ã¹ã¿ã 掟çã_åå¥ã«_匷åããå¥ã®æ¹æ³ãããããšãå¬ããæããŸãã :-)
å±æ§ãé©çšãããã¢ã€ãã ã®å
éšãå€æŽããå¿
èŠãããå Žåã«ã€ããŠã u.r-l.o
ã§ãQtwith Rustã®å®è£
åãã£ãŒãããã¯ãã¹ã¬ããã«åºãããã次ã®æçš¿ãè¡ããŸããã
https://users.rust-lang.org/t/pre-implementation-feedback-for-qt-with-rust/7300/19
泚ç®ãã¹ãç¹ã®1ã€ã¯ãããã§ã¯ãæ§é äœã§ã¯ãªã#[derive]
ïŒãŸãã¯åæ§ã®ãã®ïŒã_trait_ã«é©çšããããšãææ¡ããŠããŸãããã®äžã«è¿œå ãããã¢ã€ãã ã¯const
ç¹æ§ã¡ãœããã«ãªããŸãã
ç§ãäžã§æèµ·ãã貚ç©ã®åé¡ãšåæ§ã«ãç§ã¯
#[macro_use]
extern crate double;
double
ãšããã¯ã¬ãŒãããæç¶ãåãã¯ããã€ã³ããŒãããŸãã ã³ã³ãã€ã«æã«ïŒå®éã®Ruestã®ããã«ïŒã©ã³ã¿ã€ã ã³ãŒãã䜿çšããŠãããããRacketã®(require (for-syntax ...))
é¡äŒŒãããã§ãŒãºã€ã³ã¯ãªã¡ã³ãã®ã€ã³ããŒãã¹ããŒãã¡ã³ããå¿
èŠã§ãã [ã©ã±ããã®ããã¥ã¡ã³ãã¯https://docs.racket-lang.org/reference/require.html#ïŒ
28form ._ïŒ
28ïŒ
28lib._racketïŒ
2FprivateïŒ
2Fbase..rktïŒ
29._for-metaïŒ
29ïŒ
29ãæ®å¿µãªãããæ£ããã»ã¯ã·ã§ã³ããªã³ã¯ããæ¹æ³ãããããŸããã]
ããã°æçš¿http://blog.ezyang.com/2016/07/what-template-haskell-gets-wrong-and-racket-gets-right/ã¯ãTemplate Haskellã§è¡ããããã§ãŒãºã®ééããææããŠãããèå³æ·±ããããããŸãã- --Rustã§åãéã¡ãç¯ããããããŸããã
@ Ericson2314 Rustã®éãã¯ã double
ã_ç¹å®ã®ãã§ãŒãºçšã«_ãã§ã«ã³ã³ãã€ã«ãããŠããããšã§ãã
ã€ãŸããã¯ã¬ãŒãã¯ãããšãã°macro_rules
å®çŸ©ãããŠãããã®ããã«ããã¯ã/修食åã€ã³ã¿ãŒãã§ã€ã¹ã®ã¿ããšã¯ã¹ããŒãããŸãã
æç¶ãåãã¯ããšãã®äžã«ããRustã¢ã€ãã ïŒæç¶ãåãã¯ãã圢æããïŒã®äž¡æ¹ããšã¯ã¹ããŒãããã¯ã¬ãŒããäœæã§ããããšã¯èå³æ·±ãããšã§ããããããŸã§ã®ãšãããã©ã®ãããªåœ¢ã§ãææ¡ãããŠããªãããã§ãã
æ§ç¯äžã®ã¯ã¬ãŒããäœãã©ã®ããã«ãšã¯ã¹ããŒããããã«ã€ããŠå€ãã®ããšãéžæã§ããããã«ããããšã¯çã«ããªã£ãŠãããããããŸããããç°ãªãã³ã³ãã€ã«ã¢ãã«ã§LISPããã·ã¹ãã ãåžå£²ãããã ãã§ã¯éå¹æã«æããŸãã
ãã@eddybç§ã¯ãã®ãäœæã¯ãããããŠã³ã¹ããªãŒã ã§ã©ã®ããã«äœ¿çšãããããç¥ã£ãŠãããæ¹æ³è«ã«æççã§ãã ç§ãã¡ã®ã³ã³ãã€ã«ã¢ãã«ã®ããã«ãRacketããããã§ãŒãºãéèŠã§ããå ŽåïŒRacketãã¯ãã¹ã³ã³ãã€ã«ã§ãããã©ããããããããŸããïŒãæåŸã®è°è«ã¯åŸãããŸããã
å®å®åèšç»ã«é¢ããlangããŒã ãã£ã¹ã«ãã·ã§ã³ã«ããããŒããããŸããã
SerdeåŽã§ã¯ãæ¢åã®ã³ã³ãã€ã©ãã©ã°ã€ã³ã®ãµããŒããåæ¢ãããã¹ãŠã®å€éãŠãŒã¶ãŒã«Macros 1.1ãå
¬åŒã«æšå¥šããåã®æ®ãã®åé¡ã®çããªã¹ãã次ã«ç€ºããŸãïŒ https ïŒ Rustããå¿
èŠãªã®ã¯ãïŒ36211ãä¿®æ£ããããšã ãã§ãã ç§ãã¡ãæ¥éã«é²æ©ããŠããä»ã®ãã¹ãŠã
syntexã䜿çšããã«rustc_macroãå®è£ ããPRãéããŠããã®ã§ãã³ã³ãã€ã«æéã®å¿é ããããããšãã§ããŸãhttps://github.com/serde-rs/serde/pull/548ã
ç·šéïŒæ°ã«ããªãã§ãã ãããïŒ36211ã¯å€ãsyntexã®å®è£ ã«ã®ã¿åœ±é¿ããŸãã
ç§ã¯éææ¥ãŸã§ã«ãã£ãŒãŒã«ããŒããå®æãããããšããŸããããããã°ãããã§å¿ èŠãªãã¹ãŠãå®è¡ãããããšã確èªã§ããŸãã
@dtolnayã«serde-rs / serdeïŒ548ãäžããããŸããããserdeã®ãããã«ãŒã¯æ®ã£ãŠããŸããïŒ
@sgrifçŽ æŽããããããããšãïŒ ãããè¡ã£ããïŒãŸãã¯ä»¥åã«ïŒãééããæ®ãã®ãããã«ãŒã«ã€ããŠããã«ã³ã¡ã³ãã§ããŸããïŒ
ã¯ããããããŸãã
ç«ã2016幎9æ27æ¥ã«ã¯ãåå7æ29åPMã¢ã¬ãã¯ã¹ã»ã¯ã©ã€ãã³[email protected]
æžããŸããïŒ
@dtolnayhttps ïŒ//github.com/dtolnayæå®ãããserde-rs / serdeïŒ548
https://github.com/serde-rs/serde/pull/548 ãæ®ã£ãŠãããã®ã¯ãããŸãã
Serdeã®ãããã«ãŒïŒ@sgrif https://github.com/sgrifçŽ æŽããããããããšãïŒ ããªãããããããã
ïŒãŸãã¯ä»¥åïŒããªããæã£ãŠããæ®ãã®ãããã«ãŒã§ããã«ã³ã¡ã³ãã§ããŸãã
ééããŸãããïŒâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/35900#issuecomment -250028743ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ABdWK7MnA1rpn-WGji8gwAT2JCIqB4LFks5quaa-gaJpZM4JqEAX
ã
@alexcrichton
serde-rs / serdeïŒ548ãäžããããå Žåãserdeã®ãããã«ãŒã¯æ®ã£ãŠããŸããïŒ
ãããã@ oli-obkãŸãã¯@ericktãä»æ¥ãŸãã¯ææ¥ãã®PRãã¬ãã¥ãŒããå Žåãç¿æ¥ãã¹ãŠãããã·ã¥ããŠãRusotoã®ãããªå°æ°ã®èåãªãŠãŒã¶ãŒã移è¡ã§ããŸãã
@dtolnayç§ã¯Rumaã§serde_macrosãå€çšããŠããããã£ãšç®ãå¿ èŠãšããå Žåã¯ãserde_deriveã®ãã¹ããæ¯æŽããããšæããŸãã
å®éãç§ãdiesel_codegenã䜿çšããŠããã®ã§ãRumaã¯ãããäž¡æ¹ã®ã©ã€ãã©ãªã®Macros1.1ããŒãžã§ã³ã®åªãããã¹ãã®å Žã§ãã
Serde 0.8.10ããªãªãŒã¹ããserde_macrosãå»æ¢ãããŠMacros1.1ãæ¡çšãããããšãçºè¡šããŸããã
ãcargodocworksãã®ãã§ãã¯ããã¯ã¹ãè¿œå ããŸããã-https ïŒ//github.com/rust-lang/cargo/issues/3132ã
@dtolnayå®äºïŒ
ããããserde_deriveã®ãã°ãªã®ããrustc / rustdocã®ãã°ãªã®ãã¯ããããŸããããçæãããããã¥ã¡ã³ãã«2ã€ã®åé¡ãããããšã«æ°ã¥ããŠããŸãã
Deserialize
ãšSerialize
ã¯ãã«ã¹ã¿ã 掟çã䜿çšããã¿ã€ãã®ããã¬ã€ãã®å®è£
ãã»ã¯ã·ã§ã³ã«ã¯è¡šç€ºãããŸããããªãã©ã«ã///ãã¯ãã«ã¹ã¿ã 掟çã䜿çšããã¿ã€ãã®çæãããdocstringã®å é ã«è¡šç€ºãããŸãã
ããã¯syn
ãã°ã§ããã ä¿®æ£ãå ããŠ0.8.2ããªãªãŒã¹ããã®ã§ã cargo update
ã§å
¥æã§ããŸãã
2ã€ç®ã«ã€ããŠã¯ããããŸãããã@ alexcrichtonã«ãä»»ãããŸãã
@jimmycuadra
Deserialize
ãšSerialize
ã¯ãã«ã¹ã¿ã 掟çã䜿çšããã¿ã€ãã®ããã¬ã€ãã®å®è£ ãã»ã¯ã·ã§ã³ã«ã¯è¡šç€ºãããŸããã
ããã¯ããªãæªããã§ããïŒ ããã¯rustdocã®ãã°ã®ããã§ãããããããæ°ãããã°ã§ã¯ãããŸããã ããšãã°ãrustdocã¯Copy
å®è£
ã§ã¯ããã瀺ããŠããŸããã
#[derive(Clone)]
pub struct Point {
x: i32,
y: i32,
}
const _FOO: () = {
impl Copy for Point {}
()
};
ãã®ãã¿ãŒã³ã¯ãimplãçæããããã«serde-deriveã«ãã£ãŠäœ¿çšãããŸãã @dtolnay serde_macros
ã«ãåã圢åŒã®äžä»£ããããŸãããïŒ ããã¥ã¡ã³ãã®åé¡ã解決ããããã«ãä»ã®ãšããé¢ããã®ã¯ç°¡åã§ããããïŒ
@jimmycuadraã¯ãããã«é¢ããrustdocã®åé¡ã远跡ããããã«ãå¥ã®ãã°ãéãããã§ããïŒ
@dtolnay
serde_macros
ã«ãåã圢åŒã®çæããããŸãããïŒ
ã¯ãã
ããã¥ã¡ã³ãã®åé¡ã解決ããããã«ãä»ã®ãšããé¢ããã®ã¯ç°¡åã§ããããïŒ
ããããç§ãç¥ãéããããããããã®å¶çŽã®äž¡æ¹ãæºããå¯äžã®ãœãªã¥ãŒã·ã§ã³ã§ãã
::serde
ã§ã¯ãªãserdeããµããŒãããå¿
èŠããããŸãã ããã¯ãå¥ã®ã¢ãžã¥ãŒã«ã®æ©èœãã©ã°ã®åŸãã«serdeimplãé
眮ããå Žåã«ããèŠãããŸãã詳现ã«ã€ããŠã¯ã httpsïŒ//github.com/serde-rs/serde/issues/159ãåç §ããŠãã ããã
@dtolnayãããããããŸãããæ確ã«ããããã«ã
æŽæ°ïŒããŒãã¯å®å šã«ã¯å®äºããŠããŸããããã»ãŒå®äºããŠããŸãã ç§ããã§ã«å ±åããããšããŸãã¯ç§ãã¡ãééããããšãããã£ãŠããå°ããªå¶é以å€ã®åé¡ã¯ãããŸããã ããã£ãŒãŒã«ã¯ãŒã¯ã¹ãããã¯ã¹ããã§ãã¯ããã®ã¯ããããå®å šã§ããä»å€è¡ãããªãå Žåã¯ãææ¥Macros1.1ã§ãªãªãŒã¹ãããäºå®ã§ãã
ããã«ç¶ã人ã
ã®ããã«ãç§ã¯ïŒ36945ãéããŠrustc_macro
ãproc_macro
ã«ååãå€æŽããŸãããããã¯ããã®ã¯ã¬ãŒãã®ååã«é¢ããã³ã³ã»ã³ãµã¹ã®ããã§ãã
rustdocã«æ¬ èœããŠããç¹æ§ã®å®è£ ïŒçŸåšãå¥ã®åé¡ã§è¿œè·¡ãããŠããŸãïŒã¯ããã¯ã1.1ã«åºæã§ã¯ãªãããã§ãã ç¡èŠããŠãå®å šã§ãã
mockers
ã©ã€ãã©ãªãã³ã³ãã€ã©ãã©ã°ã€ã³ãããã¯ã1.1ã«ç§»æ€ããããšããŸããããããšã©ãŒïŒã«ã¹ã¿ã 掟çå±æ§ã¯æ§é äœ/åæåã¢ã€ãã ã«ã®ã¿é©çšã§ããŸãããšããã¡ãã»ãŒãžã衚瀺ãããŸããã ã³ã³ãã€ã©ãã©ã°ã€ã³ã䜿çšãããšãç¹æ§ã«ã掟çãã䜿çšããããšãã§ããŸãïŒå€å°å¥åŠã§ããïŒã ç§ã¯ããã§éãæªãã®ã§ããïŒ
@kriomantãããããïŒ #[derive]
ããã¬ã€ãã«é©çšã§ããããã«ããããšãæå³ããŠãããã©ããããããªããããããã¯å®éã«ã¯ä»æ¥ã®ã«ã¹ã¿ã 掟çã®ãã°ã§ããå¯èœæ§ããããšæããŸã...
ä»ã®ãšããä¿å®çã§ãããšæããŸããããŸã ç¹æ§äžã®æŽŸçã_å®å®å_ããªãå¯èœæ§ããããŸãããããããäžå®å®ãªæ©èœãè¿œå ããããšãã§ããŸãã @ rust-lang / langïŒ
@alexcrichton custom_deriveã®èŠ³ç¹ããããã¬ã€ããšæ§é äœã®éãã¯äœã§ããïŒ
@KalitaAlexeyãªããå®éã®derive
å®è£
ã«äžèŽäººçºçãªå¶éã§ã
@alexcrichtonãã¬ã€ããžã®ãµããŒããæ¡åŒµã§ããŸããïŒ
äžã§
ç§ã¯å人çã«ã掟çãªã³ãã¬ã€ããè¿œå ããããããŸãããããã¯ãããèªäœã掟çãããã®ã§ã¯ãªããã«ã¹ã¿ã å±æ§ããªããªãŒã®ç·ã«æ²¿ã£ãŠããããã«èŠããããã§ãã ïŒäŸãã°ãæåã«äœæããã#[derive]
ã®ç²Ÿç¥ã«åããŸãïŒ
ã«ã¹ã¿ã 掟çã¯ãéåžžã®æŽŸçãšãŸã£ããåãã«ãŒã«ã«åŸãããšããå§ãããŸãã åŸã§å€æŽããããšæããããããŸããããRFCã䜿çšããå¿ èŠããããšæããŸãïŒç§ãããªãå·éã§ããã説åŸåã®ãããŠãŒã¹ã±ãŒã¹ãšããŸããŸãªãšããžã±ãŒã¹ã®é©åãªåŠçã«ãã£ãŠç§ã®èããå€ããããšãã§ããŸãïŒã
@alexcrichton
ä»ã®ãšããä¿å®çã§ãããšæããŸããããŸã ç¹æ§äžã®æŽŸçãå®å®ãããããšã¯ã§ããªãã§ãããããããããããã«äžå®å®ãªæ©èœãè¿œå ããããšãã§ããŸãã @ rust-lang / langïŒ
ðç§ããã
ããããŸãããäžå®å®ãªæ©èœã¯è¯ãã§ãããããã¯ç§ã®ã©ã€ãã©ãªããŸã å®å®ããŠåäœããªãããšãæå³ããŸãïŒã³ãŒãçæãªãã§ïŒã ãŸãã macro!(âŠ)
æ§æã¯ããã¯ã1.1ãã§ãã«ããŒãããŠããŸããããæ£ããã§ããïŒ
ç§ã¯procãã¯ãRFCãåæ€èšããŠããŸããããã¯ãã¯ã¬ãŒãã¯èªåèªèº«ã#[cfg(macro)]
宣èšããå¿
èŠããããšããèšç»ããããŸããã ãã¯ã1.1ã«ã¯ããã¯å¿
èŠãããŸããããç¹å¥ãªã¯ã¬ãŒãã¿ã€ããå¿
èŠã§ãã 2ã€ã®ã¡ã«ããºã ã¯ããçŽäº€ããŠããŸãã1ã€ç®ã¯ã³ã³ãã€ã«ã®ãã§ãŒãºãè¡šãã2ã€ç®ã¯ã¯ã¬ãŒãã®çš®é¡ãè¡šããŸãã ãããããããã¯å€å°éè€ããŠããŸã-åŸè
ã¯åè
ãæå³ããŸãã åè
ã¯ãåãã¯ã¬ãŒãã§procãã¯ããšéãã¯ãé¢æ°ã宣èšããããã«æ¡åŒµãããŸãããåŸè
ã¯ããã§ã¯ãããŸããã
ããã§äœããå€æŽããå¿ èŠããããã©ããã¯ããããŸããããããããprocãã¯ãã®ææ¡ãäžäœäºææ§ã«ããã¯ããå¯èœæ§ããããŸãïŒãã¯ããããŒãããã¡ã«ããºã ãã€ãŸãã¯ã¬ãŒãã¿ã€ãã®èª¬æãæå³çã«çç¥ããŠããŸãïŒã ããããå®å®æã®éã«çèããäœãã
@kriomantæ£è§£ããã
@nrcã¯çŸåšãå®éã«ã¯cfg(rustc_macro)
ãšããŠå®çŸ©ãããŠããŸãïŒãŸããªãproc_macro
ã«å€æŽãããŸãïŒã å¿
é ã§ã¯ãããŸããããã¯ã¬ãŒããžã®ãªã³ã¯ã®ã³ã³ãã€ã«æãšå®è¡æã®äž¡æ¹ã®æŠå¿µã«å¿
èŠã«ãªããšæããŸãããïŒ ã€ãŸããproc-macroã¯ã¬ãŒãã2åã³ã³ãã€ã«ããŸãã1åã¯ã¯ã¬ãŒãã¿ã€ãproc-macro
ããã1åã¯ã¯ã¬ãŒãã¿ã€ãrlib
ã§ãåŸè
ã¯libsyntaxãªã©ã«ãªã³ã¯ããŸãããããã
ä»ã®ãšãããããã_å¿ èŠãšããªã_ã®ã¯åé¡ãªãããã§ãããåŸæ¥ãã©ã³ã¿ã€ã ãµããŒãã«ãªããã€ã³ããå¿ èŠããããšæããŸããïŒ ïŒã¯ã¬ãŒãã2åã³ã³ãã€ã«ããïŒ
@alexcrichton #[proc_macro_derive]
ã¯ãããæå³ããã§ããããïŒ åãããã«#[test]
#[cfg(test)]
æå³ããŸãã
ïŒä»ããè¿œå ããå¿
èŠããããšããæå³ã§ã¯ãããŸããã cfg
ãè¿œå ããå Žåã®ææªã®ã±ãŒã¹ã¯ãæªäœ¿çšã®ã¢ã€ãã ã®èŠåã§ããïŒ
@eddyb extern crate proc_macro;
ã©ãã§ããïŒ ããããå£ããããªæ°ãããŸãã
@mystorããã¯ãã¿ã€ããšå®è£ ãããããããéåžžã®ã¯ã¬ãŒãã§ãã
ãã ãã libsyntax
ã«ããªã³ã¯ããŠããŸãããã€ãŸããã¯ã¬ãŒããproc_macroã¯ã¬ãŒãã䜿çšããŠããŠãã¯ãã¹ã³ã³ãã€ã«ãããå Žåã¯ãæ§æãã¯ãã¹ã³ã³ãã€ã«ããå¿
èŠããããŸããïŒ
@eddyb yes #[proc_macro_derive]
ã¯èªåçã«ç¡èŠãããå¯èœæ§ããããŸãããåé¡ã¯ããããã®é¢æ°ãæšç§»çã«å°éãããã¹ãŠã®ãã®ïŒ extern crate proc_macro
ïŒãç¡èŠããå¿
èŠãããããšã§ãã ããã¯ãåãªãã¯ã¬ãŒããã§ãããå®è¡æã«é倧ãªåœ±é¿ããããŸãïŒåçãªã³ã¯ãã¯ãã¹ã³ã³ãã€ã«ãããã¿ãŒã²ããã§ã¯äœ¿çšã§ããªããªã©ïŒã
ãã¹ãã«ã¯#[cfg(test)]
ãããããšã«æ³šæããŠãã ããããããã£ãŠãåºæ¬çã«åãç®çã§#[cfg(proc_macro)]
ãæäŸããããšã¯ç§ã«ã¯åççãšæãããŸãã
@alexcrichton _Ideally_ãã¯ã¬ãŒãã«ã¯ãšã¯ã¹ããŒãããããã®ãããªãããã€ãããã¯ãªã³ã¯ãªã©ã¯å¿
èŠãããŸããã libstd
ã§ãã ãã ãã #![no_std]
å Žåã«åé¡ãçºçããããšãããããŸããã
ãã¹ãŠããã£ãããããå Žåã¯ãæåããããã«ã³ã³ãã€ã«ãå®è¡ããå¿ èŠãããããã§ãïŒå€±æïŒã
ç·šéïŒåŸ
ã£ãŠãç§ãäœãèããŠããŸããïŒ ã«ã¹ã¿ã ã¯ã¬ãŒãã¿ã€ããå¿
èŠã§ããäºéã³ã³ãã€ã«ã¯ãæç¶ãåãã¯ã/å±æ§/掟çç©ãªã©ããšã¯ã¹ããŒãããéåžžã®ã¯ã¬ãŒãã«é©çšãããŸãã ãããã£ãŠãä»ã®ãšããé¢ä¿ãããŸããã
ãã ããå°ãªããšããæ°ããã¯ã¬ãŒãã¿ã€ãã«åžžã«èšå®ããã#[cfg(proc_macro)]
ãå°å
¥ããããšã¯ã§ããŸãã
ðãã®æ©èœã¯ããã®ãªãªãŒã¹ãµã€ã¯ã«ã®çµããã«å®å®ããããšãç®çãšããŠãæçµã³ã¡ã³ãæéã«å ¥ããŸãïŒ ð
çŸåšãå®å®åãæ€èšããçç±ã¯æ¬¡ã®ãšããã§ãã
ãã®ã¹ã¬ããã«é¢ãã以åã®ã³ã³ã»ã³ãµã¹ã«åºã¥ããŠãååãproc_macro
ã«ã·ããããŠããããšã«æ³šæããŠãã ããã ãã®ãªãªãŒã¹ãµã€ã¯ã«ã®æ®ãã®éããããšä»ã®çŽ°ããç¹ããã€ã¯ã·ã§ãããç¶ããããšãã§ããŸãã
ã¯ã¬ãŒãã2åã³ã³ãã€ã«ãããšãéåžžã«ç²éã«èãããŸããã¹ã³ãŒãã¯æ£ããæ©èœããŸããã æ¬åœã«extern! crate needed_for_my_inline_proc_macros;
ãããªãã®ã¯ã¯ããã«åªãããœãªã¥ãŒã·ã§ã³ã§ãã
@aturonãªã«ã人ã ã¯ãã®æ°æ¥åã«äœ¿ãå§ããã®ã§ã¯ãªãã§ããïŒ
@ Ericson2314ããããå°ãé·ãã§ãããFCPã®ã³ã¡ã³ãã§èª¬æãããŠããããã«ãå®å®ãããã£ãã«ã«åºè·ããããŸã§ã®_æå°_æéã¯ä»ãã3ãæã§ããããã®éåžžã«çãã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯ååããããšæããŠããŸãã
FCPèªäœã¯6é±éã®é·ãã®äºä»¶ã§ãããå¿ ãããå®å®åãžã®éãæ©ãããšãæå³ããããã§ã¯ãªãããšã«æ³šæããŠãã ããã ãã ããå°ãªããšãä»ããããã»ã¹ãéå§ããããšã§ããããŸã§ã«åé¡ãçºèŠãããªãã£ããšä»®å®ããŠããã®æ©èœã3ãæã§åºè·ããæ©äŒãäœæããŸãã
ãããããããŸããã ç§ã¯3ãæã®éšåãæãåºããŸãããããããã®3ã€ã®å£ã®äžã®FCPã®äœçœ®ãå¿ããŸãã---ããã¯8æ22æ¥ãã3ã€ã®å±±ã ã£ãã®ã§ãªããã°ããã®æã®ã¿ã€ãã³ã°ãæ°ã«ããªãã§ãã ããã
ç§ãæèµ·ãããã§ãŒãºã®åé¡ã¯ãprocãã¯ãã®è©±ã®ãã®å°ããªéšåã«ã圱é¿ãäžãããšæãã®ã§ããããã«å¯ŸåŠããŠããããããšæããŸãã
@alexcrichton rustc_copy_clone_marker
ãšä»ã®rustc_attrs
ã¯ãŸã ç§ãã¡ãåãã§ããŸãã https://github.com/serde-rs/serde/issues/577ãåç
§ããŠ
#[derive(Copy, Clone)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub struct MyStruct {
value: i64,
}
åé¿çã¯é åºãå ¥ãæ¿ããããšã§ããããããä¿®æ£å¯èœãã©ããã確èªããããšã«ããŸããã
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
#[derive(Copy, Clone)]
pub struct MyStruct {
value: i64,
}
https://github.com/sfackler/rust-postgres-deriveããã¯ã1.1ã«ç§»æ€ãçµããŸãããæ¯èŒçèŠçã¯ãããŸããã§ããããè€æ°ã®æŽŸçã«ãã£ãŠèªã¿åãããå±æ§ã®åŠçã¯éåžžã«èŠçã§ãã Serdeã¯åãåé¡ã«ééããŸããããäž¡æ¹ã®æŽŸçç©ãåæã«å±éããã«ã¯ãäžé£ã®å¥åŠãªããžãã¯ãå¿ èŠã§ãïŒ https ïŒ
å®å®åã劚ããã¹ãã§ã¯ãããŸããããèè åŽã§ã¯æ¯èŒç倧ããªäººéå·¥åŠçåé¡ã§ãããããããããã«åãçµãå¿ èŠããããšæããŸãã
ç§ã¯quote
0.3.0ãmacro_rules!
ã¹ã¿ã€ã«ã®ç¹°ãè¿ãããµããŒãããŸããïŒ @nrcã«åŸ®èª¿æŽãããããšãïŒã æº/ã·ã³ããã¯ã¹ãªãã§procãã¯ããéçºããŠããå Žåã¯ããããããããå¿
èŠã§ãã postgres-deriveããã®äœ¿çšäŸïŒ
pub fn enum_body(name: &str, variants: &[Variant]) -> Tokens {
let num_variants = variants.len();
let variant_names = variants.iter().map(|v| &v.name);
quote! {
if type_.name() != #name {
return false;
}
match *type_.kind() {
::postgres::types::Kind::Enum(ref variants) => {
if variants.len() != #num_variants {
return false;
}
variants.iter().all(|v| {
match &**v {
#( // \
#variant_names => true, // |----- new feature
)* // /
_ => false,
}
})
}
_ => false,
}
}
}
èå³ããããŸãããªã#
ã§ã¯ãªã$
ã§ããïŒ
ç·šéïŒåŒçšæ§æã¯${...}
ãªããšåžžã«æã£ãŠããŸããããæ°å¹Žçµã£ãŠãES6ãã³ãã¬ãŒããªãã©ã«ã«å·çããããŠããå¯èœæ§ããããŸãã \{...}
ãæ©èœããŸãããä»ã®å Žæã§ã圹ç«ã¡ãŸãã
è§ãã£ãã¯èŠã€ãã«ããããã§ãããå¿é
ããå¿
èŠã¯ãããŸããã
èå³ããããŸãããªã
#
ã§ã¯ãªã$
ã§ããïŒ
ããã¯macro_rulesãã¯ãã§ãããç§ãããããããšã¯äœãã§ããªãããã§ãïŒ smile:ã $v
ã¯åäžã®ããŒã¯ã³ãšããŠç
§åããã $v
ããå€æ°v
ã䜿çšããæ¹æ³ã¯ãããŸããã 察ç
§çã«ã #v
ã¯2ã€ã®ããŒã¯ã³ã§ãããããå¥ã
ã«ç
§åããŠIDã䜿çšããŠåŠçãè¡ãããšãã§ããŸãã
macro_rules! demo {
($tt:tt) => {};
}
fn main() {
demo!($v);
}
ããããã¹ãŠmacro_rules
è¡ãããã®ãåŸ
ã¡ãŸããïŒïŒ å¿ãããããã¯ã1.1ã掟çããŸãã-ã»ãã®äžç¬ã§ãã ãšã¯ããã1ã€ã®ããŒã¯ã³ã§ãã$x
ã¯ãèšèšäžã®æ¬ é¥IMOã§ãã cc @jseyfried
@dtolnay
@alexcrichtonrustc_copy_clone_markerãšä»ã®rustc_attrsã¯ãŸã ç§ãã¡ãåãã§ããŸãã serde-rs / serdeïŒ577ãåç §ããŠãã ããã
ãããããã¯æªãããã§ãïŒ äžéšã®ãªã¹ããæŽæ°ããŸãã @nrcãŸãã¯@jseyfriedã¯ãããã«ã©ã®ããã«åãçµããã«ã€ããŠèããŠããŸããïŒ ç§ã¯ãã¹ãŠã®å±éé åºã«ããŸã粟éããŠããŸãããã1ã€ã®#[derive]
å±æ§ãå±éãããŠãããšãã«ãå°æ¥ã®ãã¹ãŠã®å±æ§ãäžžåã¿ã«ããŠæåã«ãããå®è¡ããããšããå¯èœæ§ããããŸããïŒ
@sfackler
è€æ°ã®æŽŸçç©ã«ãã£ãŠèªã¿åãããå±æ§ã®åŠçã¯å€§ããªèŠçã§ã
ããªãããªã³ã¯ããäŸã«å®å šã«åŸã£ãŠãããã©ããã¯ããããŸãããã詳ãã説æããŠããã ããŸããïŒ
@alexcrichtonäŸãæããŠãã ãã
#[derive(ToSql, FromSql)]
enum Foo {
#[postgres(name = "bar")]
Bar
}
#[postgres]
å±æ§ã¯ã ToSql
ããã³FromSql
å®è£
ã®çææ¹æ³ã調æŽããããã«äœ¿çšãããŸãã ãã以å€ã®å Žåã¯äžæãªå±æ§ã§ãããããæçµåºåã®åã«åé€ããå¿
èŠããããŸããã ToSql
ãšFromSql
å®è£
ã¯å¥ã
ã«å®è¡ãããŸãã å®è£
ãçæããŠããå±æ§ãåé€ããã ãã§åçŽãªæ¹æ³ã§ãããè¡ããšã2çªç®ã®æŽŸçã§ã¯ã«ã¹ã¿ãã€ãºã倱ãããŸãã
serde-deriveãšpostgres-deriveã¯ãäž¡æ¹ã®æŽŸçimplã®å®è£
ããäž¡æ¹ãåæã«çæããåãé¢æ°ã«è»¢éããããšã«ãããçŸåšãããããã¯ããŠããŸãã ã³ã³ãã€ã©ãåé€ããŠããçŸåšåŒã³åºãããŠãã#[derive]
ãåæ¥ç¶ãããããéä¿¡ããŠå±éããå¿
èŠããããŸãïŒ https ïŒ
@sfacklerç§ã¯ãåãå®è£ è ããã®æŽŸçç©ãæ®ã£ãŠããªãå Žåã«ã®ã¿ãäœåãªå±æ§ãåé€ããããšã«ãã£ãŠããããè¡ãããšãã§ãããšæããŸãã ããªãã®ããæ¹ã¯_è©ããããã_æ¹ãè¯ããããããŸããã
@sfacklerããã
ãããããã®è«çã¯ãããã®ã§ã¯ãªãããšæããŸãã ããšãã°ã ToSql
æ¡åŒµããŠããå Žåã FromSql
ã®å°æ¥ã®æ¡åŒµã¯ã©ã®ããã«æ€åºãããŸããïŒ äžèšã®@dtolnayã®ãããª#[cfg]
èåŸã«ããå¯èœæ§ããããŸããïŒ ã§ã¯ããã¹ãŠã®å Žåã«æ€åºã§ãããšã¯éããŸãããïŒ
@alexcrichtonã¯ããããã¯ãããã®ã§ãæ¬åœã®è§£æ±ºçãéèŠã ãšæãããŸãã
#[cfg]
ãš#[cfg_attr]
ã¯ã掟çããåã«åŠçãããŸãããïŒ
ãã¯ã1.1apiã¯æååã§æ©èœããããã次ã®3ã€ã®è§£æ±ºçããæ³åã§ããŸããã
åãªãã·ã§ã³ã«ã¯ãç¬èªã®é·æ/çæããããŸãã
çæ1ïŒåœé¢ã®éã®è匱ãªåé¿ç
çæ2ïŒäžéšã®æªäœ¿çšã®å±æ§ã¯æ€åºãããŸãã
çæ3ïŒæ«å®çãªè§£æ±ºçã®ããã®ããå€ãã®APIãµãŒãã§ã¹
å±æ§ã#[used(...)]
ã©ããããŠãããããä¿æããåæã«ãã¯ã€ããªã¹ãã«ç»é²ããããšãæ€èšããŸããããããã¯ããªãã°ãããŠããŠãäžå®å®ãããŸãã
@alexcrichton
1ã€ã®
#[derive]
å±æ§ãå±éãããŠãããšããããã¯å°æ¥ã®ãã¹ãŠã®å±æ§ãäžžåã¿ããããšããå¯èœæ§ããããŸã
ç§ã¯ãã®èãã奜ãã§ãã #[cfg]
ãš#[cfg_attr]
ã¯#[derive]
ã®åã«åŠçãããããã #[cfg]
ä¿è·ããã#[derive]
ã¯ãã®ã¢ãããŒãã§ã¯åé¡ã«ãªããŸããã ïŒãŸãã¯ãå±æ§ã¹ããªããã³ã°ã®åé¡ã«å¯Ÿãã@sfacklerã®é¡äŒŒã®è§£æ±ºçã®å ŽåïŒã
ãã®ã¢ãããŒãã§ã¯ã @ sfacklerã®ãœãªã¥ãŒã·ã§ã³ãå°ãåçŽã«ãªããŸããããã¯ãä»ã®é¢é£ãã掟çãæåŸã®å±æ§ã«ããååšããªãããã§ãïŒ @eddybã®ææ¡ã«ãã£ãŠç©äºãåçŽåããããšæããŸãïŒã
ã³ã³ãããŒã«å±æ§ã®åé¡ã®1ã€ã®å¯èœæ§ã¯ãsyntexã®https://github.com/sfackler/rust-postgres-derive/blob/master/postgres-derive-codegen/src/libã«ããã¶ã䌌ãŠããæ¡åŒµåŸã®ã³ãŒã«ããã¯ãè¿œå ããããš
掟çimplã¯ç¬ç«ããŠããŠãå¶åŸ¡å±æ§ãåé€ããããšã¯ã§ããŸããããŸããã¯ãªãŒã³ã¢ããã®ããã«ãã¹ãŠã®å±éãå®äºããåŸã«å®è¡ããããã¹ãç»é²ã§ããŸãã
ãã£ãŒãŒã«ãæåã§ãããåé¿ããŠããŸãã https://github.com/diesel-rs/diesel/blob/master/diesel_codegen/src/lib.rs#L101 -L112
@dtolnayè€æ°ã®#[derive]
å±æ§ã«é¢ãã以åã®æžå¿µã¯ã @ jseyfriedã®ãããã§ãŸããªãä¿®æ£ãããã¯ãã§ãã
syn
ãšquote
ããã±ãŒãžã䜿ã£ãŠãããè©ŠããŠã¿ãŠãæ¬åœã«ååããªçµéšãããŸããã ããã¯ãå®å®ãããšãã«åªããæ©èœã«ãªããŸãã
å±æ§ã®åé¡ã¯çŸåšã serde
ã®æŽŸçããžãã¯ã®äžæµã«ããç§ã®implãåãã§ããŸãã
掟çã³ãŒãã§æªäœ¿çšã®å±æ§ãç¡èŠããããéåžžã®æŽŸçã®åŸã«å®è¡ãããé ãæ¡åŒµãèš±å¯ããŠããããåé€ããããšã¯ãç§ã«ãšã£ãŠåççãªè§£æ±ºçã®ããã«æããŸãã
ãã¯ãã«å ã®ããŒã¯ã³ã¹ããªãŒã ãå€æŽãããªãã·ã§ã³ããªãå Žåã¯çæ³çã§ããããã¯ãçŸåšãšãã¯ã2.0ã®éã§å®éã«äŸåãããå¯èœæ§ããããåŸã§åé€ããã®ãé£ããå±éºãªæ©èœã®ããã§ãã
ãã®ãããé¢æ°ãžã§ããªãã¯å ã®åãã¹ã«ã»ãã³ãã³ããããŸããã§ãããrustcãã次ã®ãšã©ãŒã¡ãã»ãŒãžã衚瀺ãããŸããã ã©ã®æŽŸçãã¯ããlexãšã©ãŒãåŒãèµ·ãããããã©ã®ããŒã¯ã³ããããåŒãèµ·ãããããªã©ãããå€ãã®æ å ±ãæäŸã§ãããã©ããçåã«æã£ãŠããŸãã
error: custom derive attribute panicked
--> src/simple.rs:69:1
|
69 | struct C(u64);
| ^^^^^^^^^^^^^^
|
= help: message: Failure parsing derived impl: LexError { _inner: () }
LexErrorã®ãã¹ãã±ãŒã¹ãäœæããŸããã10æ13æ¥ã®å€ã«çºçããããã§ãïŒrustupã«ã¯æŽæ°ããããŸããã§ããïŒ https://github.com/keeperofdakeys/proc_macro_derive_testã
@ rust-lang / lang掟çç©ã泚éä»ãã¢ã€ãã ãå€æŽã§ãããã©ããã®åé¡ã«ã€ããŠè°è«ããå¿ èŠããããšæããŸãã ãããå¯èœã«ããã®ã¯ç°¡åãªè§£æ±ºçã§ããããŠãŒã¶ãŒã®æåŸ ã«åããŠããããã§ãããªã人æ°ããªãããã§ãã ç§ã¯ãŸã çŸåšã®è§£æ±ºçã奜ã¿ãŸã-ã·ã³ãã«ãã¯çŽ æŽããããææ¡ããã代æ¿æ¡ã®ã©ããç§ãéåžžã«åªããŠãããšã¯æããŸããã
ã¢ã€ãã ãå€æŽã§ããå Žåã¯ãå±æ§ãå¶åŸ¡ããããã®ãœãªã¥ãŒã·ã§ã³ãå¿ èŠã«ãªããŸãã ïŒå°æ¥çã«ïŒé掟çå±æ§ãã¯ããå¯èœã§ããéãã掟çãã¢ã€ãã ãå€æŽããæ©èœãç¶æããããšã«ã€ããŠãç§ã¯ç¹ã«åŒ·ãæããŠãããšã¯æããŸããã
誰ãããå€æŽããå®çŸ©ããå¿ èŠããããŸãã æ§é äœã®ã¡ã³ããŒãå€æŽããããšã«ã€ããŠè©±ããŠããã®ã§ããããããšãã³ã³ãã€ã©ãæªç¥ã®å±æ§ã«ã€ããŠæå¥ãèšãã®ãé²ãããã«å±æ§ãåãé€ãããšã«ã€ããŠè©±ããŠããã ãã§ããïŒ
æ§é äœã®ã¡ã³ããŒãå€æŽããããšã«ã€ããŠè©±ããŠããå Žåãç§ã®æèŠã§ã¯ãããããæåã®è§£æ±ºçã¯ãä»ã®ãã¹ãŠã®åã«å±éãããåæ§é äœã§1ã€ã®æ§é äœå€æŽãã¯ãã®ã¿ãèš±å¯ããããšã§ãã ããã¯æ確ã«å®çŸ©ãããïŒç§ã®æèŠã§ã¯ïŒæåŸ ãããæ¯ãèããããã§ãããã
å±æ§ã®ã¹ããªããã³ã°ã«ã€ããŠã®ã¿è©±ããŠããå Žåã¯ããã¯ãã®è£éã«ä»»ããã®ã§ã¯ãªãããã¯ãã¡ã«ããºã èªäœã«å±æ§ãçµ±åããæ¹æ³ãããã¯ãã§ãã
掟çãã©ã®ããã«åäœãããã«ã€ããŠã®ç§ã®çŽæã¯ããããimplãè¿œå ãããšããããšã§ãã ãšã³ããŠãŒã¶ãŒã«ãšã£ãŠãderivesã¯implsãè¿œå ããä»ã«äœãããªãããã«èŠããã¯ãã§ãã ç¹ã«ãä»ã®æŽŸçç©ã«ãšã£ãŠéèŠãªæ¹æ³ã§æ§é äœãå€æŽããã¹ãã§ã¯ãªããããé åºã«äŸåããªãããã«ããå¿ èŠããããŸãã ããã掟çã®åäœæ¹æ³ã§ããããšã«åæããŸããããããšã掟çãã¢ã¿ãããããåã«å¯ŸããŠå€æãå®è¡ã§ããå¿ èŠããããšäººã ã¯èããŸããïŒ
ããã«åæãããšãåé¡ã¯æ¬¡ã®ããã«ãªããŸããå ¬éããã€ã³ã¿ãŒãã§ã€ã¹ã§ããã匷å¶ããã®ãããããšãäœæè ã«ããã匷å¶ããããã«ä»»ããã®ãã ããã§ã¯ã2ã€ã®çžåããåé¡ãããããã§ãã
serde
ãšdeisel
ããã®å¶çŽã§æ©èœãããã«ã¯ãå€ãã®èª²é¡ããããŸãããããŠãã¡ãããä»ã®å±æ§ãæ§é äœãã©ã®ããã«å€æŽãããã¯ã掟çã®æ¹æ³ãå ·äœçã«ã¯ã©ã®ããã«åäœããããšã¯ç¡é¢ä¿ã®ããã§ãã
泚éä»ãã¢ã€ãã ãåé€ããæ©èœã«ãããçŸåšã®ã·ã¹ãã ãä»ã®æ¹æ³ã§ã¯æãããªãå€ãã®åœ¹å²ãæããããšãã§ããããšã¯æ³šç®ã«å€ããŸãã
@sgrifdeiselã
@withoutboatsãã®90ïŒ ã¯https://github.com/diesel-rs/diesel/blob/master/diesel/src/macros/macros_from_codegen.rs#L12-L18 ã ãããè¶ ããŠãå ¥åããŒã¯ã³ã¹ããªãŒã ã®äœãã«è§Šããã®ã¯ã泚éãåãé€ãããšã ãã§ãã https://github.com/diesel-rs/diesel/blob/master/diesel_codegen/src/lib.rs#L109 -L120
@sgrifãŸããã«ã¹ã¿ã 掟çãæªçšããŠãæç¶ãåã®bangãã¯ããååŸããŸããã å人çã«ã¯ããã¯ã1.1ã«æç¶ãåã®ãã³ã°ãã¯ãã·ã¹ãã ãããããã®æ©èœãä¹±çšããããªãããã«ããããšã匷ãæãã§ããŸãã ãã¯ãã«æž¡ãããTokenStreamã«ååšããªããã¹ãŠã®èå¥åãè¡çç¶æ ã§é ãããŠãããªã©ãæéãããããåçŽãªè¡çç¶æ ã®å Žåã¯ãã»ãŒåãæé ã®ãã³ã°ãã¯ãã¹ããŒãªãŒãå®è¡ããããšãè¯ãæ¹æ³ã ãšæããŸãããããã©ã®ããã«èŠãããæ£ç¢ºã«ã¯ããããŸããïŒãã«ã¹ã¿ã 掟çãæªçšãã代ããã«ããã䜿çšããŠãããã«ã¹ã¿ã 掟çãååšããæ§é äœãå€æŽã§ããªãããã«ããŸãã ããããããšã§ãããã«å€ãã®ã¯ã¬ãŒããæå¹ã«ããUXãæ¹åãã掟çãæ£æ°ã«ããããšãã§ããŸãã
ãã ããderiveãåçŽãªãã¯ããšããŠä¿æãããšããè°è«ã¯ç解ã§ããŸãã
ç§ã®èŠè§£ã§ã¯ããã¯ã1.1ã®ç®æšã¯ãå¯èœãªéãå€ãã®ããŒãºãæºããããã«å¯èœãªéãæè»ã§ãããã¡ã³ããã³ã¹ã®è² æ ãå°ãªãããããã¯ã2.0ãŸã§ã®è¿ éãªå®å®åãšäžæçãªã®ã£ãããšããŠæ©èœããããšãã§ããŸãã ç§ã®æèŠã§ã¯ãçŸåšã®èšèšã¯ãã®åœ¹å²ã«éåžžã«ããé©åããŠããŸãã
ãã®åœ¹å²ãæä¹ çã«æããããšãæå³ããäœãã«ã€ããŠè©±ããŠããããç§ã¯ããã«å察ããã§ããã
ç§ã¯ééã£ãŠãããããããŸããããRFCãèªãã ãšãããããã¯æ°žç¶çã«æŽŸçããåäœã®åºç€ãšãªãããšãç®çãšããŠããŸãã ã€ãŸããå°æ¥çã«ã¯ããã«å€ãã®ã¡ãœãããTokenStream
ã«è¿œå ãããŸããã掟çãã¯ãã¯ãã®APIã䜿çšããŸããããã«ãããçŸåšã泚éä»ãã¢ã€ãã ã«å¯ŸããŠä»»æã®ãã¥ãŒããŒã·ã§ã³ãå®è¡ã§ããŸãïŒãã®æ©èœã¯ãdeiselã®ãŠãŒã¹ã±ãŒã¹ã«å¿
èŠã§ãïŒã ïŒã
ããªããã£ãããããæ°žç¶çã«å®è¡ã§ããããã«ããããšã«ã€ããŠãç§ã¯ããªãåŠå®çã«æããŠããŸãã ãããå°æ¥ã®ããæç¹ã§macro_rules
ãã¯ããšãšãã«éæšå¥šã«ãªãã·ã¹ãã ã§ããããã¯ã2.0ã§ã¯ãããå¶éãããå¥ã®æŽŸçAPIãåªå
ãããããšãèªããå Žåãç§ã¯ããã§ããå¿«é©ã«ã
ãã³ã¬ãŒã¿ãäœã§ãã§ãããã©ã³ã¹ãã©ãŒããŒãšããŠãµããŒãããã€ããã®ããã§ãã
ãããŠãå±æ§ã«å
¥åã®ãªãåçŽãªãã³ã¬ãŒã¿ãšããŠå
¬éããã掟çã
@withoutboats ïŒserdeã¯ãimplã®çææ¹æ³ãå€æŽããããã®å€ãã®å±æ§ããµããŒãããŠãããããåŠçåŸã«ããããåé€ããããç¡èŠããæ©èœã絶察ã«å¿ èŠã§ãã ããã圹ã«ç«ã£ãããèªåãã¡ã§ããããã®ã§ã¯ãªããåé€ããå¿ èŠã®ããå±æ§ã®ãªã¹ããã³ã³ãã€ã©ãŒã«æäŸããããšãã§ããŸãã
@eddybç§ã¯ãã³ã¬ãŒããäœã§ãã§ããããšã«è³æã§ãããïŒé·æçã«ã¯ïŒ
@ericktããã§ãã é·æçã«ã¯ããããã®å±æ§ãåé€ããã®ã¯æŽŸçè ã§ã¯ãªããno-opã«ã¹ã¿ã å±æ§ãšããŠç»é²ããã®ãçæ³çãªè§£æ±ºçã«ãªããšæããŸãã ããããããã¯çæçã«ã¯å®çŸå¯èœã§ã¯ãããŸããã
é·æçã«ã¯ããããã®å±æ§ãåé€ããã®ã¯æŽŸçè ã§ã¯ãªããno-opã«ã¹ã¿ã å±æ§ãšããŠç»é²ããã®ãçæ³çãªè§£æ±ºçã«ãªããšæããŸãã ããããããã¯çæçã«ã¯å®çŸå¯èœã§ã¯ãããŸããã
ç§ã¯ãããçæçã«å®è¡äžå¯èœã«ããã³ã³ãã€ã©ã®å éšã«ç²ŸéããŠããŸããããã«ã¹ã¿ã 掟çãã©ã°ã€ã³ãåé€ããäºå®ã®ã«ã¹ã¿ã å±æ§ã®ãªã¹ãã衚瀺ããå±æ§ã®ãã®ä»ã®å€æãæåŠããããšã¯å¯èœã§ããããïŒãªãªãžãã«ã¢ã€ãã ïŒ
ãŸããDieselã¯ããã¹ãŠã®ã«ã¹ã¿ã å±æ§ã1ã€ã®ååã§æã€ãšããSerdeã®ã¢ãããŒãã«åŸããªãããšã«ãæ°ä»ããŸããïŒããšãã°ãDieselã®#[table_name = "name"]
ã§ã¯ãªã#[serde(rename = "name")]
ïŒãåäžã®ã«ã¹ã¿ã å±æ§åã ãã®å Žåãå®è£
ãç°¡çŽ åãããŸããïŒãªã¹ãã®ä»£ããã«ç»é²ãããŸãããïŒ
ã³ã³ãããŒã«å±æ§ã®åé¡ã®1ã€ã®å¯èœæ§ã¯ãsyntexã®https://github.com/sfackler/rust-postgres-derive/blob/master/postgres-derive-codegen/src/libã«ããã¶ã䌌ãŠããæ¡åŒµåŸã®ã³ãŒã«ããã¯ãè¿œå ããããš
掟çimplã¯ç¬ç«ããŠããŠãå¶åŸ¡å±æ§ãåé€ããããšã¯ã§ããŸããããŸããã¯ãªãŒã³ã¢ããã®ããã«ãã¹ãŠã®å±éãå®äºããåŸã«å®è¡ããããã¹ãç»é²ã§ããŸãã
ãã¯ã1.1ã®æ¡åŒµåŸã®ã³ãŒã«ããã¯ãpost-expansion
ã«å®è£
ããŸããã 掟çimplã¯ç¬ç«ããŠããŠãã³ã³ãããŒã«å±æ§ãåé€ããããšã¯ã§ããŸããããŸããå±æ§ãåé€ããããã«ãã¹ãŠã®å±éãè¡ãããåŸã«å®è¡ããããã¹ãç»é²ã§ããŸãã
æ¬æ¥ãlangããŒã ããŒãã£ã³ã°ã§å€æŽ/泚æã®åé¡ã«ã€ããŠè©±ãåããŸããã ãŠãŒã¶ãŒã®æåŸ ã«å¿ããåçŽã«ããããã«ïŒèšèšã®èŠ³ç¹ãããäžã«éããããããã¯ãå€ãããã解èª/ãããã°ãšã©ãŒã®åœ±é¿ãåãã«ããïŒãšããèŠæããããŸããã ã¿ãŒã²ããããŒã¿ã®å€æŽã¯é©ãã¹ããã®ã§ãããå®å šã§ã¯ãªãããšã«æ³šæããŠãã ããã ãŸããããæ°ã®ããçç±ã§ã¯ãªããããèªäœã®ããã«çŽç²ã«ãªããã¡ã§ãããšæããããŸããã
çµå±ããœãŒã¹ãå€æŽããªã掟çç©ã®æ¹ãããããåªããŠãããšå€æãããã®ã¢ãã«ã«å€æŽããå¿ èŠããããŸãã ããã¯FCPæéã延é·ããããšãæå³ãããããããŸããã ã¹ããªããã³ã°å±æ§ãåŠçããããã®ç¹å¥ãªã¡ã«ããºã ãããã¹ãã ãšã¯æããŸããã§ããã ããããã³ã³ãã€ã©ãå±æ§ãåŠçããæ¹æ³ã¯ããã¯ãã«ãã£ãŠäœ¿çšãããå±æ§ãããã°ã©ã ã«æ®ãããšãå¯èœã«ããå¿ èŠããããŸãã RFC 1755ã¯ããããèæ ®ã«å ¥ããå¿ èŠããããŸãã
ããã«ãããäžéšã®ã«ã¹ã¿ã 掟çãŠãŒã¶ãŒã®å®å®åãé ããŸãã ãã ãã掟çã®ã»ãšãã©ã®äœ¿çšïŒç¹ã«ãŠãŒã¶ãŒãå®å®ããããŒã«ãã§ãŒã³ããé ããããã®ïŒã¯å±æ§ã䜿çšããªããããããšãã°ãSerdeã®ã»ãšãã©ã®ãŠãŒã¶ãŒã¯ããã«å®å®ã«ç§»è¡ã§ããããã«ãªããŸãã å±æ§ãå¿ èŠãªãã®ã¯ãæ°ãµã€ã¯ã«é·ãããããŸãããäžè¬çãªã±ãŒã¹ã«ã¯åœ±é¿ããŸããã
cc @ alexcrichton ã @ dtolnay ã @ sgrif ã @ erickt-èãïŒ
å±æ§ã¯ãããããããªããææ¡ãããããSerdeãšDieselã§ããäžè¬çã«äœ¿çšãããŸãã ç§èªèº«ã®çµéšãããSerdeã䜿çšãããã¹ãŠã®ããã°ã©ã ãå±æ§ã䜿çšããŠãããšç¢ºä¿¡ããŠããŸãã Dieselã§ã¯ãééããªãå±æ§ã䜿çšããŸããã©ã®ããŒã¿ããŒã¹ããŒãã«ãæ§é äœã«ããããããŠããããdiesel_codegenã«äŒããããã«å¿ èŠã ãšæããŸãã
ããã¯èšã£ãŠããã«ã¹ã¿ã 掟çã«æ§é äœãå€æŽãããªãããšã¯ãç§ã«ãšã£ãŠæ£ããéžæã®ããã«æããŸãã ããã¯å šäœãåçŽåããã ãã§ãå€ãã®å¥åŠãªãšããžã±ãŒã¹ãé²ããŸãã ãã°ããå®è¡ãããããæ£ããå®è¡ããããšãéèŠã§ãããã®ãããæ©èœãããå°ãäžå®å®ãªç¶æ ã«ä¿ã€å¿ èŠãããå Žåã¯ãããã§ãåé¡ãªãããã§ãã
ã¿ãŒã²ããããŒã¿ã®å€æŽã¯é©ãã¹ããã®ã§ãããå®å šã§ã¯ãªãããšã«æ³šæããŠãã ããã
å®å šã§ãªãç¹æ§ãå°ãåºããªãéããããã¯å®å šã§ã¯ãããŸããã
ç§ã®æèŠã§ã¯ãã«ã¹ã¿ã 掟çã®ãŠãŒã¹ã±ãŒã¹ã®1ã€ã¯ãå®å šã§ãªããšããŒã¯ãããç¹æ§ãå®å šãªæ¹æ³ã§å®è£ ããããšã§ããããšãã°ãå®è£ ãããæ§é äœã®ã¡ã³ããŒã®ã¬ã€ã¢ãŠããæ£ç¢ºã«èšè¿°ããªããã°ãªããªãç¹æ§ãªã©ã§ãã
ç§ã®asn1ã¯ã¬ãŒãã«ã¯ãäºçŽ°ãªäœ¿çšæ³ä»¥å€ã®å±æ§ãå¿ èŠãªã®ã§ãã«ã¹ã¿ã å±æ§ãçå°ãããŸã§å¹æçã«åŸ ã€å¿ èŠããããŸãã
ã«ã¹ã¿ã å±æ§rfcã2ã€ã«åå²ããã®ã¯è¯ãèãã§ããïŒ
ã«ã¹ã¿ã å±æ§ãã¯ãã¯ãèä»ãããå Žåã«å€ãã®ããšãå¿ èŠãšãããã®ã®ããã«èŠããŸãã ãããã£ãŠãrfcã2ã€ã«åå²ãããšãã«ã¹ã¿ã 掟çããã±ãŒãžã®å®å®ããå±æ§ãããæ©ãæäŸãããå¯èœæ§ããããŸãã
ããã¯ãå±æ§ãåå空éã§ãããæå³çã§ããããšãæå³ããŸãïŒã€ãŸããã¯ã¬ãŒãã®å±æ§ã䜿çšããã«ã¯ãå€éšã¯ã¬ãŒããå¿ èŠã§ãïŒã ããã¯ãåãå±æ§åã䜿çšãã2ã€ã®ã«ã¹ã¿ã 掟çãã¯ããé²ãããã®è¯ãæ¹æ³ã§ãããšäºæž¬ã§ããŸãã ããã§ã®è¯ãæåŸ ã¯ãå±æ§ã«ç¹æ§ãå«ãŸããŠããã¯ã¬ãŒãã®ååã䜿çšããããšã§ãã
ãã®å®è£
ãéåžžã®name!
ãã¯ããå«ãŸãªãçç±ã¯ãããŸããïŒ éåžžã®ãã¯ãã®åçŽãªTokenStream
ã TokenStream
åºåã¯ãè€éãªææ³ã®ã³ã³ãã€ã«æéã30ç§ãè¶
ãã害è«ã«éåžžã«åœ¹ç«ã¡ãŸãã
@dragostis rfcã®èŠçŽãåŒçšããã«ã¯ïŒ
ã³ã³ãã€ã©ã§ä»æ¥ã®æç¶ãåãã¯ãã·ã¹ãã ã®éåžžã«å°ããªæçãæœåºããŸããããã¯ãã«ã¹ã¿ã 掟çæ©èœãªã©ã®åºæ¬æ©èœãååŸããã®ã«ååã§ãããæçµçã«ã¯å®å®ããAPIã«ãªããŸãã ãããã®æ©èœãã³ã³ãã€ã©ã«ã¡ã³ããã³ã¹ã®è² æ ããããªãããã«ããã ãã§ãªããåæã«ãå®ç§ãªãã¯ãã·ã¹ãã ãã«ååãªæ©èœãæäŸããããšããªãã§ãã ããã å šäœãšããŠãããã¯å ¬åŒã®ããã¯ã2.0ãã«åãã段éçãªã¹ããããšèŠãªãå¿ èŠããããŸãã
ãŸãã¯ãããå®éçãªçšèªã§ã¯ãçŸåšæ§ç¯ããŠããã¯ããŒãžã£ãŒã·ã¹ãã ãšåãããã«ãé©åã«æ©èœããæç¶ãåãã¯ãã·ã¹ãã ãååŸããã«ã¯ãå€ãã®èšèšãšãã¹ããå¿
èŠã«ãªããŸãã serde
ãdiesel
ãããªã¯ã¬ãŒãã«ã¯ãé©åãªã«ã¹ã¿ã 掟çæ©èœããªãããã«æ·±å»ãªãŠãŒã¶ããªãã£ã®åé¡ããããããä»ããä¿®æ£ããããã®äžæçãªå¯Ÿçãè¬ããŸããããæç¶ãåãã¯ãã·ã¹ãã ã syn
ãšquote
ç®±ã¯ããã®è¯ãäŸã§ãã
@keeperofdakeysãããããã£ãã ç§ã¯ãã¯ã2.0ã®å®è£
ãæ±ããŠããã®ã§ã¯ãªããå¥ã®å±æ§ãè¿œå ããããã®è² æ
ããããã©ããçåã«æã£ãŠããŸããããšãã°ãéåžžã®ãã¯ãã®æŽŸçèšèšã®ã¿ãåæ ããæå°éã®å®è£
ã§ããproc_macro
ã§ãã 害è«ã®äŸã§ã¯ã struct
ããŒãµãŒãåçŽã«å°åºããŸããã struct
èªäœããã¯å°åºããã {}
éã§å®çŸ©ãããåçŽãªææ³ããå°åºããŸãã ããããç§ã¯æ»ãã è°è«ãæãäžããŠããªãããšãé¡ã£ãŠããŸãïŒ
@dragostisç§ã¯å°ãåã«å éšã§ãã®å¯èœæ§ãæã¡åºããŸããã ããªãã¯ããã§å¿çãèªãããšãã§ããŸãïŒ https ïŒ
@nrc
ãŸããããæ°ã®ããçç±ããããããèªäœã®ããã«çŽç²ããæ±ããåŸåãããã®ã§ã¯ãªãããšæããŸããã
ããã«é¢ãã1ã€ã®æ³šæïŒãã©ã¡ããªã·ãã£ãå°éåãªã©ã®é£ãã決å®ãäžããªããã°ãªããªãã£ãå€ãã®å ŽåããçŽåºŠãã®é¢é£ããæŠå¿µãéçã«ä¿èšŒããããšã¯å°é£/äžå¯èœã§ãã ãããããã®å Žåãæ§é ã«ãã£ãŠãããä¿èšŒããããšã¯å®éã«ã¯éåžžã«ç°¡åã§ããã掟çã®é åºã®éèŠæ§ãæé€ããããšã¯ããŠãŒã¶ãŒã«ãšã£ãŠããªã匷åãªåçŽåã®ããã«æããŸãã
å®å®æ§ã«é¢ããŠã¯ãå±æ§ãç¡èŠããããã®äžå®å®ãªã¡ã«ããºã ãè¿œå ããããšãæ€èšã§ããŸããããã¯ãå€éã«äœ¿çšããå¿ èŠãããå Žåã§ããå®éã«ã¯å®å®ããŠããŸãïŒAPIãç ŽæããåŸåããªããšããç¹ã§ïŒã ãã®ãããªãµã€ããã£ãã«ã®å®å®åãæ€èšããããšãã§ããŸããå©çšå¯èœã«ãªã£ãããããäžè¬çãªã¡ã«ããºã ãåªå ããŠéæšå¥šã«ããäºå®ã§ãã ãŸãã¯ã @ keeperofdakeysã®ææ¡ãæ€èšããŠãåœé¢ã®æžå¿µã«å¯ŸåŠããäžè¬çãªå±æ§ãœãªã¥ãŒã·ã§ã³ã®äžéšããã°ããããã·ã¥ããããšãã§ããŸãã
ç§ã®èŠè§£ã§ã¯ããããã®æžå¿µã®ããããããã¯ã1.1ãSerdeã§åºã䜿çšå¯èœã§ãããå°ãªããšããäºå®äžãå®å®ããŠããïŒã€ãŸããå£ããŠããªãïŒããšãå€§å¹ ã«åŠšããªãããšãéèŠã§ãã
@sgrif
ãã®åœ¹å²ãæä¹ çã«æããããšãæå³ããäœãã«ã€ããŠè©±ããŠããããç§ã¯ããã«å察ããã§ããã
@withoutboatsããšã³ãŒãââãçŸåšã®æå³ã¯ããã¯ã2.0ãåºè·ããå Žåã§ããã¯ãæããŸããã ãã ããããã¯åèã§ããããšã§ããæçµçãªã·ã¹ãã ãå°å ¥ããããéæšå¥šã«ããããšãç®çãšããŠãä»æ¥ã®macro_rulesã®ããã«èããããšãã§ããŸãã
ã«ã¹ã¿ã 掟çã§ã®å±æ§ã®äœ¿çšã«é¢ããç§ã®å°è±¡ã¯ã @ jimmycuadraã®å°è±¡ã«äŒŒãŠããŸãããã€ãŸãããããã¯ããªãäžè¬çã«äœ¿çšãããŠããŸãã ç§ã¯ãã«ã¹ã¿ã å±æ§ãå€ãã®ãã£ãŒãŒã«ã®ãŠãŒã¹ã±ãŒã¹ã«ãšã£ãŠéèŠã§ãããšä¿¡ããŠããŸãïŒããããç§ãééã£ãŠããå Žåã¯èšæ£ããŠãã ããïŒã
ãã®æå³ã§ãç§ã¯ãããã®å±æ§ã«ã€ããŠåé²ããããã®æè¯ã®æ¹æ³ãäœã§ãããã100ïŒ ç¢ºä¿¡ããŠããŸããã ãã¯ã1.1ãå®å®ãããã®ã¯æ¥ãã¹ãããšã§ããããããããã¯ã1.1ããã°ããå®å®ããããšããç®çãããæãªããããïŒããšããããæ¯æ©ãäºå®äžå®å®ããŠããããšããŠãïŒå€ãã®ãŠãŒã¶ãŒãæ¯æ©æ®ããŸãã èšãæããã°ããã¯ã1.1ãŠãŒã¶ãŒã®å€§å€æ°ã_å®éã«_å®å®ããRustã«åŒã蟌ãŸãªãã®ã§ããã°ããã¯ã1.1ãå®å®ãããã®ã¯åŸ ã€ããšãã§ãããšæããŸãã
ããããç§ãæ©ãŸããŠãã1ã€ã®ãã€ã³ãã¯ãã«ã¹ã¿ã å±æ§ãé·æçã«ã©ã®ããã«èŠãããããããŠçŸåšã®ãã¯ã1.1ã·ã¹ãã ã§ãããåçåãããšç§ãã¡ãèããããšã§ãã ã«ã¹ã¿ã å±æ§ã®çŸåšã®RFCã§ã¯ãã¯ã¬ãŒãã¯ã¯ã¬ãŒãã®äžéšã«å±æ§ã®ãã¯ã€ããªã¹ãã«ç»é²ãããåå空éã宣èšããå¿
èŠããããŸãã ã€ãŸããã«ã¹ã¿ã 掟çã§ã«ã¹ã¿ã å±æ§ã䜿çšããããšã¯ãä»ã®å Žæã§ã«ã¹ã¿ã å±æ§ã䜿çšããããšãšã¯æ ¹æ¬çã«ç°ãªããŸãã ãã®åæã¯ã人éå·¥åŠçã§ãé©ãæå°ã®ã芳ç¹ããç§ãå¿é
ããŸãããRFCã埮調æŽããããã®åŒ·å¶æ©èœãšããŠãèŠãŠããŸãïŒããšãã°ã serde
ã¯ã¬ãŒãã«ãªã³ã¯ãããšãserdeå±æ§ãèªåçã«ãã¯ã€ããªã¹ãã«ç»é²ã§ããå¯èœæ§ããããŸãïŒã
å šäœãšããŠãä»æ¥ã®ãã¯ã1.1ã·ã¹ãã ãå®å šã«å®å®åãããŠãå人çã«ã¯é 調ã«é²ãã§ããŸãã ã€ãŸããã«ã¹ã¿ã 掟çå±éé¢æ°ãæ§é äœãåãåãããããä¿æãããå Žåã¯æ§é äœãè¿ãå¿ èŠããããšããäºå®ãå®å®ãããŸãã
ç§ã¯rustc-serializeããserdeã«åãæ¿ããåŸåããããŸããserdeã®ã³ãŒãçæã¯å¶åŸ¡å±æ§ããµããŒãããŠããããã§ãã
ãã¯ã1.1ãæ¡åŒµããŠã掟çå±æ§èªäœãžã®åŒæ°ããµããŒãããããšãã§ããŸãã ããã¯äžè¬çã«ã¯è¯ãããšã®ããã«æãããçæçã«ã¯å¶åŸ¡å±æ§ã®æ¬ åŠãåé¿ããããã«æªçšãããå¯èœæ§ããããŸãã
åäž@jimmycuadraãš@sfackler ãå±æ§ã¯@nrcã®ã³ã¡ã³ããããããå¥å šã«ããããã
ããã§ã®æ£ããåãã«ã€ããŠã¯ãŸã æèŠããããŸããããå±æ§ãªãã§å®å®ããå Žåã¯ãããã¥ã¡ã³ãã³ã¡ã³ãã解æããŠå±æ§ãåŒãåºãããšã匷ãæ€èšããããšãç¥ã£ãŠããŸãã å€ãã®äººã¯ã次ã®ããã«æžãããã ãã«ãã«ãã¹ã¯ãªãããæ±ããããªããšæããŸãã
#[serde(skip_serializing)]
.. ã®ä»£ããã«ïŒ
/// <!-- serde(skip_serializing) -->
@tomaka
ç§ã®æèŠã§ã¯ãã«ã¹ã¿ã 掟çã®ãŠãŒã¹ã±ãŒã¹ã®1ã€ã¯ãå®å šã§ãªããšããŒã¯ãããç¹æ§ãå®å šãªæ¹æ³ã§å®è£ ããããšã§ããããšãã°ãå®è£ ãããæ§é äœã®ã¡ã³ããŒã®ã¬ã€ã¢ãŠããæ£ç¢ºã«èšè¿°ããªããã°ãªããªãç¹æ§ãªã©ã§ãã
ãã®ç¹ã§ãç§ã®ã³ã¡ã³ãã«ã€ããŠã©ãæããŸããïŒ æºè¶³ã®ãããã¿ãŒã³ã§ããããšãããããŸããã
ç§ã¯äžã€ã®ããšãæ確ã«ãããïŒ
ã«ã¹ã¿ã å±æ§ãåé€ããããšã¯ã人ã ãã«ã¹ã¿ã 掟çã§è¡ãäž»ãªããšã§ããïŒ
ç§ãè¡ãã«ã¯ãããã€ãã®ãããã³ã°ãããããšãç¥ã£ãŠããfoo!
ãããã®ãŠãŒã¹ã±ãŒã¹ã¯ã©ã®ããã«äžå€®-ã¿ã€ãã®ã³ã³ããã¹ãã§æ¡å€§ïŒäŸãã°ã@sgrifã¯ãã£ãŒãŒã«ã§ããã®ãããªãŠãŒã¹ã±ãŒã¹ãè¿°ã¹ãç§ã¯@tomakaãããŸãã«ã1ã«è¿°ã¹ããšæããŸãïŒ ïŒ
ç§ãå°ããçç±ã¯ããã§ãïŒæŽŸçã¡ã«ããºã ãadd'limplsã®ãªã¹ãã ããè¿ãããã«ããããšã®å©ç¹ãããããŸãã ç¹ã«ãå宣èšèªäœã®ã¹ãã³ãæ£ããããšãæå³ããŸãã ãã®ã¿ã€ãã®ã³ã³ããã¹ãã§ãã¯ã€ããªã¹ãã«å±æ§åã®ãªã¹ããæäŸã§ããããã«ãããæã£åãæ©ãAPIãã³ã³ããã¹ãã«è¿œå ããããšã¯ãå±æ§ãä¿®æ£ããã®ã«ååç°¡åãªããã§ããããã€ã§ãéæšå¥šã«ããããšãã§ããŸãã
ãã ããããå€ãã®ãŠãŒã¹ã±ãŒã¹ãæå¹ã«ãããå ŽåïŒççŽã«èšã£ãŠããããã®ãŠãŒã¹ã±ãŒã¹ã¯ããå°ã...é©ãã¹ãããšã§ããã掟çããäœãæåŸ ããããèãããšïŒãããã¯æ©èœããŸããã ãã®å Žåãç§ã¯ãããããã®ãŸãŸå®å®ããã掟çãæžãããã®ããè¯ãæ¹æ³ãæ¯æããããã«ãçã®ãã€ããããAPIãéæšå¥šã«ããããšãèšç»ããŠãããšæããŸãïŒçµå±ã®ãšãããç§ãã¡ã¯äººã ããããªãããšãæ¬åœã«æåŸ ããŠããŸã
@nikomatsakisäž»ãªå¿ èŠæ§ã¯ãå±æ§ãåé€ããã®ã§ã¯ãªããç¡èŠããããšã§ãã ç§ã¯ããããç¡èŠããããšã®æ·±å»ãªæ¬ ç¹ãèªèããŠããŸããã ããšãã°ãmainå±æ§ãžã®è¿œå ãã©ã¡ãŒã¿ãä»ããŠæŽŸçé¢æ°ã®ãã¯ã€ããªã¹ããæäŸããããšã¯ãæç¶ãåãã¯ãããã¯ã§ã¯ãªãçã®æŽŸçã§ãããã¹ãŠã®å®éçãªããŒãºã«ååãªã¯ãã§ãã
ãããç§ã¯ããã«é¢ãã2ã€ã®ã¢ãããŒãã®éã§åŒãè£ãããŠããŸãããã©ã¡ãã«ãæãããªæ¬ ç¹ããããŸãã
ç·šéïŒãããã @ eddybã®ãã¯ã€ããªã¹ããææã«èãããŸãã
@nrcãïŒIIRCã¯ãŠãŒã¶ãŒã¯ã¬ãŒãã®ãã¯ã€ããªã¹ãã«ã€ããŠè©±ããŠãããïŒäœãéããã®ãææ¡ããŠãã
rust-cppã§macros1.1ã·ã¹ãã ãæªçšããŠããä»»æã®æç¶ãåãã¯ãã¯ãimplãè¿œå ããŠå±æ§ãç¡èŠããæ©èœãæäŸããå¥ã®ã¢ãããŒãã§å®å šã«å¯èœã«ãªããŸãã
å±æ§ãç¡èŠããæ©èœã¯äžå¯æ¬ ã ãšæããŸããããã以å€ã¯ããããè¶ ããŠæ§é äœãå€æŽã§ããªããŠãåé¡ãããŸããã
@sgrifã
@sfacklerã«ãã£ãŠææ¡ãããŠããããã«ãã«ã¹ã¿ã 掟çã«åŒæ°ãåãããšãèš±å¯ããããšã¯ãã«ã¹ã¿ã å±æ§ã«é¢ãã決å®ã延æã§ããããã«ããªãããå¿ èŠãªæ©èœããã¹ãŠã®äººã«æäŸããæ¹æ³ãããããŸããã èŠæ ããèªã¿ããããå£ããŸãããä»äºã¯çµãããŸãã äŸãã°ïŒ
#[derive(Debug, Clone, Serialize(field("bar", rename = "baz")))]
pub struct Foo {
pub bar: String,
}
ãã®ãã©ãŒã ã¯ãã«ã¹ã¿ã å±æ§ã«é¢ãã決å®ãäžããããšãåŸã§éæšå¥šã«ãªããã«ã¹ã¿ã å±æ§ãåªå ããå¯èœæ§ããããŸãã
Serdeãšç§ã®ã¯ã¬ãŒãã®äž¡æ¹ã«ãã£ãŒââã«ã/ããªã¢ã³ãå±æ§ãå¿ èŠã§ãã 掟çåŒæ°ã䜿çšããŠããããšãã¥ã¬ãŒãããããšããŠãæå³ããããŸãããå±æ§ãå¿ èŠã§ãã
ãããå®å®ãããããã«ã©ã®ãããªæ±ºå®ãäžããŠãããã¯ã2.0掟çAPIã«åãæ¿ãããšãã«ãã«ã¹ã¿ã 掟çãã¯ãã®ãŠãŒã¶ãŒãã³ãŒããå€æŽããå¿ èŠããªãå Žåã¯äŸ¿å©ã§ãïŒæããã«ãã«ã¹ã¿ã 掟çãã¯ãã®äœæè ã¯å€æŽããŸãïŒã æãè³¢æãªæ±ºå®ã¯ã掟çã®ããã«åé€ããå±æ§ã®ãªã¹ããã³ã³ãã€ã©ãŒã«æäŸããããšã§ããããã«æãããŸããéèŠãªããšã«ããããã¯_all_掟çãã¯ããå®è¡ãããåŸã«ã®ã¿åé€ãããŸãã Serdeããã£ãŒãŒã«ãããã³ç§ã®ã¯ã¬ãŒãã¯ãã¹ãŠãè€æ°ã®æŽŸçãã¯ãã«å¯ŸããŠåãå±æ§ãå¿ èŠãšãããšããåé¡ããããŸãã
ã¹ããªããã³ã°åäœã䜿çšãããšã @ dtolnayãå¥ã®æŽŸçãã¯ããè¿œå ããŠãæ®ãã®å®è¡åŸã«å±æ§ãã¹ããªããã³ã°ããããã«äœæããæ¡åŒµåŸã®ã¯ã¬ãŒãã¯å¿ èŠãããŸããã
FWIWãããã®å±æ§ãåé€ããå¯äžã®çç±ã¯ãHIRãã¹ãªã ã«ä¿ã€ããšã§ããä»ã®ãã¹ãŠã«é¢ããéãã䜿çšæžã¿ãšããŠããŒã¯ããã ãã§æžã¿ãŸãã
ã«ã¹ã¿ã å±æ§ãåé€ããããšã¯ã人ã ãã«ã¹ã¿ã 掟çã§è¡ãäž»ãªããšã§ããïŒ
ç§ã¯fooãè¡ãããã®ããã€ãã®ããã¯ãããããšãç¥ã£ãŠããŸãïŒ ã¿ã€ãã®æèã§æ¡å€§ïŒäŸãã°ã@sgrifã¯ãã£ãŒãŒã«ã§ããã®ãããªãŠãŒã¹ã±ãŒã¹ãè¿°ã¹ãããã«ãç§ã¯@tomakaãããŸãã«ã1ã«èšåãããšæãïŒ -ãããã®ãŠãŒã¹ã±ãŒã¹ã¯ãã©ã®ããã«äžå€®ã§ããïŒ
ã«ã¹ã¿ã 掟çã¯æ§é äœãå€æŽã§ããªããšããäºå®ã«ç§ã¯å®å šã«å€§äžå€«ã§ãã
å®å®ããRustã«ãã©ã°ã€ã³ããªãããšã«ã€ããŠäžå¹³ãèšãããšãããããã®ã§ãã«ã¹ã¿ã 掟çç©ãèŠããšãããã©ã°ã€ã³ãæã€æ©äŒãšããŠãããã䜿çšããŸããã ããããç§ã¯æããã«ãã«ã¹ã¿ã 掟çç©ãããããèšèšãããŠããªããã®ããµããŒãããªããã°ãªããªããšäž»åŒµããã€ããã¯ãããŸããã
æè¿ã®æ¯æ©ã«ååž°ãããããã§ãã ãšã©ãŒãçºçãã
Queryable
ã¯æŽŸçã¢ãŒãã§ã
äŸãã³ã³ãã€ã«ãããšãã
#[derive(Queryable)]
pub struct Post {
pub id: i32,
pub title: String,
pub body: String,
pub published: bool,
}
@sgrifããã¯ãä»ã®ãã¯ããšåãåå空éã䜿çšããããã«ã«ã¹ã¿ã 掟çãå€æŽããïŒ37198ãåå bang!()
ïŒ #[attribute]
ãã¯ããããã³#[derive(custom)]
ãã¯ãããã¹ãŠå
±æãããããã«ïŒåãåå空éïŒã
ãã®äŸã§ã¯ã #[macro_use] extern crate diesel;
ã¯Queryable
ãšããååã®bangãã¯ããã€ã³ããŒããã #[macro_use] extern crate diesel_codegen;
ã¯Queryable
ãšããååã®ã«ã¹ã¿ã 掟çãã¯ããã€ã³ããŒãããŸããããã¯bangãã¯ãããµã€ã¬ã³ãã«äžæžãããŸãïŒ - #[macro_use]
ãµã€ã¬ã³ãäžæžãã¯çæ³çã§ã¯ãããŸãããã use
代ããã«#[macro_use]
use
䜿çšããŠå€éšã¯ã¬ãŒããããã¯ããã€ã³ããŒãã§ããã°ãåé¡ã«ã¯ãªããŸããïŒïŒã
ãã®ãšã©ãŒã¯ãã«ã¹ã¿ã 掟çã®å±éã§ã®bangãã¯ãã®åŒã³åºãQueryable!();
ãåå ã§ãããšèããããŸããããã¯ã diesel
ããã®bangãã¯ãã§ã¯ãªãã diesel_codegen
ããã®ã«ã¹ã¿ã 掟çã«è§£æ±ºãããŸãã
@jseyfried 3ã€ã®ãçš®é¡ãã®ãã¯ããã¹ãŠã«åäžã®åå空éã䜿çšããçç±ã¯äœã§ããïŒ é¢æ°ãšåãåãåå空éãå ãããã®ãšããŠæ±ãããšã¯çã«ããªã£ãŠãã以äžã«ãå±æ§ãšbangãã¯ããåãåå空éãå ãããã®ãšããŠæ±ãããšã¯ç§ã«ã¯æå³ããªãããã§ãïŒãã¯ãã®æŽŸçã¯ããã«å°ãªããªããŸãïŒã
@withoutboatsããã¯ééã£ãäŸãã ãšæããŸããããŸããŸãªçš®é¡ã®ãã¯ãããããŸããŸãªçš®é¡ã®å€ãåïŒé¢æ°ãå®æ°ãªã©ïŒãšåãããã«åå空éãå ±æããŠãããšæããŸãã åå空éãæã€ããšã«ã¯è€éãªã³ã¹ããããããç§ã¯ç§ãã¡ãæã£ãŠããæ¹ãè¯ããšä¿¡ããŠããã®ã§ãåé¡ã¯ãªãç°ãªãåå空éãå¿ èŠãªã®ããšããããšã§ãã æããã«ãéäºæã®å Žåããã¯ãã¯é¢æ°ãåãšã¯ç°ãªãåå空éã«ããå¿ èŠããããŸãã
æ¬åœã®åé¡ã¯ã use
ã䜿çšããŠããã¯ããéžæçã«ã€ã³ããŒãããããååãå€æŽãããã§ããªãããšã§ãã ãããã£ãŠãã¯ã¬ãŒããŠãŒã¶ãŒã«ã¯ããã¯ãåã®è¡çªãåé¿ããæ©èœããããŸããã åæã«ãProcMacroã¯ã¬ãŒããã€ã³ããŒãããŠããŒã«ã«ãã¯ãåãšè¡çªããããšã¯æåŸ
ããŠããŸãã-掟çãã¯ãã¯derive_
å§ãŸã£ãŠãããšæããŸãããïŒ
åå空éãæã€ããšã«ã¯è€éãªã³ã¹ããããããç§ã¯ç§ãã¡ãæã£ãŠããæ¹ãè¯ããšä¿¡ããŠããã®ã§ãåé¡ã¯ãªãç°ãªãåå空éãå¿ èŠãªã®ããšããããšã§ãã
ã¢ã€ãã ã¯ãäºãã«ãããŸãã«ãªãå¯èœæ§ãããå Žåã«ã®ã¿åå空éãå ±æããå¿ èŠããããšæããŸãã constsãšfnsã¯ãã©ã¡ããåŒã³ã³ããã¹ãã§IDãšããŠäœ¿çšããããããåãåå空éã«ãããŸãã ãã¬ã€ããªããžã§ã¯ãã®æ§æã®ãããã¿ã€ããšãã¬ã€ãã¯åãåå空éã«ãããŸãã
ãããã®3çš®é¡ã®ãã¯ãã¯ããã¹ãŠç°ãªãæ¹æ³ã§åŒã³åºãããŸãã åŒã³åºãã«ãããŸãããçããããšã¯æ±ºããŠãªããããåå空éãå ±æããå¿ èŠãããããšã¯ç§ã«ã¯æå³ããããŸããã
å®è£ ã®è€éãã«ã¯ã³ã¹ããããããŸãããããããå¥ã ã«åå空éåããããšã«ãã£ãŠãè€éãã_䜿çš_ããããšã«å€§ããªã³ã¹ãã¯ãªããšæããŸãã èšèªæ©èœã®è€éãã®ã³ã¹ãã«ã€ããŠèãããšããç§ã¯éåžžã䜿çšã®è€éãã«ã€ããŠèããŸãã
é倧ãªå€æŽã§ã¯ãªãå Žåã_ãã¹ãŠã®_ã¢ã€ãã ã¯åãåå空éã«ããå¿ èŠããããšæããŸããïŒ ããªãã®æèããã»ã¹ã«ã€ããŠæ確ã«ããããšããŠããŸãã
ããå°ãèããŠã¿ããšããã¹ãŠã®ã¢ã€ãã ãå«ãŸããåå空éã¯1ã€ã ãã§ããå¿ èŠããããšèšã£ãŠãåé¡ãããŸããã ãå®éã®ã³ã³ã¹ãã©ã¯ã¿ãŒããã¿ãŒã³å šäœã¯IMOãå°ãæ··ä¹±ãããŸãããããã¯Rustãéãã¯ãã¢ã€ãã ã«å¯ŸããŠè¡ã£ã決å®ã§ã¯ãªãããããã¯ãã¢ã€ãã ãç°ãªãåå空éãå ããæ¹ãäžè²«æ§ããããæåŸ ãããããã§ãã
æ¬åœã®åé¡ã¯ãuseã䜿çšããŠãã¯ããéžæçã«ã€ã³ããŒããããååãå€æŽãããã§ããªãããšã§ãã
ãã¯ã2.0ã§ã§ããããã«ãªããŸãã ããã§ã®ã¢ãã«ã¯åºæ¬çã«äžæçãªããã¯ã§ãã
掟çãã¯ãã¯derive_ã§å§ãŸã£ãŠãããšæããŸãããïŒ
ããã¯å€ãã«ã¹ã¿ã 掟çã·ã¹ãã ã§ããããã¯ã1.1ããããè¡ããšã¯æããŸããã
å®è£ ã®è€éãã«ã¯ã³ã¹ããããããŸããã䜿çšã®è€éãã«ã¯å€§ããªã³ã¹ãã¯ãªããšæããŸã
䜿çšã®å®çŸ©ã«ã¯ã³ã¹ããããããŸããç¹ã«ãããŒã«ã®äœ¿çšãé£ãããªããŸãïŒããŸãè°è«ããªããããããŸãããïŒã ãŸããèšèªã®è€éãã»ã©éèŠãªã®ã¯å®è£ ã®è€éãã§ã¯ãªããšæããŸãïŒåå空éã¯ã³ã³ãã€ã©ãè€éã«ããŸãããããã¯ããã»ã©éèŠã§ã¯ãªãããšã«åæããŸãïŒ-ãŠãŒã¶ãŒã¯Rustã䜿çšããããã«ãã®ããšã«ã€ããŠæšè«ããå¿ èŠããããããã¯ãªã³ããããŸãè¡çãã·ã£ããŠã€ã³ã°ãªã©ã«åœ±é¿ãäžããäºæ ãããã«è€éã«ããŸãã
é倧ãªå€æŽã§ã¯ãªãå Žåããã¹ãŠã®ã¢ã€ãã ãåãåå空éã«ããå¿ èŠããããšæããŸããïŒ ããªãã®æèããã»ã¹ã«ã€ããŠæ確ã«ããããšããŠããŸãã
ããã»ã©é ããŸã§ã¯è¡ããŸãã-å€ãšåãåé¢ããããšã«ã¯å©ç¹ããããšæããŸããã確ãã«ãåäžã®åå空éãæã€èšèªã¯ãå€ãã®æ¹æ³ã§æäœããæ¹ãã¯ããã«åªããŠããŸãã
ããããããã¯Rustãéãã¯ãã¢ã€ãã ã«å¯ŸããŠè¡ã£ã決å®ã§ã¯ãããŸãã
察äœæ³ïŒã¢ãžã¥ãŒã«ãšãã£ãŒã«ãã¯å€ã®åå空éã«ãããŸããããããã䜿çšã§ããå Žæã¯ïŒç§ãæãã«ïŒä»ã®å€ã䜿çšã§ããå Žæãšã¯ç°ãªããŸãã
@keeperofdakeys
æ¬åœã®åé¡ã¯ã
use
ã䜿çšããŠããã¯ããéžæçã«ã€ã³ããŒãããããååãå€æŽãããã§ããªãããšã§ãã
ããã«ïŒã1é±éïŒæ©èœã²ãŒãã®åŸãã§extern crate
ããuse
ãã¯ããå®è¡ã§ããããã«ãªããŸããhttpsïŒ//github.com/rust-lang/rfcs/pull/1561ãåç
§ããŠuse
ingãã¯ãããã«ã¹ã¿ã 掟çèªäœãšãšãã«å®å®åããããšã決å®ããå ŽåããããŸãã
掟çãã¯ãã¯
derive_
å§ãŸããšæããŸãã
ããã¯ãå€ãã¹ã¿ã€ã«ã®ã«ã¹ã¿ã 掟çã«åœãŠã¯ãŸããŸããã ãã¯ã1.1ã®ã«ã¹ã¿ã 掟çã§ã¯ã #[derive(Serialize)]
ïŒããšãã°ïŒã¯Serialize
ãã«ã¹ã¿ã 掟çãã¯ãã«è§£æ±ºãããããšãæåŸ
ããŸãã
@withoutboats
3ã€ã®ãçš®é¡ãã®ãã¯ããã¹ãŠã«åäžã®åå空éã䜿çšããçç±ã¯äœã§ããïŒ
- åªå é äœïŒbangãã¯ããšå±æ§ãã¯ãã¯é·ãéåå空éãå ±æããŠããã®ã§ããã®å€æŽãè¡ããããŸã§ãã«ã¹ã¿ã 掟çç©ããã®åå空éãå ±æããå¿ èŠããããšæããŸãã
- äžäœäºææ§ïŒåäžã®ãã¯ãåå空éããéå§ããå Žåãäºææ§ãæã£ãŠäžäœã«åå²ã§ããŸãã è€æ°ã®ãã¯ãåå空éããå§ãããšãæ°žé ã«ãããã«åºå·ããŸãã
- ã·ã³ãã«ãïŒåãã¯ãã®ãçš®é¡ãã«ç¬èªã®åå空éãããå Žåãåèš5ã€ã®åå空éããããŸãã ãããã£ãŠã httpsïŒ//github.com/rust-lang/rfcs/pull/1561ãçéžããåŸã
use foo::bar;
ã¯bar
ïŒå€ãã¿ã€ãããã³ã°ãã¯ãïŒãšããååã®_5ã€ã®åå¥ã®ã¢ã€ãã _ãã€ã³ããŒãã§ããŸãããªã©ïŒãããšãã°ãbangãã¯ããåãšã¯ã¹ããŒãããããã«ã¹ã¿ã 掟çãã¯ãã¯åãšã¯ã¹ããŒãããªãããŸãã¯ã«ã¹ã¿ã 掟çãã¯ããbaz
ãšããŠã€ã³ããŒãããç°¡åãªæ¹æ³ã¯ãããŸããã
äžäœäºææ§ïŒåäžã®ãã¯ãåå空éããéå§ããå Žåãäºææ§ãæã£ãŠäžäœã«åå²ã§ããŸãã è€æ°ã®ãã¯ãåå空éããå§ãããšãæ°žé ã«ãããã«åºå·ããŸãã
ããã¯ãç¹ã«1.1ãäžæçãªã®ã£ããã§ãããšæ³å®ãããŠããããã説åŸåããããŸãã ïŒ+1ïŒ
ããã¯ãããšãã°PartialEq!
ãšããmacro_rulesãã¯ããæã£ãŠãã人ã®ã³ãŒããå£ããŸããïŒ
ãããã PartialEq
ã¯ã«ã¹ã¿ã 掟çã§ã¯ãªããããä»æ¥ã®ãã¯ãåå空éã§ã¯å®çŸ©ãããŠããŸããã
#[derive(Foo)]
ã¯ãã«ã¹ã¿ã 掟çFoo
æ¢ãåã«ããŸãFoo
ããçµã¿èŸŒã¿æŽŸçãïŒ PartialEq
ã Copy
ãªã©ïŒã§ãããã©ããã確èªããŸãããã¯ãåå空éã®Foo
ã ãã«ãã€ã³ã¯derive
ã®å®çŸ©ã«ããŒãã³ãŒããããŠããŸãã
ããã¯èšã£ãŠããæçµçã«PartialEq
çµã¿èŸŒã¿ã§ã¯ãªããã¬ãªã¥ãŒãã®ã«ã¹ã¿ã 掟çã«ããããšã«ããå Žåãããªãã説æããããã«ã³ãŒããå£ãå¯èœæ§ãããã®ã§ãä»ã®ãšãããããå°æ¥èšŒæããã®ã¯è¯ãèããããããŸããã
å±æ§ã®åé¡ã®ææ¡ïŒæŽŸçãã¯ãã宣èšãããŠããã¢ã€ãã ãå€æŽã§ãããè£ é£Ÿããã ãã®ã¢ãã«ã§äœæ¥ããŠãããšä»®å®ïŒïŒ
MultiItemModifier
ç¹æ§ãå®è£
ããŠããŸãã ãã¯ã2.0ãåŒãç¶ãç¹æ§ãå®è£
ãããã®ç¹æ§ãã¡ã«ããºã ã®æ¡åŒµæ§ã®ããã«äœ¿çšãããããšãèšç»ã§ãã ãã¯ãã§ãã泚éä»ãé¢æ°ã¯ããã®ç¹æ§ãå®è£
ããŸãã ãã©ã°ã€ã³ã¬ãžã¹ãã©ã¯äœ¿çšããŸããããããã¯æ¬è³ªçã«è±ç³ã§ããCustomDerive
ç¹æ§ãåå²ããå¿
èŠããããŸãã äžè¬çãªã±ãŒã¹ã§ã¯ããã¯ãã®äœæè
ã¯ãããèŠãããšã¯ãããŸããã ãã ããé¢æ°ã§å±æ§ã䜿çšããã®ã§ã¯ãªãããã¬ã€ããçŽæ¥å®è£
ãããªãã·ã§ã³ããããŸãïŒimplã§å±æ§ãåå©çšããããšãæåŸ
ããŠããŸããããããããã®ç»é²ã¡ã«ããºã ã«ã€ããŠèª¬æããå¿
èŠããããŸãïŒãdeclare_attributes
ã«é¢æ°ãCustomDerive
è¿ãVec<String>
ã 空ã®vecãè¿ãããã©ã«ãã®implããããŸããdeclare_attributes
_è¿œå _ããããã®ã¡ã«ããºã ã¯éæšå¥šã«ãªããŸãããdeclare_attributes
ã«ãã£ãŠè¿ãããæååã¯ãå±æ§ã®ãã¹ãã¬ãã£ãã¯ã¹ãšããŠãã§ãã¯ãããŸããããšãã°ã declare_attributes
ãvec!["foo::bar"]
è¿ããå Žåã #[foo::bar::baz]
ãš#[foo::bar::qux]
ã¯èš±å¯ãããŸããèãïŒ cc @alexcrichton @jseyfried @dtolnay @sgrif @erickt @ rust-lang / lang
@nrcã¯ããã®ã¡ã«ããºã ã«ããã #[cfg(..)]
ãªã©ã®_used_å±æ§ãå¶ç¶ãŸãã¯æ
æã«ç¡å¹ã«ããããšãã§ããŸããïŒ ãããŠãããã¯å€æŽã§ããŸããïŒ
@nrcæ®å¿µãªããããããã®å¶çŽããããšå®è£ ãã©ã®ããã«ãªããã¯ããããããŸããããã®ããããããæ©èœãããã©ããã¯å®å šã«ã¯ããããŸããã
ããã¯èšã£ãŠãããã¬ã€ãã®ã€ã³ã¹ã¿ã³ã¹ã¯ã©ãã§äœæãããŠããã®ã§ããã¬ã€ããšãã¬ã€ããªããžã§ã¯ããæ©èœãããã©ããã«ã€ããŠã¯å°ãæççã§ãã
@nrcãªããããå¿
é ã§ãããderivwãšã¯ã¹ãã³ãé¢æ°ãæå®ããå±æ§ã®ãªã¹ãã«ããããšãã§ããªãã®ã§ããïŒ äŸïŒ #[proc_macro_derive(Serialize, uses_attrs(serde_foo, serde_bar))]
ãªã©ã
@ collin-kiegel掟çã¢ããªã±ãŒã·ã§ã³ã®ã¹ã³ãŒãã«ã®ã¿é©çšã§ãããšæããŸãããã®å Žåããã¯ãå±éã®åã«cfgãé©çšããå¯èœæ§ããããšæããŸãããä»ã®å±æ§ãç¡å¹ã«ããããšã¯ããããäºæ³ãããåäœã§ãïŒããã¯å€æŽãããŸããããèŠããŠããŸããïŒåãšåŸïŒã
@alexcrichton
ããã¯èšã£ãŠãããã¬ã€ãã®ã€ã³ã¹ã¿ã³ã¹ã¯ã©ãã§äœæãããŠããã®ã§ããã¬ã€ããšãã¬ã€ããªããžã§ã¯ããæ©èœãããã©ããã«ã€ããŠã¯å°ãæççã§ãã
ããŒããè¯ãç¹ã§ãããã¯ã2.0ã§ã¯ããã«å¯ŸåŠããå¿ èŠããããšæããŸãã
@eddybããã¯è¯ãèãã§ãããããããçæçã«ã¯ç°¡åã§ãã åœä»€åã¢ãããŒãã奜ãç§ã®çç±ã¯ããããäžè¬çãªæ¡åŒµã¡ã«ããºã ã§ãããç¶æããããã®ã§ããã®ã«å¯Ÿããå±æ§ã«ç©äºãè¿œå ããããšã¯ããŸãããŸãã¹ã±ãŒãªã³ã°ãããæ°žé ã«åºå·ããããã®ã§ã¯ãªããããããªãããã§ãã äžæ¹ã§ãä»ã¯ç¢ºãã«ç°¡åã§ãã¶ãã¶ãããŠããã®ã¯æªãããšã§ã¯ãªãããã«æãããã®ã§ããã£ãšè¯ãè³ããããããªããšæããŸãã
å·»ã蟌ãŸããŠ-ç§ã¯åœå€ã«åºãŠããã®åŸç
æ°ã«ãªããŸããã ãã¹ãŠã®çš®é¡ã®ãã¯ããåãåå空éãå ããããšã¯æå³ããªããšæãã®ã§ã httpsïŒ//github.com/rust-lang/rust/pull/37198ã«å床derive_Foo
ãªã©ã®åå空éã«ããããšãæåŸ
ããŸãã æšæºã©ã€ãã©ãªã§ãåãååã䜿çšããè€æ°ã®ã¿ã€ãã®ãã¯ãã®ãŠãŒã¹ã±ãŒã¹ããããŸãïŒäŸïŒ #[cfg]
ããã³cfg!
ïŒ
ãŸããå ±æåå空éã¯å°ãåä»ã ãšæããŸãã ãšã³ããŠãŒã¶ãŒã®èŠ³ç¹ããã¯ãããçš®ã®äºææ§ããããŸããããŸãã¯äœãé¢çœãããšãèµ·ãã£ãŠããããã«èŠãããããããŸããããããã§ã¯ãããŸããã ãã®ãããªãã©ã³ãã ãªãå¶éã«ãããRustãèšèªãšããŠç解ããã®ãå°ãé£ãããªãå¯èœæ§ããããšæããŸãã
ããããããã¯ããããäžçã®çµããã§ã¯ãªããšæããŸãã å°æ¥çã«ã¯ãå€ãã®ããšãå£ãããšãªããããŸããŸãªåå空éãå°å ¥ãããå¯èœæ§ãããããã§ãã
@sgrif @ collin-kiegel https://github.com/rust-lang/rust/issues/35900#issuecomment-256247659ã§åäžã®ãã¯ãåå空éã®çè«çæ ¹æ ã説æããŸããã
ãã¹ãŠã®çš®é¡ã®ãã¯ããåãåå空éãå ããããšã¯æå³ããªããšæããŸã
æ確ã«ããããã«ãbangãã¯ããšå±æ§ãã¯ãã¯åžžã«åãåå空éãå ããŠããŸããã ïŒ37198ã«ã¹ã¿ã 掟çããã®åå空éã«ç§»åããŸããã
æšæºã©ã€ãã©ãªã§ãåãååã䜿çšããè€æ°ã®ã¿ã€ãã®ãã¯ãã®ãŠãŒã¹ã±ãŒã¹ããããŸãïŒäŸïŒ
#[cfg]
ããã³cfg!
ïŒ
ãããã¯ã cfg
ã¯ãbangåŒã³åºããŸãã¯å±æ§åŒã³åºããä»ããŠäœ¿çšã§ããåäžã®ãã¯ããšèŠãªãããšãã§ããŸãïŒçŸåšããŠãŒã¶ãŒãbangãŸãã¯å±æ§ãä»ããŠåŒã³åºãããšãã§ãããã¯ããå®çŸ©ããããšã¯ã§ããŸãããããã¯ã2.0ã§èš±å¯ããããšã決å®ãããããããŸããïŒã
ãšã³ããŠãŒã¶ãŒã®èŠ³ç¹ããã¯ãããçš®ã®äºææ§ãããããã«èŠãããããããŸãã
ããã¯ã2ã€ã®ãã¯ãã競åããå Žåã«ãæ確ãªãšã©ãŒã¡ãã»ãŒãžã§æ¹åã§ãããšæããŸãïŒä»æ¥ã®ã¡ãã»ãŒãžã®æ¹åã«åãçµã¿ãŸãïŒã
å°æ¥çã«ã¯ãå€ãã®ããšãå£ãããšãªããããŸããŸãªåå空éãå°å ¥ã§ããããã§ãã
ãã¯ãåå空éã®åå²ã¯å®å šã«äžäœäºææ§ããããšæããŸãïŒééã£ãŠããå Žåã¯èšæ£ããŠãã ããïŒã ããããä»æ¥åäžã®ãã¯ãåå空éãç¶æããããã®ç§ã®äž»ãªåæ©ã§ãããã¯ã1.1ã«å¯èœãªéãå°æ¥ã®äºææ§ãæãããããšèããŠããŸãã
æåŸã«ãbang /å±æ§ãã¯ããšã«ã¹ã¿ã 掟çãã¯ãã®ç«¶åã¯å®éã«ã¯ãŸãã ãšæããŸããããã¯ãbang /å±æ§ãã¯ãã¯éåžžå°æåã§ãããã«ã¹ã¿ã 掟çã¯é垞倧æåã§ããããã§ãã èšãæãããšããããã®åœåèŠåã«åŸã£ãŠããå Žåãã«ã¹ã¿ã 掟çã«ã¯ãã§ã«ç¬èªã®åå空éããããŸãã
ç ŽæïŒhttps://github.com/diesel-rs/diesel/issues/485ïŒã¯ã Queryable! { struct S; }
ã#[derive(Queryable)] struct S;
ãµããŒããåå ã®ããã§ãã ã«ã¹ã¿ã 掟çãå®å®ãããã Queryable! { struct S; }
ããµããŒãããå¿
èŠããªããªãã®ã§ãããã¯åé¡ã§ã¯ãªããªããŸãããïŒ
ãããŸã§ã®éã diesel
æŽæ°ããŠã
Queryable!
ã¯ã #[macro_use] extern crate diesel_codegen;
ãªããŠãåŒãç¶ããµããŒãããã#[derive(Queryable)]
ã¯ã Queryable!
ã§ã¯ãªãã #[macro_use] extern crate diesel_codegen;
ãµããŒããããŠããŸããæ°è»œã«IRCã§ç§ã«pingããŠè©±ãåã£ãŠãã ãããPRãæžããŠããã ããã°å¹žãã§ãã
@nrc @alexcrichton
ããã¯èšã£ãŠãããã¬ã€ãã®ã€ã³ã¹ã¿ã³ã¹ã¯ã©ãã§äœæãããŠããã®ã§ããã¬ã€ããšãã¬ã€ããªããžã§ã¯ããæ©èœãããã©ããã«ã€ããŠã¯å°ãæççã§ãã
@eddybã«åæããŸããå±æ§ãåŠçãã芳ç¹ãããå±æ§ãæ¡åŒµããã ãã§æžã¿ãŸãã
ããããããæè»ãªæ¡åŒµã·ã¹ãã ãå¿
èŠãªå Žåã¯ããã¬ã€ãã䜿çšããããšãæ³åããŠããŸãããããããã®ãã¬ã€ãã¯ã Self
åç
§ããªãã¡ãœããã®ã³ã¬ã¯ã·ã§ã³ãšããŠå®çŸ©ãããŸãã
trait CustomDerive {
fn foo(); // note: no self
fn bar(); // again, no self
}
次ã«ããããstruct my_annotation_type;
ãããªãããŒã¿ã€ãïŒå±æ§ãšåãååãå
±æããŠãããšæããŸããïŒïŒã«å®è£
ãããã¬ã€ã解決ã䜿çšããŠ<my_annotation as CustomDerive>::foo
ãããªé¢é£é¢æ°ãæœåºããŸãïŒããããã¡ã¿ããŒã¿ãæžãåºããšããç§ã¯æšæž¬ããŸãïŒã éèŠãªã®ã¯ã my_annotation
ã€ã³ã¹ã¿ã³ã¹ãäœæããïŒãŸãã¯å¿
èŠãšããïŒããšã¯æ±ºããŠãªããšããããšã§ããããã¯ãé¢é£ããé¢æ°ã®æããŸãšããããã®åãªãã°ã«ãŒãåã¡ã«ããºã ã§ãã
確ãã«ãããŸã§ã§æããšã¬ã¬ã³ããªãã®ã§ã¯ãããŸããããããè¯ãæ¹æ³ãããããŸãããïŒ ãšã¬ã¬ã³ã¹ããå±æ§é¢æ°ããå§ãããã£ãçç±ã ãšæããŸãã =ïŒ
åå空éã«é¢ããŠã¯ã @ sgrifã¯#[cfg]
ãšcfg!
äŸã§è¯ãäŸã瀺ããŠããŸãã ç§ã¯ç¢ºãã«#[derive(SomeTrait)]
ãæãã§ããŠã SomeTrait! { ... }
ãããª...äœãããããã¯ããæã£ãŠããããšãæ³åããããšãã§ããŸãã =ïŒãããã @ jseyfriedã¯ã_ãã§ã«_å¶éã«éããŠããªãéããäžäœäºææ§ã®è¯ãã±ãŒã¹ã«ããªããŸãã
ç§ã¯ããã©ã«ãã§ããå°ãªãåå空éã奜ãåŸåããããŸããããã¯äž»ã«ãå€/åã®åå空éãåå²ããããšã§ç§ãã¡ãèŠçãæããããã§ãã ããã¯èšã£ãŠããæ¢ç¥ã®åé¡ç¹ã®ã»ãšãã©ã¯ããã«ã¯åœãŠã¯ãŸããªããšæããŸãã
use foo::bar
ã¯bar
ãšããååã®ã¢ãžã¥ãŒã«ãã€ã³ããŒãããå Žåãšããªãå Žåãããããããã£ãŠbar::baz
ãããªåå解決ã«é¢é£ããïŒãŸãã¯é¢é£ããªãïŒå¯èœæ§ããããããã¿ã€ã/å€ã®åå²ã¯åå解決ã®èŠçã§ãã ãããã倧äœã«ãããŠãç§ãã¡ã¯æ©ãæž¡ã£ãã®ã§ããã«ã¹ã¿ã 掟çããããèªèº«ã®åå空éã«äœãŸãããããšãç¹å®ã®ææŠããããããã©ããã¯ããããŸãããïŒ
çæããããã¯ãã«derive_
ãã¬ãã£ãã¯ã¹ãè¿œå ããŠãããããç䌌åå空éã«ããããšãã§ããŸãã ãã®å€æŽãå ãããã®ã§ããã°ãä»ããã®æã§ãã
@keeperofdakeysããã¯ãã«ã¹ã¿ã derive_*
ãšããååãä»ããããšã決å®ããã«ã¹ã¿ã 掟çç©ã®äœæè
ãšåçã§ã¯ãªãã§ããããã ãšã«ããã derive_*
ååã¯ãšã³ããŠãŒã¶ãŒã«ãšã£ãŠéããããšæããŸãã
@nikomatsakis
ãããã倧äœã«ãããŠãç§ãã¡ã¯æ©ãæž¡ã£ãã®ã§ããã«ã¹ã¿ã 掟çããããèªèº«ã®åå空éã«äœãŸãããããšãç¹å®ã®ææŠããããããã©ããã¯ããããŸãããïŒ
ã€ã³ããŒã解決ã¢ã«ãŽãªãºã ã¯ãä»»æã®æ°ã®åå空éãåŠçã§ããŸãããåå空éããšã«éèŠãªéã®äœæ¥ãå®è¡ããå¯èœæ§ããããŸãã ç¹ã«ãã€ã³ããŒãI
ãšæªäœ¿çšã®åå空éS
ããšã«ã解決çI
ãS
倱æããããšã蚌æãããŸãïŒhttpsïŒ// githubãåç
§ïŒã com / rust-lang / rfcs / pull / 1560ïŒissuecomment-209119266ïŒã ãã®èšŒæã§ã¯ãé¢é£ããäžç¢ºå®ãªã€ã³ããŒããæ€çŽ¢ããããã«ãã°ããã€ã³ããŒãã°ã©ãïŒé ç¹ãã¢ãžã¥ãŒã«ã§ãšããžãã°ããã€ã³ããŒãïŒã®DFSãå¿
èŠã«ãªãããšããããããŸãã
ãã ãããã®äœåãªåå空éããšã®äœæ¥ã¯å®éã«ã¯éãããªãå¯èœæ§ããããå¿ èŠã«å¿ããŠåé¿ã§ããŸãïŒhttps://github.com/rust-lang/rfcs/pull/1560#issuecomment-209119266ãåç §ïŒããã¯ãåå空éã«ã®ã¿é©çšããããã€ããŒãªå¶éã
ïŒ37198ã§åå空éãããŒãžããŠãã»ãšãã©ã®å Žåãªãã·ã§ã³ãéãããŸãŸã«ããŸãããå®éã«ã¯å¶éããããšã¯æããªãã£ãããã§ãã 人ã ãä»æ¥ãããæãã§ããŠã@ rust-lang / langãæ°žé ã«è€æ°ã®ãã¯ãåå空éãæã£ãŠããŠã倧äžå€«ãªããç§ã¯ç°è°ã¯ãããŸããã
@nikomatsakis
äžæè°ãªããšã«ãããªãã®æŠç¥ã¯ããŸããããšæããŸãã ç§ã®å人çãªæèŠã¯ãå¥åŠãã¯ãã®éã¿ãåŒã£åŒµããªããšããããšã§ãïŒããšãã°ãä»æ¥ç§ãã¡ãæã£ãŠãããã®ã¯ç§ã«ãšã£ãŠã¯åé¡ãããŸããïŒããã©ã¡ãã®æ¹æ³ã§ãå®è£ å¯èœã§ããå¿ èŠããããŸãã
@alexcrichtonã¯ã以åæžãããšæããŸãããïŒããããã°ïŒãã£ãšãã¯ãŒãå¿
èŠã«ãªããŸã§åŸ
ã£ãŠå¹žãã§ããããããã°ãç§ã説æããç¹æ§ã®ãããªããšããããã¯ãã£ãšè¯ãããšãããããšãã§ããŸãã ä»ã®ãšããã fn
é©çšãããå±æ§ãæ¡åŒµããã ãã§ååã ãšæããŸãã
ç§ã¯èå³ãæã¡ããã®ã¢ã€ãã¢ã®åºæ¬çãªå®è£ ãéå§ããŸããïŒproc_macroé¢æ°ã®å±æ§ã䜿çšããŠãã¢ã€ãã ã§äœ¿çšãããŠãããšããŒã¯ãããå±æ§ã®ååã瀺ããŸãïŒã
ãŸã å®å®ããæºåãã§ããŠããªãããšãæãããªãããFCPã¿ã°ãã¯ãªã¢ããŸããã ç§ã¯äŒè©±ã®ç¶æ ãèŠçŽããããã«åªåããç¹ã«ã確åºãã決å®ãã³ãŒãã®è²¢ç®ããŸã å¿ èŠãªãšã©ãŒã匷調ããŸãã
ææ¡ïŒ
#[proc_macro]
ãæ¡åŒµããããããã䜿çšæžã¿ããšèŠãªããŠç¡èŠããããã«rustcã«æ瀺ããŸãåŒæ°ïŒ
#[derive(Foo)]
ãšfoo!
ïŒã¯ãã§ã«ç®çãæãããŠããŸãuse foo::Bar
ã¯ããšã«ããã©ã®åå空éãæå³ããã®ããå®éã«åºå¥ã§ããªããããå
±æããªãå Žåã¯æ··ä¹±ã®äœå°ãå°ãªããªããŸãå察æèŠïŒ
#[cfg()]
vs cfg!()
ã¯ä»æ¥çºçããŸãïŒãã ããã©ã¡ããã«ã¹ââã¿ã 掟çã§ã¯ãããŸãããããã¯ãå®è¡äžã®ã³ã³ããã¹ãããã¯ãã«éç¥ããããšã§å¯Ÿå¿ã§ããŸãïŒææ¡ïŒ
ä»ã«æªè§£æ±ºã®è³ªåã¯ãããŸããïŒ
çªç¶å€ç°ã®åé¡ã«å¯Ÿããæœåšçãªè§£æ±ºçïŒ
ã¿ã€ãTokenStream -> TokenStream
ã®ã«ã¹ã¿ã 掟çç©ã®ä»£ããã«ãã¿ã€ã
Item -> TokenStream
ãããã§Item
ã¯äžéæïŒOPAQUEïŒåã§ã次ã®2ã€ã®æ¹æ³ã§å§ãŸããŸãã
item.tokens()
ãããã¯ä»æ¥æž¡ãããTokenStream
ãè¿ããŸããitem.use_attrs(name)
ãããã«ãããæå®ãããååã®ãã¹ãŠã®å±æ§ã䜿çšæžã¿ãšããŠããŒã¯ãããŸããè¿ãããTokenStream
ã¯ã掟çããimpl
ã®ã¿ãå«ãŸããŸãã
æçµçã«ã¯ã䟿å©ãªé¢æ°ïŒã¢ã€ãã ã®ãã£ãŒã«ã/ããªã¢ã³ãã®å埩åŠçãªã©ïŒãŸãã¯syntax_ext::deriving::generic
ãããªé«ã¬ãã«ã®æŽŸçAPIã䜿çšããŠItem
ã®APIã«è¿œå ã§ããŸãã
ãã¯ã€ããªã¹ãã«ç»é²ãããå±æ§ã#[proc_macro_derive]
èš±å¯ããããã«å®è£
ã§ããã°å¹žãItem -> TokenStream
ææ¡ã
åºã«ãªãã¢ã€ãã ãå€æŽããå¯èœæ§ã®ããã«ã¹ã¿ã 掟çãå®å®ãããã®ã¯ééãã ãšæããŸãã ãã¥ãŒããŒã·ã§ã³ãèš±å¯ããããšã«ãã£ãŠç ç²ã«ããã¹ãã³æ å ±ã¯ããã§ã«åé¡ãåŒãèµ·ãããŠããŸããããšãã°ãä¿®æ£ïŒ37563ãšä¿®æ£ïŒ36218ã®ã©ã¡ãããéžæããå¿ èŠããããŸãã
åœä»€åãã¯ã€ããªã¹ãã®é åã¯æ¬åœã«ããããŸãããã誰ãããŠãŒã¹ã±ãŒã¹ãæãä»ãããšãã§ããŸããïŒ
ããããããŸãããããã®ã³ãŒããã³ã³ãã€ã«ããã®ã¯æå³ç/æãŸããã§ããïŒ
#![feature(proc_macro)]
#[proc_macro_derive(Whatever)]
struct Foo {}
@eddybåœä»€åãã¯ã€ããªã¹ãã®æ¬è³ªçãªé
åããããã©ããã¯
Item -> TokenStream
ã¯ãããå€ãã®çš®é¡ã®å®£èšåå±æ§ãè¿œå ãããããã Item
ã®APIãæ¡åŒµããæ¹ãç°¡åãªããšã§ãã ããã¯èšã£ãŠããããã«ã€ããŠããå°ãèããŠã¿ããšã TokenStream
ãããTokenStream
Item
ãå¿
èŠãšããä»ã®ãŠãŒã¹ã±ãŒã¹ã¯ããŸããªããããããªãã®ã§ã TokenStream
-> TokenStream
宣èšåãã¯ã€ããªã¹ãã䜿çšãã
ãã¯ã2.0ã¯ãã®APIã«åã£ãŠä»£ãããŸããïŒ ãããããªããæ¡åŒµæ§ã¯å®éã®æžå¿µäºé
ã§ã¯ãªãã Item -> TokenStream
apiã¯ããŸãé
åçã§ã¯ãªãããã§ãã
@keeperofdakeys RFCã«ãããšïŒ
å šäœãšããŠãããã¯å ¬åŒã®ããã¯ã2.0ãã«åãã段éçãªã¹ããããšèŠãªãå¿ èŠããããŸãã
ãã¯ã1.1ã®ç®çã¯ãèšå€§ãªéã®æ©èœãå®å®ãããããšãªãã粟ç¥ãšå®è£ ã«ãããŠãã¯ã2.0ã«å¯èœãªéãè¿ã¥ããããšã§ãã ãã®æå³ã§ãå®å®ãããã¯ã1.1ãäžããããã°ãæ©èœãéæ¹åã«éå±€åããŠãäºææ§ãæã£ãŠãã¯ã2.0ã«å°éã§ããããã«ããããšãæå³ãããŠããŸãã
https://github.com/rust-lang/rfcs/pull/1681#issuecomment-233449053ããã³https://github.com/rust-lang/rfcs/pull/1681#issuecomment-233708395ããã³httpsïŒ// githubã com / rust-lang / rfcs / pull / 1681ïŒissuecomment -239558657ã¯ããã¯ã2.0ãå°çãããšãã«ããéå®ããããéæšå¥šã®ã¿ãäºæ³ãããããšã瀺ããŠããããã§ãã ç¹ã«ããæåååããŒã¯ã³ããªãŒã®ãã¿ãŒã³ã¯ãå®éã«éæšå¥šã«ãªããªãéãã奜ãŸãããªããã®ã«ãªããŸããã
@eddyb
åœä»€åãã¯ã€ããªã¹ãã®é åã¯æ¬åœã«ããããŸãããã誰ãããŠãŒã¹ã±ãŒã¹ãæãä»ãããšãã§ããŸããïŒ
ããã§ãããå±æ§ã®ååãäœããã®æ¹æ³ã§åçã«çæãããå Žåãæ³åã§ããŸãïŒãããããã¿ã€ããŸãã¯ãã£ãŒã«ãã®ååã«åºã¥ããŠããŸããïŒïŒ-ãããã£ãŠãäºåã«å®£èšããããšã¯ã§ããŸããã ããããäžçš®ã®äººå·¥çãªããã§ãããç¹ã«è¯ãç¿æ £ã®ããã§ã¯ãããŸããã
@jseyfriedã®ä»£æ¿æ段ã¯é
åçã ãšæããŸããããã¯ãå±æ§ã䜿çšæžã¿ãšããŠããŒã¯ãããšããåœä»€çãªæ§è³ªã®ããã§ã¯ãªãã Item
APIãæéã®çµéãšãšãã«è±å¯ã«ãªãå¯èœæ§ãããããã§ãã ã€ãŸããéåžžã«æ§é åãããæ¹æ³ã§ãã£ãŒã«ãã®ã»ãããæ©ãããšããµããŒãããããèªç±ã«äœ¿çšã§ããããå€ãã®ããŒã¿ïŒååã®è§£æ±ºãªã©ïŒãžã®ã¢ã¯ã»ã¹ãæäŸãããããå ŽåããããŸãã
ãã¡ãããããã®äžéšã¯ãïŒæçµçã«ã¯ïŒäœããã®åœ¢åŒã®æšæºASTAPIãããååŸãããŸãã
ã¿ã€ãã³ã°ã«é¢ãã泚æïŒç§ã¯æ¬åœã«ããã¯ã1.1ã次ã®ãµã€ã¯ã«ã§å®å®ããã®ãèŠãããšæã£ãŠããŸãã ç§ãã¡ããããã¯ãããŠãããã®ã¯ãæçµçã«ã¯ããªããã€ããŒãªæããããŸãã
ãã®ç²Ÿç¥ã§ãç§ã説æããåé¡ã«ã€ããŠã®ç§ã®èŠè§£ïŒ
#[proc_macro]
æ¡åŒµå_ãŸãã¯_åãItem
å€æŽããããšã«æºè¶³ããŠããŸãã ãŸããã©ã¡ããéžãã§ããè¯ãã¢ã€ãã¢ã ãšæãã°ãå°æ¥çã«ã¯ããäžæ¹ãæ¡çšã§ããå¯èœæ§ããããšæããŸãã æåã«å®è£
ãããæ¹ãéžã³ãããšæããŸãã =ïŒ#[cfg]
ãšcfg!
åºå¥ããããšã¯ãä»ã®æ¹æ³ã§åŠçã§ãããã®ã®ããã«æããŸãããŸãã¯ãå¿
èŠã«å¿ããŠãåå²åå空éã_then_å°å
¥ã§ããŸãã çµ±äžãããåå空éãæã€ããšã¯ãç¹ã«ã«ã¹ã¿ã 掟çã®ãŠãŒã¹ã±ãŒã¹ã«æªåœ±é¿ãåãŒããŠããããã«ã¯èŠããŸãããããã¯ããšã«ããå®å®åã«ã€ããŠè©±ããŠããå¯äžã®ããšã§ãã æ£ããïŒ@nikomatsakisããªãã®èŠçŽã¯æ£ç¢ºã«èãããŸãããããæžããŠãããŠããããšãïŒ Rust 1.14ã§ãã¯ã1.1ãååŸãããªãã®ã¯æ®å¿µã§ããããããã¯è«äºã®çãšãªãåé¡ã§ããããšãç解ããŠããŸãã
ç§ã®å人çãªæèŠã¯ãã«ã¹ã¿ã 掟çãå±æ§ãåé€ããå¿ èŠããããåå空éã1ã€ãããªãå Žåããã¹ãŠããã®ãŸãŸå®å®ãããããšã§ãã
Item -> TokenStream
APIã«å®å
šã«ã¯åŸããŸããããè¿ãããããŒã¯ã³ã¹ããªãŒã ã«ã¯ãå
ã®ã¢ã€ãã ãå«ãŸããŠããŸããããããšãè¿œå ãããimplã ããå«ãŸããŠããŸããïŒ ããã¯&mut Item
ãããã¯ãã ãšããããšã§ããïŒ
@ est31ããªãã®ã³ã¡ã³ãã¯ãã°ã®ããã«èãããŸãããå¥ã®åé¡ãéãããšãã§ããŸããïŒ
@nikomatsakisã®ã³ã¡ã³ãã«ã»ãŒå®å šã«åæããŸãã 掟çããéèŠãªããšã¯ãããããã¢ã¿ãããããŠããã¢ã€ãã ãå€æŽããèªç±ãªçµ±æ²»ãæã£ãŠããªãããšã ãšæããŸãããææ¡ãããå®è£ ã¯ãã¹ãŠç§ã«ã¯åé¡ãªãããã§ãã
çµ±äžãããåå空éãæã€ããšã¯ãç¹ã«ã«ã¹ã¿ã 掟çã®ãŠãŒã¹ã±ãŒã¹ã«æªåœ±é¿ãåãŒããŠããããã«ã¯èŠããŸãããããã¯ããšã«ããå®å®åã«ã€ããŠè©±ããŠããå¯äžã®ããšã§ãã æ£ããïŒ
ãã®åé¡ã¯ãçŸåšQueryable!
ãšåŒã°ãããã¯ãããããæ§é äœãã©ããããŠQueryable
ãå°åºã§ãããã£ãŒãŒã«ãå£ããŠããããã«çºçããŸããã
çŸåšãã£ãŒãŒã«ã䜿çšãç¶æãããŠããªã人ãšããŠïŒã€ãŸããç§ãææ¡ããããšããŠããããšã«åœ±é¿ãããªã人ãšããŠïŒsweat_smile :)ãä»ã®ãšãã1ã€ã®åå空éãä¿æãããã£ãŒãŒã«ãååãå€æŽããã®ãæåã ãšæããŸãããããã®ãã¯ããderive_Queryable!
ãŸãã¯ãã®ãããªãã®ã«ã ãšã«ãããããå®å®ãããšãéæšå¥šã«ãªããŸãããïŒ
ææ¡ãããæ©èœã®PRhttpsïŒ//github.com/rust-lang/rust/pull/37614ãäœæããŸããã å¥ã®å±æ§#[proc_macro_attributes(..)]
ããè¿ãããTokenStream
ã¢ã€ãã ãè¿ãå¿
èŠããªããªããŸããã
procãã¯ãã$crate
ã©ã®ããã«åŠçããããç解ããããã«ãïŒ37637ãæåºããŸããã
æ確ã«ããããã«ããã®ãŠãŒã¹ã±ãŒã¹ã¯ã·ã¹ãã ã®å€§äžå€«ãŸãã¯èª€çšãšèŠãªãããŸããïŒ
ããã§ã¯ãæ¢åã®æ§é äœãšå±æ§ã«åºã¥ããŠæ°ããæ§é äœãçæããŸããããã«ãããç©äºã1ã€ã®æ§é äœã«çµ±åã§ããããããã¶ã€ã³ãéåžžã«æ°ã«å ¥ã£ãŠããŸãã
ãã ãããã®çš®ã®å®è£ ãèš±å¯ããªãããã«ã·ã¹ãã ãåŸã§å€æŽãããå¯èœæ§ãããå Žåã¯ãã·ã¹ãã ã«ããã«åãå ¥ããã®ã§ã¯ãªããä»ããåæ¢ããå¯èœæ§ããããŸãïŒçŸåšã®å®è£ ã¯æŠå¿µå®èšŒã«ãããŸããïŒã
@TheNeikos
åŸæ¹äºææ§ã®ãªãäž»ãªå€æŽã¯ãã¢ã€ãã ãå€æŽã§ããªããªã£ãããšã§ãïŒTokenStreamã«æ»ããªãïŒã impl以å€ã®ãã®ãå°åºããããšã¯æå³ãããŠããªããšæããŸããããããè¡ãããšã劚ãããã®ã¯äœããããŸããã ååã®è¡çªã«æ³šæããå¿ èŠããããŸãã
ãã1ã€ã®äž»ãªå€æŽç¹ã¯ãã¢ã€ãã ã§ã«ã¹ã¿ã å±æ§ãšã©ãŒãããªã¬ãŒããŠã¯ãªããªãå±æ§åã®ãªã¹ããæäŸã§ããããšã§ãã
REïŒãã£ãŒãŒã«ã§ã®åå空éã®ç«¶åã ãã®æ©èœãå®å®ãããããããã®ãã¯ããéæšå¥šã«ãããã©ããã¯ããããŸããããã³ã³ãã€ã©æ¡åŒµæ©èœã®ãªããã®ã«å¯ŸããèŠæããŸã ãããã©ããã«ãã£ãŠç°ãªããŸãã ããã¯çãããã§ãã å éšã§ã®ãã¹ãã«ã¯ãŸã 圹ç«ã¡ãŸãããååãå€æŽããŠãåé¡ãããŸããã
å ¥åã¹ããªãŒã ãå€æŽããæ©èœã倱ãã®ã¯æ®å¿µã ãšæããŸãã 泚éãä»ããããŠããã¢ã€ãã ãåé€ã§ããã®ã§ããã®ã·ã¹ãã ã§ããã³ã°ãã¯ãã䜿çšã§ããŸãã ç§ã¯æžå¿µãç解ããŠããŸããããããã«å¯Ÿãããã®èœåã倱ãããšã¯æ®å¿µã§ãã
@TheNeikos @sgrifç§ã®èŠè§£ã§ã¯ãå ¥åãå€§å¹ ã«å€æŽãããã®ã¯æŽŸçç©ã§ã¯ãªããããããã§åãäžããããšãæå³ããŠããŸããã æ±çšã®procãã¯ãã«ã«ã¹ã¿ã 掟çã䜿çšããããšã¯ããå±éºïŒè¡çç¶æ ã®æ¬ åŠãªã©ïŒã ãšæãã®ã§ãç§ã¯ããã奚å±ããããšã«ç±å¿ã§ã¯ãããŸããã
ã¢ã€ãã ãå€æŽã§ããªããšããããšã¯ãã¢ã€ãã ã®ã¹ãã³æ å ±ãä¿æãããããšãæå³ããŸããããã«ãããã¢ã€ãã ã®ãšã©ãŒã¡ãã»ãŒãžãããæ確ã«ãªããŸãïŒãŸãã掟çåºåã®ãšã©ãŒã¡ãã»ãŒãžãã¢ã€ãã ã®ã¹ãã³ã§ã¯ãªãã掟çå±æ§ã®ã¹ãã³ãæãããã«ãªããŸãïŒã é©åãªæç¶ãåãã¯ããæ¬åœã«å¿ èŠãªå Žåã«ããã®æ©èœãæªçšãããæ£åœãªçç±ã¯ããããŸããã
@TheNeikos掟çããæ§é äœã
ç§ãèããããšã«é¢ããŠã¯ãæ
£çšçã§ãã æ°ããã¿ã€ããçæããã®ã¯åé¡ãªããšæããŸããããããã®ã¿ã€ããã掟çããŠããç¹æ§ã«é¢é£ä»ããããã¿ã€ãã§ããå Žåã¯ãã¯ããã«åªããŠããŸãã ããšãã°ãåã®IntoIterator
ãå°åºã§ãããšãããã Iterator
æ§é äœãäœæããå¿
èŠããããŸãã æŠå¿µçã«ã¯ããã®ã¿ã€ãã®åäœãå°åºããå¿
èŠããããŸããããã®åäœã¯ãç¹æ§ã®æé»ãã§ã¯ãªãå¯èœæ§ããããŸãã
@sgrif
å ¥åã¹ããªãŒã ãå€æŽããæ©èœã倱ãã®ã¯æ®å¿µã ãšæããŸãã 泚éãä»ããããŠããã¢ã€ãã ãåé€ã§ããã®ã§ããã®ã·ã¹ãã ã§ããã³ã°ãã¯ãã䜿çšã§ããŸãã ç§ã¯æžå¿µãç解ããŠããŸããããããã«å¯Ÿãããã®èœåã倱ãããšã¯æ®å¿µã§ãã
ããŒããç§ã¯ééããªãåæ çã§ãããæããã«ïŒ @nrcãææããããã«ïŒããã¯ã·ã¹ãã ãèšèšããããã®ã§ã¯ãªããããŸããŸãªç²ããšããžãé²åºããåŸåããããŸãã ããã¯ããŠãŒã¹ã±ãŒã¹ã§ã¯ããããåé¡ã§ã¯ãããŸããã éèŠãªè³ªåã¯ããbangmacros1.1ãã®ãããªãã®ã«ã©ãã ãè¿ éã«ç§»è¡ã§ããããšããããšã ãšæããŸãã
PRãçµ±åãããã®ã§ã次ã®å€ã«æ¬¡ã®å€æŽã確èªã§ããã¯ãã§ãã proc_macro_deriveé¢æ°ã¯ã¢ã€ãã ãè¿ããªãã¯ãã§ãïŒãããããšãã¿ã€ãã2åå®çŸ©ãããŠãããšãããšã©ãŒãããªã¬ãŒãããŸãïŒããã®#[proc_macro_derive(Derive, attributes(Foo, Bar)]
ããã«ãå±æ§åã®ãªã¹ãããã¯ã€ããªã¹ãã«æäŸã§ããããã«ãªããŸããã
cc @ dtolnay ã @ sgrif ^
æ®å¿µãªããããã«ç Žæã®åå ã«ãªããŸã
ã¯ãã httpsïŒ//github.com/serde-rs/serde/issues/614ãæåºããŠè¿œè·¡ããŸããã
https://github.com/diesel-rs/diesel/pull/493ã§ãã£ãŒãŒã«ã®ç Žæãä¿®æ£ãããšæããŸãããã€ããªãŒãåã³æ§ç¯ããããã確å®ã«ããããŸãã
ãããã£ãŠããã®ã¹ã¬ãããæ£ããèªãã§ããå Žåãprocãã¯ãã¯æåã®ã¢ã€ãã ã«è¿œå ãããè¿œå ã®ã¢ã€ãã ããåºåã§ããªããããæåã®ã¢ã€ãã ã«æ³šéãè¿œå ããããšãã§ããŸãããïŒ ïŒãå åŒæ³šéããèš±å¯ãããšããèšåããããŸããããã以å€ã¯äœããããŸãããïŒ
ç§ã®ïŒå°ããªãæªå
¬éã®ïŒã¯ã¬ãŒãã«#[derive(newtype)]
procãã¯ããããã泚éãä»ããŠããæ§é äœã«åºã¥ããŠãä»ã®#[derive()]
ã®å¥ã®ã»ããã«å±éãããŸãã ããšãã°ã #[derive(newtype)] struct Foo(u64)
ã¯#[derive(Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] struct Foo(u64);
ã #[derive(newtype)] struct Foo(::semver::VersionReq)
ã¯#[derive(Clone, Debug, PartialEq)] struct Foo(::semver::VersionReq);
ãŸãã ãããã£ãŠãæ§é äœã¡ã³ããŒã¯ãã®ãã¯ãã«ãã£ãŠå€æŽãããŸããããä»ã®æŽŸçç©ãè¿œå ãããŸãïŒããããæ§é äœãå€æŽããŸããïŒã
ãã®ãããªæ§é äœã¯æ°åããããã®ãã¯ããå±éãããåŸãããããã«10åã»ã©ã®æ°ãã掟çç©ããããŸãã ãã¹ãŠã®u64
ãã¥ãŒã¿ã€ãã«ãã1ã€ã®ãã¬ã€ããå®è£
ãããå Žåã¯ããã¹ãŠã®æ§é äœã§ã¯ãªãã newtype
ãã¯ãã³ãŒãã®1ãæã§æŽŸçã»ãããå€æŽã§ããŸãã
以åã¯ãã®ããã«macro_rules newtype!
ãã¯ãã䜿çšããŠããŸãããã次ã®çç±ã§procãã¯ãã«åãæ¿ããŸããã
pub
æç¡ãªã©ã¯ããã¯ããããã¢ãŒã ã®çµã¿åããæ°ãå¿
èŠãšããã«ç¡æã§åŠçãããŸããæ®å¿µãªããããããããããŸã§ã®ããã«ãããè¡ãããšã¯ã§ããªããªããŸããã
ãã®æ©èœã®å°æ¥ã®äºææ§ãå®å®ããŠããããšã«ã€ããŠïŒãã©ã°ã€ã³é¢æ°ã¯ãçŽç²ãã§ããå¿ èŠã¯ãªããããåŠçãããé¢æ°ã«äžãããããªããžã§ã¯ãã®é åºãå°æ¥å€æŽãããå ŽåããŸãã¯rustcããã«ãã¹ã¬ãããå®è£ ããå Žåãé倧ãªå€æŽã«ãªããŸããïŒã³ã³ãã€ã«ããŸããïŒ
@ est31æéãããã°ãåšãã§èšåãããŠããIPCåé¢ã®ããšã
ææ°ã®å€æŽåŸããã£ãŒãŒã«ã§ICEãåžžã«è¡šç€ºãããŠããŸãã
../src/librustc_metadata/decoder.rs:490ïŒãšã³ããªïŒIDãèŠã€ãããŸããïŒçªå·28ã®ã¯ã¬ãŒããdiesel_codegenãã®DefIndexïŒ1ïŒ
@sgrifã¯ïŒ37788ã§ä¿®æ£ãããïŒ37793ã§ä¿®æ£ãããŸãïŒææ¥ã®å€ã«çµããããšãé¡ã£ãŠããŸã...ïŒã
@ est31ãã®æéã§ã¯ããã€ããªãŒãã«ããéå§ããåã«ããŒãžããã®ã¯é ãããŸãã
https://github.com/rust-lang/rust/issues/37839ã¯ãããèªäœãproc_macroã¯ã¬ãŒãã䜿çšããlibã¯ã¬ãŒãã®äœ¿çšã«é¢ããåé¡ã§ãã AFAICTãã¹ãã¯ãprocãã¯ãã¢ãžã¥ãŒã«ã®ã¿ãã³ã³ãã€ã«ããããprocãã¯ãã¢ãžã¥ãŒã«ãšprocãã¯ããçŽæ¥åç §ããbinã¢ãžã¥ãŒã«ãã³ã³ãã€ã«ããããããã®åœ±é¿ãåããŸããã
ç·šéïŒä¿®æ£ãããŸããïŒ
@ Arnavion ïŒ37839ã§èŠãåé¡ã¯éåžžã®è€éåã®ããã«ä¿®æ£ãããŠããŸãããïŒ37958ã§å ±åãããŠããããã«ã --target
ã䜿çšãããšå£ãããŸãŸã«ãªããŸãã --target
ãæå°éã®ãã¹ãã±ãŒã¹ãæäŸããŸããããããã§ãå£ããŸãã
@rfcbotfcpããŒãž
ãã¯ã€ããªã¹ãã«ç»é²ãããå±æ§æ©èœãå®è£ ãããã®ã§ããããå®å®ãããå¿ èŠããããšæããŸãã SerdeãDieselãããã³ãã®ä»ã®ãŠãŒã¶ãŒ-çŸåšã®ãã¶ã€ã³ãæ©èœããªãå Žåã¯ããªããžã§ã¯ããžã®å€æŽã«ãªããŸãã =ïŒ
cc @sgrif @erickt
ããŒã ã¡ã³ããŒã®@nikomatsakisã¯ããããããŒãžããããšãææ¡ããŸããã 次ã®ã¹ãããã¯ãã¿ã°ä»ããããæ®ãã®ããŒã ã«ããã¬ãã¥ãŒã§ãã
çŸåšãªã¹ããããŠããæžå¿µã¯ãããŸããã
ãããã®ã¬ãã¥ãŒã¢ãã³ã³ã»ã³ãµã¹ã«éãããšãããã¯æçµã³ã¡ã³ãæéã«å ¥ããŸãã ãã®ããã»ã¹ã®ã©ã®æç¹ã§ãæèµ·ãããŠããªã倧ããªåé¡ãèŠã€ããå Žåã¯ã声ãäžããŠãã ããã
ã¿ã°ä»ããããããŒã ã¡ã³ããŒãç§ã«äžããããšãã§ããã³ãã³ãã«ã€ããŠã¯ããã®ããã¥ã¡ã³ããåç §ããŠãã ããã
è¿ãå°æ¥ããã³ã°ãã¯ããæ¢æ±ãããã®ãèŠããã§ãã ããããç°è°ã¯ãããŸããã
@rfcbotã¬ãã¥ãŒ
çŸåšãTokenStreamã空ã®LexErrorã®è§£æã«å€±æããå Žåã
ã¯ããããã¯ãã¯ãã®äœè ã«ãšã£ãŠäŸ¿å©ã§ãããã ãšã©ãŒãèŠã€ããããã«ãã¹ããªãŒã ããã¡ã€ã«ã«æžãåºããŠãã¬ã€ã°ã©ãŠã³ãã§è¡šç€ºããããšã«é Œããªããã°ãªããŸããã§ããã
ãã¯ãã«å¯ŸããŠããè¯ããã°ã¬ããŒããæåºããã ãã§ããã°ããŠãŒã¶ãŒã«ãã¡ãªããããããšæããŸãã
https://github.com/rust-lang/rust/pull/38140ã§ãã«ã¹ã¿ã 掟ç宣èšãå ¬éããããã«åŒ·å¶ããŠããŸãã ãã€ã®æ¥ããã©ã€ããŒã掟çãå¿ èŠã«ãªããããããªããšããçè«ã¯ãå®çŸ©é¢æ°ã®å¯èŠæ§ã«åºã¥ããŠãã®åºå¥ãããããšæãã§ãããã ãããã«ãããããã¯æ§ãããªéžæã§ãã ãã®æ©èœãå®å®ãããŠããã®ã§ãããŒãžããåã«äººã ãèŠãããšãã§ããããã«ã1æ¥ã2æ¥ããªããããããšæããŸããã
ïŒ37480ã¯ã¯ããŒãºãããŠããããã§ãã¯ãªã¹ãã«åæ ãããŠããã¯ãã§ãã
ä¿®ç¹
@pnkfelixããªãã¯PTOã«åå ããŠããŠãå®å šã«åå ããŠãããšæãã®ã§ãç§ã¯ããªãã®ããã«ããªãã®ããã¯ã¹ããã§ãã¯ããèªç±ãåããŸããã ããã§ãªãå Žåã¯ãç¥ãããã ããã
å·®ãè¿«ã£ãå®å®åã¯ãäžéšã®ãã§ãã¯ãªã¹ãã«æ®ã£ãŠããæ¢ç¥ã®ãã°ãæåã«ä¿®æ£ãããããšãåæãšããŠããŸããïŒ ãããšããå®å®åã®ããã«ãããã¯ããŠããªãã®ã§ããïŒ
çŸåšã2ã€ãããŸãã
mod foo;
ã«æ¡åŒµããããšãã§ããŸããããïŒ ããã¯RFC1636ããã¥ã¡ã³ãç£æ»ã§ãã ããã¯ãRFC 1636ãåãå ¥ããããŠä»¥æ¥ãå®å®ããæåã®äž»èŠãªæ©èœã§ããããã®å Žåã¯ãããã«åŸãããã«ããŸãããå¿ èŠããããŸãã
RFCã¯æ¬¡ã®ããã«è¿°ã¹ãŠããŸãã
æ©èœãå®å®ãããåã«ãæ©èœã¯æ¬¡ã®ããã«ææžåãããŸãã
- èšèªæ©èœïŒ
- Rustãªãã¡ã¬ã³ã¹ã«ææžåããå¿ èŠããããŸãã
- Rustããã°ã©ãã³ã°èšèªã§ææžåããå¿ èŠããããŸãã
- Rust byExampleã«èšèŒãããŠããå ŽåããããŸãã
- èšèªæ©èœãšæšæºã©ã€ãã©ãªã®å€æŽã®äž¡æ¹ã«ä»¥äžãå«ããå¿ èŠããããŸãã
- å€æŽãã°ã®1è¡
- é·ã圢åŒã®ãªãªãŒã¹çºè¡šã®ããé·ãèŠçŽã
ãã®ããã®æ£ããããã»ã¹ã¯äœã§ããïŒ ãã®åé¡ã®ãããã³ã¡ã³ãã«ãã§ãã¯ãªã¹ãé ç®ãè¿œå ããå¿ èŠããããŸããããããšãããã¥ã¡ã³ãã远跡ããããã®æ°ããåé¡ãäœæããå¿ èŠããããŸããïŒ 1.15ãªãªãŒã¹ãŸã§ã«ããããã®èŠä»¶ãæºããããã¥ã¡ã³ããããªãŒã«å«ããå¿ èŠãããããã«æãããŸãã
cc @ rust-lang / docs
ããããšã@withoutboats ïŒ ãããããã¯æåã®äž»èŠãªãã®ã§ãã ç§ã¯ä»æèŠãããã«ãããç§ã®ãªã¹ãã«æã£ãŠããŸããããããŠèŠããããªãã¯ããã«ç§ãæã¡è² ãããŸããð
ããã«ã€ããŠã®ç§ã®æ³åã¯åžžã«ãå®å®åã®æ±ºå®ãšå®éã®å®å®åã¯å¥ã ã§ãããšããããšã§ããã ã€ãŸãã@ rust-lang / langã¯ããããå®å®ãããããšãã§ããŸãããšèšãããšãã§ããŸãããã²ãŒããåé€ããã³ãããã«ãããããã¥ã¡ã³ãã確å®ã«ååšããããã«ãªããŸãã äžå®å®ãªæ¬ãååšããäžçã§
ãªãªãŒã¹ããã£ãã°ãããªã®ã§ãç§ã®èšç»ã¯æ¬¡ã®ãããªããšãããããšã§ããã
ãããã2ã€ãš3ã€ãçµã¿åãããŸãã
/ cc @ rust-lang / coreãããã¯ããŒã éã®åé¡ã§ããããã
@steveklabnikã¯ç§ã«ã¯è¯ãããã§ããããã€ã§ãïŒFCPã®çµäºåã§ãïŒããã¥ã¡ã³ããäžéžãããŠã倧äžå€«ã§ãã ããã§ã®FCPã¯ã誀ã£ãŠå ¥åããã®ã«é·ãæéãããã£ãããããšã«ããç䌌çµäºã®ãããªãã®ã§ãã
ãŸãã1.15ããŒã¿ãã©ã³ããžã®å®å šãªããã¯ããŒãã確ä¿ã§ããããã«ããããããã°ããååŸããããšãã§ããŸãã
ç§ããããæåã«ãããããå Žåãããã¯ããã»ã©æªãããšã§ã¯ãããŸããããæ¢ç¥ã®ãã°ã®äžã«å«ããŸãããïŒã«ã¹ã¿ã 掟çã䜿çšããŠæ§é å ã§åãã¯ãã䜿çšãããšãICEhttps ïŒ//github.com/rust-lang/ãçºçã
https://github.com/rust-lang/rust/pull/38737ã¯ãã¿ã€ããã¯ãICEïŒ heartïŒãä¿®æ£ããŸã
proc_macro
ã¯ã¬ãŒãã®ããã¥ã¡ã³ãã«é¢ããïŒ38749ãäœæããŸããã
Macros 1.1ã1.15ã§å®å®ããããšãäœåºŠãèªã¿ãŸãããã1.15.0-beta.1ã¯2é±éåã«åºè·ãããå°ãªããšãextern crate proc_macro;
ã¯ãå€éã®4ecc85beb2016ãšåæ§ã«æ©èœã²ãŒããããŠããŸãã -12-28ã å®å®åã®å€æŽãããã¯ããŒãããèšç»ã¯ãããŸããïŒ
@SimonSapinã¯ããããã¯èšç»ã§ãããããããå®çŸããå¿ èŠããããŸãïŒ
ããã¯ãŸã èšç»ã§ãïŒp
ãŠãŒã¶ãŒã#[derive(Foo)] #[foo_def = "definition.json"] struct MyStruct;
æžã蟌ãã å Žåããã¯ããã³ãã©ãŒã¯ãçŸåšã®ãã£ã¬ã¯ããªããäœã§ããããç¥ãæ¹æ³ããªãããã definition.json
èŠã€ããããšãã§ããŸããã
ããã¯èšèšã«ãããã®ã§ãããããä¿®æ£ããã®ã¯ç°¡åã§ã¯ãããŸããããšã«ãããããä¿®æ£ããã«ã¯é ããããšæããŸãã
Span
-> FileMap
->ãã¡ã€ã«å->ãã£ã¬ã¯ããªã«ç§»åã§ããŸãã äžè¶³ããŠããã®ã¯ã proc_macro
ä»ããŠæ
å ±ã«ã¢ã¯ã»ã¹ããããšã ãã§ãã
ãŸãã definition.json
äŸåé¢ä¿ãè¿œå ããŠããã«ããå€æŽãããå Žåã«ããŒãã£ã«ãªãããã«ã³ã³ãã€ã©ãŒã«æ瀺ããå¿
èŠããããŸãã
procãã¯ãã¯ã env::var("CARGO_MANIFEST_DIR")
ã䜿çšããŠããã¯ãåŒã³åºããå«ãã¯ã¬ãŒãã®Cargo.tomlãå«ããã£ã¬ã¯ããªãååŸã§ããŸãã ããããfoo_def
ã¯ããã«é¢é£ããŠããŸãã https://github.com/dtolnay/syn/issues/70#issuecomment-268895281ãåç
§ããŠ
@tomakaã¯ã å€æŽããããšã§å®è¡ã§ããŸããããšãã°ãããã¯include_str!
ãã¯ããå®è¡ããæ¹æ³ã§ãã
ããããfoo_defã¯ããã«é¢é£ããŠããŸãã
Cargo.tomlãåºæºã«ããŠãã¹ãé 眮ããå¿ èŠãããã®ã¯ããŸãçŽæçã§ã¯ãªããšæããŸãã
ããã¯ãFileMapãå€æŽããããšã§å®è¡ã§ããŸããããšãã°ããããinclude_strã®æ¹æ³ã§ãã ãã¯ãã¯ãããè¡ããŸãã
ãããç§ã¯ãããã§ããããšãç¥ã£ãŠããŸããããã¯çŸåšã®æç¶ãåãã¯ãAPIã§ã¯ã§ããªãã ãã§ãã
ãã©ã¡ãŒã¿ã¯Item
ã§ãã ãã®ã¢ã€ãã ããã¹ãã³ãååŸããã¡ãœãããè¿œå ããããšã¯èš±å®¹ãããŸãããäŸåé¢ä¿ãè¿œå ããããã³ã³ãã€ã©ãŒã«èŠæ±ããã¡ãœãããItem
ã«è¿œå ãããšãããã¯IMOã«ãªããŸãã
Span-> FileMap-> filename-> directoryã«ç§»åã§ããŸãã
ãããã®APIïŒç¹ã«FileMap
ïŒã¯å®å®åããããã¹äžã«ãããŸããïŒ
ãããã¯ããã§ããå¿
èŠã¯ãããŸãããå®éãç§ã¯å
éšã®ã©ããå®å®ãããããããŸããã 代ããã«ã Span
ã«é¢ããæ
å ±ïŒè¡ãåããã¡ã€ã«åãªã©ïŒãæœåºããAPIãå®å®ãããããšãã§ããŸãã
ç§ã¯ã¡ããã©ç§ã®ç®±ã§ãã®ãšã©ãŒãåãåããŸããã ã©ãããã®ïŒ
``
error: Cannot use
ïŒïŒ[featureïŒproc_macroïŒ] and
ïŒïŒ[featureïŒcustom_attributeïŒ]åæã«
ãã
@alexreg #[derive]
ã䜿çšããŠããå ŽåãçŸåšã¯å®å®ããŠããŸãã #![feature(proc_macro)]
ã¯å¿
èŠãããŸããã
@alexreg
proc_macro_derive
ïŒãã¯ã1.1ïŒãå®å®ããŸããã #![feature(proc_macro)]
åé€ããã ãã§ãã
#[proc_macro_attribute]
ã¯æè¿ã #![feature(proc_macro)]
æ©èœã²ãŒãã®åŸãã«çéžããŸããã ãããã¯#![feature(custom_attribute)]
ãšäºææ§ããããŸããã #![feature(custom_attribute)]
ã¯ã亀æåãçéžãããšéæšå¥šã«ãªããŸãïŒhttps://github.com/rust-lang/rfcs/pull/1755ïŒã
@jseyfried proc_macro
ã®è¿œè·¡ã®åé¡ã¯ã¯ããŒãºãããŠãããé¢é£æ
å ±ãå«ãŸããŠããªããããå€æŽããå¿
èŠããããšæããŸãã
ã¿ããªããããšãã ããã¯çã«ããªã£ãŠããã
@abonanderããã #![feature(proc_macro)]
ã¯ééããªãïŒ38356ãæããŠããã¯ãã§ã-ïŒ38842ã確èªãããšãã«ç¢ºèªããå¿
èŠããããŸãã PRãæåºããŠããããŸããïŒ
æãåèã«ãªãã³ã¡ã³ã
ããããŸãããä»æ¥ã¯ããã調ã¹ãŠãã©ããŸã§å°éã§ãããã確èªããŸãã