SlideShare a Scribd company logo
( c a l l / c c ( l a m b d a ( c o n t )
( c o n t 知 見 ) ) )
2 0 1 5 年 1 0 月 1 8 日 第 2 回 O U C C LT 会
お ま え か
• すしす
• アレ系
• ヒwiヒヒer: @susisu2413
• GitHub: susisu
• Scheme 素人です
継 続
• "継続(けいぞく、continuation)とは、プログラムの
実行においてある時点において評価されていない残り
のプログラム(the rest of the program)を意味するも
のであり、手続き(procedure)として表現されるも
のである。"
継続 - Wikipedia https://ja.wikipedia.org/wiki/
%E7%B6%99%E7%B6%9A
殺 伐 と し た スラ イ ド に S 式 が
(+ 1 2)
2 か ら 見 た 継 続
(+ 1 (...))
ラム ダ 式 で は
(lambda (x) (NEXT
(+ 1 x)
))
NEXT はそこで評価を終了する仮想の処理
c a l l / c c
• 略さずに言うと call-with-
current-continuation
• 現在の継続を引数として,
与えられた関数を呼び出す
• 継続はただの関数なので,
保存しておいて, 別の場所
から呼び出すことも可能
(+ 1 2)
2 を c a l l / c c の 式 で 置 き 換 えて み る
(+ 1 (call/cc
(lambda (cont) (cont 2))
))
c a l l / c c の 引 数 ( 関 数 ) に 渡 さ れ る 継 続
(+ 1 (...))
ラム ダ 式 で は
(lambda (x) (NEXT
(+ 1 x)
))
つ ま り こう い う こ と
(+ 1 (
(lambda (cont) (cont 2))
(lambda (x) (NEXT (
(+ 1 x)
)))
))
評 価 を 進 め る
(+ 1 (NEXT
(+ 1 2)
))
3
何 に 使 える の か
• ループ脱出 (break)
• 例外処理 (throw)
• コルーチン (yield)
• return, goto, etc.
• 要は突入と脱出
つよ い
実 装 し た
ど う い う 実 装
• https://github.com/susisu/js-sandbox/blob/master/
continuation/src/v2.js
• AST インタプリタ in JavaScript
• 基礎は前回の LT で発表したものの流用
http://susisu.hatenablog.com/entry/2015/07/12/142250
• Scheme の例をいくつか試したところ期待通りに動作した
ので、たぶん上手くいっている
継 続 の 生 成 ( 単 純 化 し た も の )
• 式 Expr
• 式の評価 eval : Expr → Res ― 厳密には環境も必要
• 評価結果 Res = Ok Val ― 成功
| Cont Val (Res → Res) ― 継続
| Next Val ― 評価終了
継 続 の 生 成
• 例えば、複数の式を順番に評価するような式
e = (e1 : Expr, e2 : Expr, ..., eN : Expr) : Expr
r = eval e, ri = eval ei ― 評価結果
• ri = Ok v ei+1 以降の評価を続ける, i = N ならば r = Ok v
• Cont f c r = Cont f ((λx → eval ([r1, ..., ri-1,] x, ei+1, ..., eN)) ○ c)
• Next v r = Next v
継 続 の 生 成
• トップレベルには中身の式の評価結果が Ok v ならば
Next v となる式を置いておく
• eval “(call/cc f)” = Cont f (λx → x)
• (call/cc f) を含む式を評価すると Cont f c が得られる
• 最後に c (f c) を計算すれば (そのうち) 値が出てくる
?
D E M O
継 続 は 力

More Related Content

PDF
Of tutorials v2.3.1 (1)
PPTX
CSPによる並行システムの検証(2)
PPTX
Coqでsprintf
PPTX
CSPによるコンカレントシステムの検証(1)
PPTX
Coqでsprintf
PPT
Javascriptで無限ループを実現する5つの方法
PDF
カジュアルにセキュリティテストはじめよう
PPTX
カジュアルに セキュリティテスト はじめよう #qpstudy
Of tutorials v2.3.1 (1)
CSPによる並行システムの検証(2)
Coqでsprintf
CSPによるコンカレントシステムの検証(1)
Coqでsprintf
Javascriptで無限ループを実現する5つの方法
カジュアルにセキュリティテストはじめよう
カジュアルに セキュリティテスト はじめよう #qpstudy

Similar to (call/cc (lambda (cont) (cont 知見))) (20)

