ごく簡単なコードについては
- 継続が見えるようになってきた
- CPS(継続渡しスタイル)に書き換えることができるようになってきた
- call/ccによる脱出が書けるようになってきた
- 継続呼び出しによる「脱出」が結果的にそう見えるだけで、厳密には「脱出」という表現は相応しくないのではないか、と思うようになった
- call/ccが使われているコードに対する抵抗が減った
しかし
- 少し複雑になるだけで継続なんてちっとも見えやしない
- 厳密なCPSなんて全く書けやしない
- call/ccが散在するコードを見ると目が回る
というような状態。抵抗が減っただけでも、大きな収穫だと思っています。理解の助けになるのは、やはり簡単な例で良いのでたくさん書いてみることだなーと、いまさら思いました。いや、そんなにたくさん書いていないので、もっとたくさん書かないといけないなーと思っているところでした。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; 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 件のコメント:
コメントを投稿