CPS変換ってことでもないこと
継続が昔からよくわからんので丁寧に読んでいる感じ.
http://www.shido.info/lisp/scheme_cc.html
この辺とかも見てる.
CPS 変換してみたり,クロージャの連鎖という表現,末尾再帰とリンクするような.
もにゃっとしてる.
#!/usr/bin/env gosh (define reciprocals (lambda (ls) (call/cc (lambda (k) (map (lambda (x) (display x) (if (= x 0) (k "zero found") (/ 1 x))) ls))))) (reciprocals '(1 2 3)) ; => (1 1/2 1/3) (reciprocals '(1 2 3 0 4 5 6)) ; => "zero found" (define reciprocals2 (lambda (ls) ;; (define map1 ;; (lambda (p ls k) ;; (let ((break k)) ;; (let f ((ls ls) (k k)) ;; (if (null? ls) ;; (k '()) ;; (f (cdr ls) (lambda (r) ;; (p (car ls) (lambda (x) ;; (k (cons x r))) break)))))))) (define map1 (lambda (p ls k) (let ((break k)) (let f ((ls ls) (k k)) (if (null? ls) (k '()) (p (car ls) (lambda (x) (f (cdr ls) (lambda (r) (k (cons x r))))) break)))))) (map1 (lambda (x k break) (display x) (if (= x 0) (break "zero found") (k (/ 1 x)))) ls (lambda (x) x)))) (reciprocals2 '(1 2 3)) ; => (1 1/2 1/3) (reciprocals2 '(1 2 3 0 4 5 6)) ; => "zero found"
これの結果がこんな感じで,逆順になるのがわかるんだけど,
もにゃっとしてる.
123(1 1/2 1/3) 1230"zero found" 321(1 1/2 1/3) 6540"zero found"
って書いてから思ったけど,これCPS 関係なくて,
ただ問題が等価変換じゃないだけのような気がした.
ということで,p の適応を前に持ってきた.
これでいいのかも.
- 作者: R.ケントディヴィグ,R.Kent Dybvig,村上雅章
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2000/05
- メディア: 単行本
- 購入: 2人 クリック: 71回
- この商品を含むブログ (19件) を見る