Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rust で遅延評価を 実装してみる
Search
Linda_pp
June 27, 2017
Technology
3
1.6k
Rust で遅延評価を 実装してみる
RustのLT会! Rust入門者の集い #3
Linda_pp
June 27, 2017
Tweet
Share
More Decks by Linda_pp
See All by Linda_pp
actionlint の Linter 設計
rhysd
6
5.9k
ripgrep をライブラリとして使う
rhysd
0
490
port-monolith-to-wasm-for-chrome-extension
rhysd
0
490
Fuzzing Rust Text Editor
rhysd
1
3k
Vim compiled to WebAssembly
rhysd
5
2.2k
about-neovim-0.4.0-floating-window
rhysd
3
2.3k
reply.vim
rhysd
0
1.3k
Vim ported to WebAssembly (VimConf 2018)
rhysd
4
3.4k
go-selfupdate-github で ツールを自己アップデートする
rhysd
5
4.4k
Other Decks in Technology
See All in Technology
Snowflake Summit 2025全体振り返り / Snowflake Summit 2025 Overall Review
mtpooh
2
390
Windows 11 で AWS Documentation MCP Server 接続実践/practical-aws-documentation-mcp-server-connection-on-windows-11
emiki
0
960
AWS CDK 実践的アプローチ N選 / aws-cdk-practical-approaches
gotok365
6
740
M3 Expressiveの思想に迫る
chnotchy
0
100
Oracle Audit Vault and Database Firewall 20 概要
oracle4engineer
PRO
3
1.7k
Agentic Workflowという選択肢を考える
tkikuchi1002
1
500
MySQL5.6から8.4へ 戦いの記録
kyoshidaxx
1
200
AIの最新技術&テーマをつまんで紹介&フリートークするシリーズ #1 量子機械学習の入門
tkhresk
0
140
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
26k
HiMoR: Monocular Deformable Gaussian Reconstruction with Hierarchical Motion Representation
spatial_ai_network
0
100
25分で解説する「最小権限の原則」を実現するための AWS「ポリシー」大全 / 20250625-aws-summit-aws-policy
opelab
9
1.1k
フィンテック養成勉強会#54
finengine
0
180
Featured
See All Featured
How STYLIGHT went responsive
nonsquared
100
5.6k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
How GitHub (no longer) Works
holman
314
140k
Typedesign – Prime Four
hannesfritz
42
2.7k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.5k
Optimising Largest Contentful Paint
csswizardry
37
3.3k
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
Build The Right Thing And Hit Your Dates
maggiecrowley
36
2.8k
Writing Fast Ruby
sferik
628
61k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.8k
Become a Pro
speakerdeck
PRO
28
5.4k
Designing for Performance
lara
609
69k
Transcript
Rust ͰԆධՁΛ ࣮ͯ͠ΈΔ RustͷLTձʂ Rustೖऀͷू͍ #3 @Linda_pp @rhysd
͋Β͢͡ • ७ਮؔܕσʔλߏΛಡΈͳ͕ Β Rust Ͱ࣮͍ͯͨ͋͠Δɼ ԆධՁΛ͏σʔλߏ͕ग़ݱ • Rust ԆධՁ͡Όͳ͍…
• ࣮ͨ͠ https://goo.gl/qMGuZQ
ԆධՁͱ ࣜΛ͙͢ʹධՁͤͣɼඞཁʹͳͬͨ࣌ʹධ Ձ͢Δ
Ԇ͠ͳ͍ධՁ 1 // 1000ݸͷૉΛͭ͘ΔʢΊͬͪΌॏ͍ॲཧʣ 2 let n = primes1000(); 3
4 // ... 5 6 // 100൪දࣔ 7 println!("{}", vec[99]); 8 9 // 1000൪දࣔ 10 println!("{}", vec[999]); ιʔεɿ https://goo.gl/qMGuZQ
ԆධՁ 1 // lazily! Ͱғ·ΕͨࣜԆධՁ͞ΕΔ 2 // ͜ͷ࣌Ͱ vec ܭࢉ͞Ε͍ͯͳ͍
3 let vec = lazily!{ 4 prime1000th() 5 }; 6 7 // vec Λ༻͢ΔλΠϛϯάͰॳΊͯ vec ΛධՁ 8 println!("{}", vec[99]); 9 10 // ҰධՁͨ݁͠ՌΩϟογϡ͞Ε͍ͯ·Θ͞ΕΔ 11 println!("{}", vec[999]); ιʔεɿ https://goo.gl/qMGuZQ
σʔλͷ࣋ͪํ 1 // αϯΫɿܭࢉΛද͢σʔλߏ 2 enum Thunk<'a, T: 'a> {
3 // ·ͩܭࢉ͞Εͯͳ͍ঢ়ଶΛΫϩʔδϟͰ࣋ͭ 4 NotYet(Box<Fn() -> T + 'a>), 5 // ܭࢉࡁΈ 6 Memo(T), 7 } 8 9 // Ԇ͞ΕͨࣜΛද͢ߏମ Delayed 10 pub struct Delayed<'a, T: 'a> { 11 thunk: RefCell<Box<Thunk<'a, T>>> 12 } ιʔεɿ https://goo.gl/qMGuZQ
σʔλͷ࣋ͪํ 1 impl<'a, T: 'a> Delayed<'a, T> { 2 //
৽͍͠ԆධՁࣜΛੜ 3 // ΫϩʔδϟΛड͚औͬͯ RefCell ʹಥͬࠐΉ 4 pub fn new<F>(f: F) -> Self where F: Fn() -> T + 'a { 5 Delayed { thunk: RefCell::new( 6 Box::new( 7 NotYet(Box::new(f)) 8 ) 9 ) } 10 } 11 } 12 13 // ϚΫϩͰ move Ωϟϓνϟ͢ΔΫϩʔδϟʹల։͢Δ 14 // lazily!{42} -> Delayed::new(move || { 42 }) 15 #[macro_export] 16 macro_rules! lazily { 17 ($($b:tt)+) => { 18 self::Delayed::new(move || { $($b)+ }) 19 } 20 } ιʔεɿ https://goo.gl/qMGuZQ
force: Ԇ͞ΕͨࣜΛධՁ 1 impl<'a, T: 'a> Delayed<'a, T> { 2
pub fn force(&self) { 3 // ͜͜Ͱ mut ʹ͠ͳ͍ͱαϯΫ͕ߋ৽Ͱ͖ͳ͍ͷͰɼ 4 // RefCell ͰแΉ 5 let mut thunk = &mut *self.thunk.borrow_mut(); 6 let val = match **thunk { 7 // ະධՁͳΒอ͍࣋ͯͨ͠ΫϩʔδϟΛ࣮ߦ͠ɼ 8 // ܭࢉΛ࣮ߦ͢Δɽ 9 NotYet(ref invoke) => { 10 Box::new(Memo(invoke())) 11 }, 12 // ͢ͰʹܭࢉࡁΈͳΒԿ͠ͳ͍ 13 Memo(_) => return, 14 }; 15 // ܭࢉͨ͠Λ͓࣋ͬͯ͘ 16 *thunk = val; 17 } 18 } ιʔεɿ https://goo.gl/qMGuZQ
ԆධՁͷλΠϛϯά Rc<T> ͕͍ͬͯΔΑ͏ʹɼDerefτϨΠτ Λͬͯɼϝιουݺͼग़͠ͷλΠϛϯάͰ ࣗಈͰத͕ධՁ͞ΕΔΑ͏ʹ͢Δ 1 let s = lazily!("foo".to_string())
2 3 // s ͕ࣗಈͰධՁ͞ΕΔ 4 s.as_str(); 5 6 // * ԋࢉࢠͰ໌ࣔతʹධՁͰ͖Δ 7 *s; ιʔεɿ https://goo.gl/qMGuZQ
Deref Ͱࢀর࣌ʹࣗಈධՁ 1 impl<'a, T: 'a> Deref for Delayed<'a, T>
{ 2 // T ͕ධՁ݁Ռͷͷܕ 3 type Target = T; 4 fn deref(&self) -> &T { 5 self.force(); 6 // RefCell ͷதΛҰ࣌తʹऔΓग़͢ 7 let thunk = unsafe { 8 self.thunk.as_ptr().as_ref().unwrap() 9 }; 10 match **thunk { 11 // αϯΫͷதͷࢀরΛฦ͢ 12 Memo(ref v) => v, 13 _ => unreachable!(), 14 } 15 } 16 } ιʔεɿ https://goo.gl/qMGuZQ
ͭͬͨ͘ԆධՁͰԆϦετ Λͭͬͨ͘ײ • ΄΅ॻ੶ͷઆ໌௨Γʹίʔυ͕ॻ͚ͯྑ͍ײ͡ • Deref ༧֎ͷλΠϛϯάͰܭࢉ͕࣮ߦ͞Εͯ͠· ͏͜ͱ͕͋ͬͨɽ • Clone
Λ࣮͢ΔͨΊʹ݁ہ Box Λ Rc ʹ͢Δඞཁ͕ ͋ͬͨ • ϜʔϒΩϟϓνϟͰण໋͕བྷΉͷͰɼlazily! Ͱੜ͠ ͨͷѻ͍͕Ϝζ͍ ιʔεɿ https://goo.gl/qMGuZQ