Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Rust で遅延評価を 実装してみる
Search
Linda_pp
June 27, 2017
Technology
1.7k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rust で遅延評価を 実装してみる
RustのLT会! Rust入門者の集い #3
Linda_pp
June 27, 2017
More Decks by Linda_pp
See All by Linda_pp
actionlint の Linter 設計
rhysd
7
6.7k
ripgrep をライブラリとして使う
rhysd
0
790
port-monolith-to-wasm-for-chrome-extension
rhysd
0
580
Fuzzing Rust Text Editor
rhysd
1
3.1k
Vim compiled to WebAssembly
rhysd
5
2.4k
about-neovim-0.4.0-floating-window
rhysd
3
2.4k
reply.vim
rhysd
0
1.4k
Vim ported to WebAssembly (VimConf 2018)
rhysd
4
3.6k
go-selfupdate-github で ツールを自己アップデートする
rhysd
5
4.7k
Other Decks in Technology
See All in Technology
カンファレンスに参加した後の浮遊感とセルフケア
pauli
0
300
1万名の社員が使う認証基盤で どう信頼性を担保するか?
kairim0
0
170
SQL Server 2025 最適化されたロック
odashinsuke
0
120
オブザーバビリティを高める AI エージェント体験を考える / Designing AI Agent Experiences That Enhance Observability
aoto
PRO
1
180
React Nativeでの OTA Updateって、 どう説明する?
ichiki1023
0
130
ログラスのマルチプロダクトを 支える認証基盤 〜テナントごとに異なる統制とどう向き合うか〜
dada4386
3
320
AI Made Us Faster at Solving the Wrong Problems
marceloancelmo
0
140
検証フェーズはAIの回答を判断するための学習機会
toru_kubota
2
290
私の推しは「聞いてから進む」AIです -AI-DLCに一人でアプリを作らせた話
yama3133
1
160
Lambda MicroVMsは常駐サーバーの代わりに なるか? Kiro Crew を動かして検証してみた / Kiro Crew on Lambda MicroVMs
k_adachi_01
2
350
AI駆動開発、viviONの1年 ── うまくいったこと・いかなかったこと
vivion
0
140
『GOエコノミー 』(相乗りサービス) におけるスペック駆動開発
mot_techtalk
1
200
Featured
See All Featured
The untapped power of vector embeddings
frankvandijk
2
1.9k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
We Have a Design System, Now What?
morganepeng
55
8.3k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
WENDY [Excerpt]
tessaabrams
14
40k
Statistics for Hackers
jakevdp
799
230k
Automating Front-end Workflow
addyosmani
1369
210k
Building AI with AI
inesmontani
PRO
1
1.3k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
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