新関数を考えてみた
unfoldは便利なんだけど、cons邪魔杉なので新関数unを考えてみた。
(define (un p tail f seed) (if (p seed) (tail seed) (f seed (lambda (x) (un p tail f x)))))
fは2個の引数、seedと手続きを取るようにする。
リストのコピー。
(un null? values (lambda (x g) (cons (car x) (g (cdr x)))) (iota 10)) ; (0 1 2 3 4 5 6 7 8 9)
0から10まで足す。
(un zero? values (lambda (x g) (+ x (g (- x 1)))) 10) ; 55
フィボナッチ(f(0) = 1, f(1) = 1)
(un (lambda (x) (or (zero? x) (= x 1))) (lambda (x) 1) (lambda (x g) (+ (g (- x 1)) (g (- x 2)))) 10) ; 89
イイ!!
が・・・ふつうに書いた方が楽かも。もうちょい練ってみる。
バージョン2
unのバージョン2を考えてみた。ifイラナイ!!
(define (un f seed) (f seed (lambda (x) (un f x))))
ふふ。最強だぜ。
フィボナッチだって書ける。(f(0) = 0, f(1) = 1)
(un (lambda (x g) (cond ((zero? x) 0) ((= x 1) 1) (else (+ (g (- x 1)) (g (- x 2)))))) 10)
再帰なら何でも来い!!
って・・・よく見たらletrecと変わらないじゃないか!!
ということでunの開発終了。車輪の開発はムズカシイ。