継続マラソン - 継続渡しスタイル


継続渡しスタイルを熟読し、必要時には写経。
写経。

(define (fact/cps n cont)
  (if (= n 0)
      (cont 1)
      (fact/cps (- n 1) (lambda (a) (cont (* n a))))))


結果。

(fact/cps 4 (lambda (a) a))
=> 24


引数で、継続手続きを受けとる感じ。

(define (hige-even n even-proc odd-proc)
  (if (even? n)
      (even-proc n)
      (odd-proc n)))

あまり意味のない手続きだけど、継続渡しスタイルだと、hige-even がどういう結果を返すかを外から制御できるってのがメリットっぽい。

(hige-even 5 (lambda (a) 'even) (lambda (a) 'odd))
=> odd

ふむふむ。
うーん。この例あたりからすんなりとは理解できなくなってきた。
ノートに書いてみると分かるのだけども。

;; 継続手続きを返すのみ
(call-with-procedure (lambda (a) (* 2 a)) (lambda (p) p))

;; 継続手続きをリストにして返す
(call-with-procedure (lambda (a) (* 2 a)) (lambda (p) (list p p)))	

今日は、ここまで。CPSは初めてに等しいので頭が疲れる。