FC2ブログ
--.--
--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

02.09
Sat
call/ccでやってみたいことがあるのですが、まず継続とかよく理解できてない...

ということで備忘録として継続についてすこしやってみます

(define (sin/cps x next)(next (sin x)))
(define (cos/cps x next)(next (cos x)))
(define (tan/cps x next)(next (tan x)))


(define (sct x)(sin (cos (tan x))))
; sin(cos(tan(x)))で一番初めに計算されるのは
; tan(x)でその結果がcosに渡り、その結果がsinにわたる
; それをCPSで書いたのが以下
; tan(x)の結果がaに束縛されてその結果をcosしてそれがbに束縛されてそれがsinされて
; 最後にcontに渡される.contが恒等関数なら結果がそのまま返る
; sin/cps , cos/cps , tan/cps はそれぞれ 
; 各々の三角関数の計算をしてそれを二番目の引数の関数に渡す関数
(define (sct/cps x cont)(tan/cps x (^ (a) (cos/cps a (^ (b) (sin/cps b cont))))))


; CPSは結果をそのまま返すんじゃなくて、結果を次の関数にわたして行く
; 感じになるので、関数->次の関数->... をlambda、lambdaで繋いでいく感じになるのかな


;何個か再帰のある関数をCPSで

(define (sum/cps lst cont)
	(if (null? lst)
		(cont 0)
		(sum/cps (cdr lst) (^ (x) (cont (+ (car lst) x))))))


(define (fact/cps n cont)
	(if (zero? n)
		(cont 1)
		(fact/cps (- n 1) (^ (x) (cont (* n x))))))


; フィボナッチ数列のイメージは, (+ (fib (- n 2)) (fib (- n 1)))な
; 感じなので一番最初に評価される計算の(fib (- n 2))を最初に書いてそれを
; (fib (- n 1))をやる計算に渡して、最後に2つの結果を足し算するやつに渡すみたいに考えるといいかな?
; S式の評価・計算の順序を意識するといいのかもしれない
(define (fib/cps n cont)
	(if (or (= n 0) (= n 1))
		(cont n)
		(fib/cps (- n 2) (^ (x) (fib/cps (- n 1) (^ (y) (cont (+ x y))))))))


(define (pow/cps n m cont)
	(if (zero? m)
		(cont 1)
		(pow/cps n (- m 1) (^ (x) (cont (* x n)) ))))



(define (search/cps pred? lst cont)
	(cond 
		((null? lst) (cont lst))
		;リストの先頭が条件に一致する要素だったら、先頭以外のやつを探した結果にconsする
		((pred? (car lst)) (search/cps pred? (cdr lst) (^ (x) (cont (cons (car lst) x)))))
		(else (search/cps pred? (cdr lst) cont))))



(print (sct 10))
(sct/cps 10 (^ (result) (print result)))
(sum/cps '(1 2 3 4 5) (^ (result) (print "1+2+3+4+5 = " result)))
(fact/cps 5 (^ (result) (print "fact(5) = " result)))
(fib/cps 10 (^ (result) (print "fib(10) = " result)))
(pow/cps 2 10 (^ (result) (print "2^10 = " result)))
(search/cps even? '(1 2 3 4 5 6 7 8 9) (^ (result) (print "found: " result)))

スポンサーサイト

comment 0 trackback 0
トラックバックURL
http://telracsmoratori.blog.fc2.com/tb.php/163-c72045de
トラックバック
コメント
管理者にだけ表示を許可する
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。