Scalaの限定継続の応用と基本
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Scalaの限定継続の応用と基本

  • 3,404 views
Uploaded on

Scalaの限定継続の応用と基本を高橋メソッド風味で説明したプレゼンです。

Scalaの限定継続の応用と基本を高橋メソッド風味で説明したプレゼンです。

More in: Technology , Business
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
3,404
On Slideshare
3,382
From Embeds
22
Number of Embeds
6

Actions

Shares
Downloads
18
Comments
0
Likes
5

Embeds 22

https://twimg0-a.akamaihd.net 8
https://si0.twimg.com 6
http://paper.li 4
http://twitter.com 2
https://twitter.com 1
http://marketcult.com 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Scalaの限定継続の応用と基本 in 高橋メソッド 水島 宏太 (@kmizu)
  • 2. 限定継続について話します
  • 3. その前に
  • 4. 継続って何?
  • 5. 「これから行われる残りの計算 をパッケージ化したもの」
  • 6. 抽象的
  • 7. わからない
  • 8. 必要なのは具体例
  • 9. call/cc
  • 10. 説明しづらい
  • 11. 「ファーストクラスreturn」
  • 12. void foo() { Continuation<Void> c =`return`; bar(c); println("foo end");}void bar(Continuation<Void> c) { for(int i = 0; i <= 10; i ++ ) { if(i >= 5) { println("break!"); c.invoke(null); } }}foo() "break!"
  • 13. "foo end"はどこにいった?
  • 14. void foo() { Continuation<Void> c =`return`; bar(c); println("foo end");}void bar(Continuation<Void> c) { for(int i = 0; i <= 10; i ++ ) { if(i >= 5) { println("break!"); c.invoke(null); } }}foo() "break!"
  • 15. foo()の呼び出し元まで吹っ飛ぶ
  • 16. 例外みたい?
  • 17. だいぶ違う
  • 18. static Continuation<Integer> continuation;void main(String[] args) { Integer result = hoge(); println("result = " + result); continuation.invoke(200);}Integer hoge() { println("hoge started"); foo(`return`); println("hoge finished");}Integer foo(Continuation<Integer> escape) { continuation = escape; continuation.invoke(300);return -1;}
  • 19. どうなる?
  • 20. 300200200200200200200200200...
  • 21. 無限ループ
  • 22. なぜ?
  • 23. static Continuation<Integer> continuation;void main(String[] args) { Integer result = hoge(); println("result = " + result); continuation.invoke(200);}Integer hoge() { println("hoge started"); foo(`return`); println("hoge finished");}Integer foo(Continuation<Integer> escape) { continuation = escape; continuation.invoke(300); return -1;}
  • 24. 一度抜けたメソッドに戻れる
  • 25. タイムマシーンみたいな
  • 26. 一度呼び出したら返ってこない
  • 27. これが普通の継続
  • 28. 限定継続
  • 29. の前に応用例
  • 30. の前に応用例
  • 31. 何の役に立つ?
  • 32. がわからないとやる気がでない
  • 33. というわけで応用例
  • 34. ふつうの継続と同じ分野
  • 35. 利用側のコードだけ説明
  • 36. 実装の説明は難しい
  • 37. Generator
  • 38. C#のyieldとか
  • 39. Pythonのジェネレータ
  • 40. val x1: Iterator[Int] = make[Int]{yields => yields(1) println("X") yields(2) println("Y") yields(3)}while(x1.hasNext) { println("----") println(x1.next)}
  • 41. ----1X----2Y----3
  • 42. yieldでStop the world
  • 43. nextで再開
  • 44. 使う方は難しくない
  • 45. Amb
  • 46. 非決定計算
  • 47. 実際にはただの総当り
  • 48. block { val x = amb(1, 2, 3) val y = amb(4, 5) printf("(%d, %d)%n", x, y)}
  • 49. (1, 4)(1, 5)(2, 4)(2, 5)(3, 4)(3, 5)
  • 50. Goto
  • 51. 継続は元々はgotoの形式化
  • 52. reset { var sum = 0; var i = 0 val LOOP = label // gotoのためのラベルを作成 sum += i i += 1 if(i <= 100) goto(LOOP) // gotoでジャンプ println("1から100までの合計値:" + sum)}
  • 53. 他にも色々
  • 54. 話を戻して限定継続
  • 55. 色々方式がある
  • 56. shift/reset
  • 57. control/prompt
  • 58. Scalaはshift/resetを採用
  • 59. 普通の継続との違いは?
  • 60. 戻れる範囲を制限
  • 61. 呼び出したら「返って来る」
  • 62. これだけだとよくわからない
  • 63. コード例
  • 64. val answer = reset { val x = shift { k: (Int => Int) => println("A") println("k(10) = " + k(10)) println("B") 8 } println("x = " + x);x * 2}println("answer = " + answer)
  • 65. Ax = 10k(10) = 20Banswer = 8
  • 66. 何故こうなる?
  • 67. resetは継続の範囲を制限
  • 68. shiftは少しめんどう
  • 69. val x = shift { k: (Int => Int) => println("A") println("k(10) = " + k(10)) println("B") 8 }
  • 70. kが継続
  • 71. 型はInt => Int
  • 72. Intを渡すとIntが「返って来る」
  • 73. println("A")println("k(10) = " + k(10))println("B")8が評価される
  • 74. その後が問題
  • 75. shiftの呼び出し元に「返らない」
  • 76. resetの呼び出し元に「返る」
  • 77. ここがわかりにくい点
  • 78. ところで
  • 79. println("k(10) = " + k(10))
  • 80. k(10)で何が起こってる?
  • 81. shiftの呼び出し元に「返る」
  • 82. println("x = " + x)x*2
  • 83. resetを抜けるまでが評価される
  • 84. 最後にkの呼び出し元に「返る」
  • 85. kの呼び出しの続きが評価される
  • 86. 何度でもkを呼び出せる
  • 87. 非常にややこしい
  • 88. 普通の人にshift/resetは…
  • 89. 中の人が知っていればいい話
  • 90. でも面白い
  • 91. 宣伝
  • 92. 『オープンソース徹底活用Scala実践プログラミング』 秀和システム
  • 93. 共著で書きました
  • 94. 限定継続の話もあります
  • 95. わかりにくければdisってください
  • 96. 質問タイム?