2010/04/02

継続 continuation

お陰様で「継続」が少しずつわかってきました。

ごく簡単なコードについては
  • 継続が見えるようになってきた
  • CPS(継続渡しスタイル)に書き換えることができるようになってきた
  • call/ccによる脱出が書けるようになってきた
  • 継続呼び出しによる「脱出」が結果的にそう見えるだけで、厳密には「脱出」という表現は相応しくないのではないか、と思うようになった
  • call/ccが使われているコードに対する抵抗が減った
しかし
  • 少し複雑になるだけで継続なんてちっとも見えやしない
  • 厳密なCPSなんて全く書けやしない
  • call/ccが散在するコードを見ると目が回る
というような状態。抵抗が減っただけでも、大きな収穫だと思っています。理解の助けになるのは、やはり簡単な例で良いのでたくさん書いてみることだなーと、いまさら思いました。いや、そんなにたくさん書いていないので、もっとたくさん書かないといけないなーと思っているところでした。
;; list-product
;; (list-product '(1 2 3 4 5))
;; -> 120
(define (list-product l)
(let/cc skip
(fold (lambda (e acc)
(if (zero? e)
(skip 0)
#?=(* e acc)))
1 l)))
(list-product '(1 2 3 4 5))
;; #?="(stdin)":22:(* e acc)
;; #?- 1
;; #?="(stdin)":22:(* e acc)
;; #?- 2
;; #?="(stdin)":22:(* e acc)
;; #?- 6
;; #?="(stdin)":22:(* e acc)
;; #?- 24
;; #?="(stdin)":22:(* e acc)
;; #?- 120
;; 120
(list-product '(5 6 7 8 9 0 1 2 3 4 5))
;; #?="(stdin)":22:(* e acc)
;; #?- 5
;; #?="(stdin)":22:(* e acc)
;; #?- 30
;; #?="(stdin)":22:(* e acc)
;; #?- 210
;; #?="(stdin)":22:(* e acc)
;; #?- 1680
;; #?="(stdin)":22:(* e acc)
;; #?- 15120
;; 0

0 件のコメント:

コメントを投稿