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
7
6k
ripgrep をライブラリとして使う
rhysd
0
560
port-monolith-to-wasm-for-chrome-extension
rhysd
0
500
Fuzzing Rust Text Editor
rhysd
1
3k
Vim compiled to WebAssembly
rhysd
5
2.3k
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
Modern_Data_Stack最新動向クイズ_買収_AI_激動の2025年_.pdf
sagara
0
200
Pure Goで体験するWasmの未来
askua
1
180
OpenAI gpt-oss ファインチューニング入門
kmotohas
2
960
20250929_QaaS_vol20
mura_shin
0
110
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
9k
Green Tea Garbage Collector の今
zchee
PRO
2
390
AIAgentの限界を超え、 現場を動かすWorkflowAgentの設計と実践
miyatakoji
0
130
[2025-09-30] Databricks Genie を利用した分析基盤とデータモデリングの IVRy の現在地
wxyzzz
0
470
実装で解き明かす並行処理の歴史
zozotech
PRO
1
320
KAGのLT会 #8 - 東京リージョンでGAしたAmazon Q in QuickSightを使って、報告用の資料を作ってみた
0air
0
200
Shirankedo NOCで見えてきたeduroam/OpenRoaming運用ノウハウと課題 - BAKUCHIKU BANBAN #2
marokiki
0
140
BirdCLEF+2025 Noir 5位解法紹介
myso
0
190
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
75
5k
Done Done
chrislema
185
16k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
140
34k
Producing Creativity
orderedlist
PRO
347
40k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.4k
Automating Front-end Workflow
addyosmani
1371
200k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4k
Six Lessons from altMBA
skipperchong
28
4k
Code Review Best Practice
trishagee
72
19k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Into the Great Unknown - MozCon
thekraken
40
2.1k
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