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
ジェネレータを有効活用し隊 / Kyoto.js 11 LT
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Susisu
October 22, 2016
Programming
2.4k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ジェネレータを有効活用し隊 / Kyoto.js 11 LT
Kyoto.js 11
http://kyotojs.connpass.com/event/39462/
Susisu
October 22, 2016
More Decks by Susisu
See All by Susisu
tsc.rip を支える技術 / Kyoto.なんか #8
susisu
0
4.8k
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
320
Stage 3 Decorators でできること / できないこと / TSKaigi 2026
susisu
1
2.5k
Go で言うところのアレは TypeScript で言うとコレ / Kyoto.なんか #7
susisu
7
2.9k
君だけのオリジナル async / await を作ろう / TSKaigi 2025
susisu
20
16k
null or undefined
susisu
25
8k
Mackerel のフロントエンドフレームワーク移行 序章 / Hatena Engineer Seminar #13
susisu
0
2.3k
スクリーンショット撮影のために Puppeteer を操る / Kyoto.js 16
susisu
0
1k
BuckleScript 使ってみた
susisu
0
440
Other Decks in Programming
See All in Programming
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
840
Workers Cache を知る
syumai
0
320
JRuby: Past, Present, and Future
headius
0
220
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
9
5.3k
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
6k
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
270
Java 27新機能 / Java 27 new features
kishida
2
190
すこし踏み込む CancellationToken
htkym
2
1.6k
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
330
速習iPhone Duo対応
yuukiw00w
2
930
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
390
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
300
Featured
See All Featured
Crafting Experiences
bethany
1
370
Thoughts on Productivity
jonyablonski
76
5.4k
Documentation Writing (for coders)
carmenintech
77
5.6k
Technical Leadership for Architectural Decision Making
baasie
3
590
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
Google's AI Overviews - The New Search
badams
0
1.6k
Color Theory Basics | Prateek | Gurzu
gurzu
1
480
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
590
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
730
brightonSEO & MeasureFest 2025 - Winning Strategies for Black Friday CRO & PPC - Christian Goodrich
cargoodrich
3
860
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Transcript
δΣω Ϩ ʔ λ Λ ༗ ޮ ׆ ༻ ͠
ୂ 2 0 1 6 - 1 0 - 2 2 K y o t o . j s 1 1 Twitter @susisu2413 / GitHub @susisu
Q . δΣω Ϩ ʔ λ Կ ʹ
͑Δʁ
1 . ί ϧ ʔ νϯ
app.use(function* (next) { const start = new Date(); // (1)
yield next; const end = new Date(); // (3) // log (4) }); ! app.use(function* (next) { yield next; // respond (2) }); ྫ: Koa
2 . Ԇ Ϧε τ
function range(a, b, s = 1) { const arr =
[]; for (let n = a; n < b; n += s) { arr.push(n); } return arr; } ! for (const n of range(1, 10)) { doSomething(n); // from 1 to 9 }
function* xrange(a, b, s = 1) { for (let n
= a; n < b; n += s) { yield n; } } ! for (const n of xrange(1, 10)) { doSomething(n); // from 1 to 9 }
function* fibonacci() { let [a, b] = [1, 1]; while
(true) { yield a; [a, b] = [b, a + b]; } } ! for (const n of fibonacci()) { doSomething(n); // 1, 1, 2, 3, 5, ... }
3 . Π ς Ϩ ʔ λ ͷ Ճ
function* concat(iter1, iter2) { yield* iter1; yield* iter2; } !
for (const x of concat(arr1, arr2)) { doSomething(x); }
function* map(func, iter) { for (const x of iter) {
yield func(x); } } ! for (const n of map(n => n ** 2, arr)) { doSomething(n); }
4 . ඇ ಉ ظ ॲ ཧ
fetch().then(x => fetch().then(y => fetch().then(z => doSomething(x, y, z) )
) ); before (Promise)
co(function* () { const x = yield fetch(); const y
= yield fetch(); const z = yield fetch(); return doSomething(x, y, z); }); after (Promise + Generator + co)
Q . ଞ ʹ δΣω Ϩ ʔ λ ͕
͑Δ ໘ ͋ Δʁ
ͦ ͦ δΣω Ϩ ʔ λ ͱ
g e n . n e x t ( )
{ d o n e : f a l s
e , v a l u e : * } g e n . n e x t ( )
{ d o n e : f a l s
e , v a l u e : * } g e n . n e x t ( ) g e n . n e x t ( ) gen.next ͷதมΘ͍ͬͯΔ
{ d o n e : f a l s
e , v a l u e : * } { d o n e : f a l s e , v a l u e : * } g e n . n e x t ( ) g e n . n e x t ( ) g e n . n e x t ( )
{ d o n e : f a l s
e , v a l u e : * } { d o n e : f a l s e , v a l u e : * } { d o n e : t r u e , v a l u e : * } g e n . n e x t ( ) g e n . n e x t ( ) g e n . n e x t ( )
ݟํΛม͑Δͱ͍͔ʹԆϦετ d o n e : f a l s
e v a l u e ( ) = > d o n e : f a l s e v a l u e ( ) = > d o n e : t r u e v a l u e
d o n e : f a l s e
v a l u e x = > d o n e : f a l s e v a l u e y = > d o n e : t r u e v a l u e .next() ҾΛͱΕΔ
fetch().then(x => fetch().then(y => fetch().then(z => doSomething(x, y, z) )
) ); PromiseΛͬͨඇಉظॲཧ
None
d o n e : f a l s e
v a l u e x = > d o n e : f a l s e v a l u e y = > d o n e : t r u e v a l u e
t h e n v a l u e x
= > t h e n v a l u e y = > re s o l v e v a l u e .then() Ͱͭͳ͗߹ΘͤΔ
co(function* () { const x = yield fetch(); const y
= yield fetch(); const z = yield fetch(); return doSomething(x, y, z); }); Promise + Generator + co
Q . ଞ ʹ δΣω Ϩ ʔ λ ͕
͑Δ ໘ ͋ Δʁ
A . ͋ Γ · ͢
5 . ύ ʔ α ί ϯ Ϗω ʔ λ
symbol("(").bind(_ => expr.bind(x => symbol(")").bind(_ => pure(x) ) ) );
ׅހ (ʙ) ʹೖͬͨࣜͷύʔα
qo(function* () { yield symbol("("); const x = yield expr;
yield symbol(")"); return x; }); దͳؔΛ͑……
6 . * ద ͳ Ϟ φ υ ※
Ͳ ΕͰ ྑ ͍ ͱ ͍ ͏ Θ ͚ Ͱ ͳ ͍
δΣω Ϩ ʔ λ Λ ༗ ޮ ׆ ༻ ͠
ୂ ׆ ಈ ใ ࠂ
δΣω Ϩ ʔ λ Ԇ Ϧε τ Λ
Ұ ൠ Խ ͠ ͨ Α ͏ ͳ ͷ
· ͩ · ͩ ͑Δ ໘ ͕ ͋
Γ ͦ ͏ ྫ : ύ ʔ α ί ϯ Ϗω ʔ λ
ଞ ʹ ׆ ༻ ࣄ ྫ ͕ ͋ Ε
͓ ڭ ͑͘ ͩ ͞ ͍
{ d o n e : t r u e
, v a l u e : " T h a n k s " }