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.5k
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
4.2k
ripgrep をライブラリとして使う
rhysd
0
420
port-monolith-to-wasm-for-chrome-extension
rhysd
0
460
Fuzzing Rust Text Editor
rhysd
1
2.9k
Vim compiled to WebAssembly
rhysd
5
2.2k
about-neovim-0.4.0-floating-window
rhysd
3
2.2k
reply.vim
rhysd
0
1.2k
Vim ported to WebAssembly (VimConf 2018)
rhysd
4
3.3k
go-selfupdate-github で ツールを自己アップデートする
rhysd
5
4.3k
Other Decks in Technology
See All in Technology
テストを書かないためのテスト/ Tests for not writing tests
sinsoku
1
170
20250116_自部署内でAmazon Nova体験会をやってみた話
riz3f7
1
100
PaaSの歴史と、 アプリケーションプラットフォームのこれから
jacopen
7
1.5k
ABWGのRe:Cap!
hm5ug
1
120
技術に触れたり、顔を出そう
maruto
1
150
Amazon Q Developerで.NET Frameworkプロジェクトをモダナイズしてみた
kenichirokimura
1
200
comilioとCloudflare、そして未来へと向けて
oliver_diary
6
450
2024年活動報告会(人材育成推進WG・ビジネスサブWG) / 20250114-OIDF-J-EduWG-BizSWG
oidfj
0
230
今から、 今だからこそ始める Terraform で Azure 管理 / Managing Azure with Terraform: The Perfect Time to Start
nnstt1
0
240
FODにおけるホーム画面編成のレコメンド
watarukudo
PRO
2
280
2024AWSで個人的にアツかったアップデート
nagisa53
1
110
深層学習と3Dキャプチャ・3Dモデル生成(土木学会応用力学委員会 応用数理・AIセミナー)
pfn
PRO
0
460
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
67
4.5k
RailsConf 2023
tenderlove
29
970
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
127
18k
Docker and Python
trallard
43
3.2k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Product Roadmaps are Hard
iamctodd
PRO
50
11k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
365
25k
A designer walks into a library…
pauljervisheath
205
24k
Six Lessons from altMBA
skipperchong
27
3.6k
VelocityConf: Rendering Performance Case Studies
addyosmani
327
24k
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