clairvyの日記

思ったこと,調べたことを書きます

CPS変換ってことでもないこと

最近プログラミング言語SCHEME を読んでいる.

継続が昔からよくわからんので丁寧に読んでいる感じ.

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 の適応を前に持ってきた.
これでいいのかも.

プログラミング言語SCHEME

プログラミング言語SCHEME

  • 作者: R.ケントディヴィグ,R.Kent Dybvig,村上雅章
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2000/05
  • メディア: 単行本
  • 購入: 2人 クリック: 71回
  • この商品を含むブログ (19件) を見る