PDF
JavaScript 講習会 #1
PDF
Rubyの御先祖CLUのお話(原本)
PPT
CPANの依存モジュールをもう少し正しく検出したい
PDF
エンジニア目線で見る TLA+ と PlusCal - TAKAMI Torao
PDF
SystemC Tutorial
KEY
Objc lambda
PDF
10のJava9で変わるJava8の嫌なとこ!
PDF
Serializabilityとは何か
PDF
Lisperはじめました
PDF
Why Reactive Matters #ScalaMatsuri
PDF
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
PPTX
Ll tiger clojure
PDF
scala-kaigi1-sbt
KEY
EC-CUBE + PHPUnit で 実践テスト駆動開発
PDF
jenkinsで遊ぶ
PDF
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
PDF
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
PDF
Spock's world
PPTX
20130228 Goノススメ(BPStudy #66)
PDF
Groovy Shell Scripting 2015
JavaScript 講習会 #1
Rubyの御先祖CLUのお話(原本)
CPANの依存モジュールをもう少し正しく検出したい
エンジニア目線で見る TLA+ と PlusCal - TAKAMI Torao
SystemC Tutorial
Objc lambda
10のJava9で変わるJava8の嫌なとこ!
Serializabilityとは何か
Lisperはじめました
Why Reactive Matters #ScalaMatsuri
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
Ll tiger clojure
scala-kaigi1-sbt
EC-CUBE + PHPUnit で 実践テスト駆動開発
jenkinsで遊ぶ
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
Spock's world
20130228 Goノススメ(BPStudy #66)
Groovy Shell Scripting 2015
Ad

(call/cc (lambda (cont) (cont 知見)))

  • 1. ( c a l l / c c ( l a m b d a ( c o n t ) ( c o n t 知 見 ) ) ) 2 0 1 5 年 1 0 月 1 8 日 第 2 回 O U C C LT 会
  • 2. お ま え か • すしす • アレ系 • ヒwiヒヒer: @susisu2413 • GitHub: susisu • Scheme 素人です
  • 3. 継 続 • "継続(けいぞく、continuation)とは、プログラムの 実行においてある時点において評価されていない残り のプログラム(the rest of the program)を意味するも のであり、手続き(procedure)として表現されるも のである。" 継続 - Wikipedia https://ja.wikipedia.org/wiki/ %E7%B6%99%E7%B6%9A
  • 4. 殺 伐 と し た スラ イ ド に S 式 が (+ 1 2)
  • 5. 2 か ら 見 た 継 続 (+ 1 (...))
  • 6. ラム ダ 式 で は (lambda (x) (NEXT (+ 1 x) )) NEXT はそこで評価を終了する仮想の処理
  • 7. c a l l / c c • 略さずに言うと call-with- current-continuation • 現在の継続を引数として, 与えられた関数を呼び出す • 継続はただの関数なので, 保存しておいて, 別の場所 から呼び出すことも可能
  • 9. 2 を c a l l / c c の 式 で 置 き 換 えて み る (+ 1 (call/cc (lambda (cont) (cont 2)) ))
  • 10. c a l l / c c の 引 数 ( 関 数 ) に 渡 さ れ る 継 続 (+ 1 (...))
  • 11. ラム ダ 式 で は (lambda (x) (NEXT (+ 1 x) ))
  • 12. つ ま り こう い う こ と (+ 1 ( (lambda (cont) (cont 2)) (lambda (x) (NEXT ( (+ 1 x) ))) ))
  • 13. 評 価 を 進 め る (+ 1 (NEXT (+ 1 2) ))
  • 14. 3
  • 15. 何 に 使 える の か • ループ脱出 (break) • 例外処理 (throw) • コルーチン (yield) • return, goto, etc. • 要は突入と脱出
  • 17. 実 装 し
  • 18. ど う い う 実 装 • https://github.com/susisu/js-sandbox/blob/master/ continuation/src/v2.js • AST インタプリタ in JavaScript • 基礎は前回の LT で発表したものの流用 http://susisu.hatenablog.com/entry/2015/07/12/142250 • Scheme の例をいくつか試したところ期待通りに動作した ので、たぶん上手くいっている
  • 19. 継 続 の 生 成 ( 単 純 化 し た も の ) • 式 Expr • 式の評価 eval : Expr → Res ― 厳密には環境も必要 • 評価結果 Res = Ok Val ― 成功 | Cont Val (Res → Res) ― 継続 | Next Val ― 評価終了
  • 20. 継 続 の 生 成 • 例えば、複数の式を順番に評価するような式 e = (e1 : Expr, e2 : Expr, ..., eN : Expr) : Expr r = eval e, ri = eval ei ― 評価結果 • ri = Ok v ei+1 以降の評価を続ける, i = N ならば r = Ok v • Cont f c r = Cont f ((λx → eval ([r1, ..., ri-1,] x, ei+1, ..., eN)) ○ c) • Next v r = Next v
  • 21. 継 続 の 生 成 • トップレベルには中身の式の評価結果が Ok v ならば Next v となる式を置いておく • eval “(call/cc f)” = Cont f (λx → x) • (call/cc f) を含む式を評価すると Cont f c が得られる • 最後に c (f c) を計算すれば (そのうち) 値が出てくる
  • 22. ?
  • 23. D E M O
  • 24. 継 続 は