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
ジェネレータを有効活用し隊 / Kyoto.js 11 LT
Search
Susisu
October 22, 2016
Programming
2
2.2k
ジェネレータを有効活用し隊 / Kyoto.js 11 LT
Kyoto.js 11
http://kyotojs.connpass.com/event/39462/
Susisu
October 22, 2016
Tweet
Share
More Decks by Susisu
See All by Susisu
Go で言うところのアレは TypeScript で言うとコレ / Kyoto.なんか #7
susisu
7
2.5k
君だけのオリジナル async / await を作ろう / TSKaigi 2025
susisu
19
15k
null or undefined
susisu
25
7.7k
Mackerel のフロントエンドフレームワーク移行 序章 / Hatena Engineer Seminar #13
susisu
0
2.2k
スクリーンショット撮影のために Puppeteer を操る / Kyoto.js 16
susisu
0
910
BuckleScript 使ってみた
susisu
0
360
Atom パッケージ開発のすゝめ
susisu
1
2.2k
5分でわかる Curry–Howard 同型対応
susisu
0
1.1k
遅延評価と健康
susisu
0
630
Other Decks in Programming
See All in Programming
Dive into Triton Internals
appleparan
0
490
Register is more than clipboard
satorunooshie
1
470
AI POSにおけるLLM Observability基盤の導入 ― サイバーエージェントDXインターン成果報告
hekuchan
0
550
問題の見方を変える「システム思考」超入門
panda_program
0
200
DartASTとその活用
sotaatos
2
130
2025 컴포즈 마법사
jisungbin
0
120
JJUG CCC 2025 Fall: Virtual Thread Deep Dive
ternbusty
3
410
「10分以内に機能を消せる状態」 の実現のためにやっていること
togishima
1
300
Building AI with AI
inesmontani
PRO
0
180
Web エンジニアが JavaScript で AI Agent を作る / JSConf JP 2025 sponsor session
izumin5210
4
1.6k
高単価案件で働くための心構え
nullnull
0
130
『実践MLOps』から学ぶ DevOps for ML
nsakki55
2
390
Featured
See All Featured
A designer walks into a library…
pauljervisheath
210
24k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
359
30k
Code Reviewing Like a Champion
maltzj
527
40k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
33
1.8k
KATA
mclloyd
PRO
32
15k
Rebuilding a faster, lazier Slack
samanthasiow
84
9.3k
Mobile First: as difficult as doing things right
swwweet
225
10k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
36
6.1k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.8k
Practical Orchestrator
shlominoach
190
11k
Site-Speed That Sticks
csswizardry
13
960
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 " }