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.3k
ジェネレータを有効活用し隊 / 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.6k
君だけのオリジナル async / await を作ろう / TSKaigi 2025
susisu
19
15k
null or undefined
susisu
25
7.8k
Mackerel のフロントエンドフレームワーク移行 序章 / Hatena Engineer Seminar #13
susisu
0
2.2k
スクリーンショット撮影のために Puppeteer を操る / Kyoto.js 16
susisu
0
950
BuckleScript 使ってみた
susisu
0
380
Atom パッケージ開発のすゝめ
susisu
1
2.3k
5分でわかる Curry–Howard 同型対応
susisu
0
1.1k
遅延評価と健康
susisu
0
650
Other Decks in Programming
See All in Programming
HTTPプロトコル正しく理解していますか? 〜かわいい猫と共に学ぼう。ฅ^•ω•^ฅ ニャ〜
hekuchan
2
670
AI Agent の開発と運用を支える Durable Execution #AgentsInProd
izumin5210
7
2.2k
例外処理とどう使い分ける?Result型を使ったエラー設計 #burikaigi
kajitack
16
5.9k
Vibe Coding - AI 驅動的軟體開發
mickyp100
0
160
Vibe codingでおすすめの言語と開発手法
uyuki234
0
210
CSC307 Lecture 04
javiergs
PRO
0
650
AgentCoreとHuman in the Loop
har1101
5
210
高速開発のためのコード整理術
sutetotanuki
1
370
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
940
CSC307 Lecture 07
javiergs
PRO
0
530
コマンドとリード間の連携に対する脅威分析フレームワーク
pandayumi
1
440
AI Agent Tool のためのバックエンドアーキテクチャを考える #encraft
izumin5210
6
1.8k
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
Crafting Experiences
bethany
1
44
We Have a Design System, Now What?
morganepeng
54
8k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
1
290
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
The World Runs on Bad Software
bkeepers
PRO
72
12k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
Navigating Team Friction
lara
192
16k
Mobile First: as difficult as doing things right
swwweet
225
10k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
86
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
270
We Are The Robots
honzajavorek
0
150
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 " }