2010/02/24

TSS letrec multirember

The Seasoned Schemer
The Little Schemer でおなじみ multirember 。
Y combinator 使って書き直しましょう → Y combinator は letrec が代替に使えるよ、という無茶な流れ。

;; chapter.12
; multirember
; standard
(define (multirember a lat)
(cond ((null? lat) '())
((eq? a (car lat))(multirember a (cdr lat)))
(else (cons (car lat)
(multirember a (cdr lat))))))
(multirember 'a '(a b c d a b c d))
; fold
(define (multirember a lat)
(fold (lambda (e l)
(if (eq? a e)
l
(cons e l)))
'()
lat))
(multirember 1 '(1 2 3 1 2 3 1 2 3))
; filter
(use srfi-1)
(define (multirember a lat)
(filter (lambda (e)
(not (eq? a e)))
lat))
(multirember 'a '(a b c a b c))
; the seasoned schemer
; y combinator
(define Y
(lambda (f)
((lambda (g)
(g g))
(lambda (h)
(f (lambda (x)
((h h) x)))))))
((Y (lambda (f)
(lambda (n)
(if (zero? n)
1
(* n (f (- n 1))))))) 5)
(define multirember
(lambda (a lat)
((Y (lambda (mr)
(lambda (lat)
(cond ((null? lat) '())
((eq? a (car lat))(mr (cdr lat)))
(else (cons (car lat)
(mr (cdr lat))))))))
lat)))
(multirember 'a '(a b c a b c a b c))
(define multirember
(lambda (a lat)
(((lambda (f)
((lambda (g)
(g g))
(lambda (h)
(f (lambda (x)
((h h) x))))))
(lambda (mr)
(lambda (lat)
(cond ((null? lat) '())
((eq? a (car lat))(mr (cdr lat)))
(else (cons (car lat)
(mr (cdr lat))))))))
lat)))
(multirember 1 '(1 2 1 2 1 2 3))
;; length
(define add1
(lambda (n)
(+ n 1)))
;; (define length 'hoge)
;; (display length)
;; (define length
;; (with-module gauche length))
(define length
(Y (lambda (length)
(lambda (l)
(cond ((null? l) 0)
(else (add1 (length (cdr l)))))))))
(length '(1 2 3))
; letrec
(define multirember
(lambda (a lat)
(letrec ((mr (lambda (l)
(cond ((null? l) '())
((eq? a (car l))(mr (cdr l)))
(else (cons (car l)
(mr (cdr l))))))))
(mr lat))))
(multirember 'a '(a b a b a b c a))


The Little Schemer, 4th EditionThe Seasoned Schemer

0 件のコメント:

コメントを投稿