2010/02/24

TSS multirember-f letrec, fold

(define hoge (letrec ・・・ってのは見慣れなくて驚いた。
も参考に。

; multirember -> multirember-f
; The Seasoned Schemer
(define multirember-f
(lambda (test?)
(lambda (a lat)
(cond ((null? lat) '())
((test? a (car lat))((multirember-f test?) a (cdr lat)))
(else (cons (car lat)
((multirember-f test?) a (cdr lat))))))))
((multirember-f eq?) 'a '(a b c a b c))
; fold
(define (multirember-f test?)
(lambda (a lat)
(fold (lambda (e l)
(if (test? a e)
l
(cons e l)))
'()
lat)))
((multirember-f eq?) 'a '(a b c a b c))
; 再帰結果は束縛可能 http://beta-reduction.blogspot.com/2010/02/define-multirember-lat-cond-null-lat-eq.html
(define (multirember-f test?)
(lambda (a lat)
(if (null? lat)
'()
(let ((b (car lat))
(mr ((multirember-f test?) a (cdr lat))))
(if (test? a b)
mr
(cons b mr))))))
((multirember-f eq?) 'a '(a b c d a b c d))
; letrec multirember-f - The Seasoned Schemer
(define multirember-f
(lambda (test?)
(letrec ((m-f (lambda (a lat)
(cond ((null? lat) '())
((test? a (car lat))(m-f a (cdr lat)))
(else (cons (car lat)
(m-f a (cdr lat))))))))
m-f)))
((multirember-f eq?) 1 '(1 2 3 4 5 1 2 3 1 2 3 1 2))
; letrec multirember - The Seasoned Schemer
(define multirember
(letrec ((multirember
(lambda (a lat)
(cond ((null? lat) '())
((eq? a (car lat))(multirember a (cdr lat)))
(else (cons (car lat)
(multirember a (cdr lat))))))))
multirember))
(multirember 'a '(a b a b a b c a))


The Little Schemer, 4th EditionThe Seasoned Schemer

0 件のコメント:

コメントを投稿