2010/03/14

TSS rember1*

The Little Schemer からの慣習(?)で「*(スター)」が付く手続きは、ネストした list を再帰的に処理します。
rember (remove member の略だと思われます)は指定した要素を list から取り除く手続きです。
rember1* は指定した要素がネストした list 内で最初に見つかったものだけを取り除く手続きということでよさそうです。

ネストした list 内から最初に見つかったものを一つだけ取り除くって、一つだけって逆に難しいですね。

本題は、繰り返し出てくるコードを let で纏め上げましょう、ということのようです。
ネストした cond とか読みづらいですねー。分岐が2つなら if 使おうよ。というところですが、まだ if も出てきてなかったりします。

The Seasoned Schemer では11章で letrec, 13章でletcc, call/cc, 14章で let, 15章で set!,  16章で if, が出てきます。
set! って set bang って読むって本当ですか?

以下コード。
; rember1*
;; (rember1* 'salad '((Swedish rye)
;; (French (mustard salad turkey))
;; salad))
;; -> ((Swedish rye)
;; (French (mustard turkey))
;; salad)
; The Seasoned Schemer
(define rember1*
(lambda (a lat)
(cond
((null? lat)(quote ()))
((atom? (car lat))
(cond
((eq? (car lat) a)(cdr lat))
(else (cons (car lat)
(rember1* a (cdr lat))))))
(else
(cond
((eqlist?
(rember1* a (car lat)) ; *
(car lat))
(cons (car lat)
(rember1* a (cdr lat))))
(else (cons (rember1* a (car lat)) ; *
(cdr lat))))))))
(rember1* 'salad '((Swedish rye)
(French (mustard salad turkey))
salad))
; -> ((Swedish rye) (French (mustard turkey)) salad)
; The Seasoned Schemer letrec
(define rember1*
(lambda (a l)
(letrec
((R (lambda (l)
(cond
((null? l)(quote ()))
((atom? (car l))
(cond
((eq? (car l) a)(cdr l))
(else (cons (car l)
(R (cdr l))))))
(else
(cond
((eqlist?
(R (car l)) ; *
(car l))
(cons (car l)
(R (cdr l))))
(else (cons (R (car l)) ; *
(cdr l)))))))))
(R l))))
(rember1* 'salad '((Swedish rye)
(French (mustard salad turkey))
salad))
; -> ((Swedish rye) (French (mustard turkey)) salad)
; The Seasoned Schemer letrec, let
(define rember1*
(lambda (a l)
(letrec
((R (lambda (l)
(cond
((null? l)(quote ()))
((atom? (car l))
(cond
((eq? (car l) a)(cdr l))
(else (cons (car l)
(R (cdr l))))))
(else (let ((av (R (car l))))
(cond
((eqlist? (car l) av)
(cons (car l)(R (cdr l))))
(else (cons av (cdr l))))))))))
(R l))))
(rember1* 'salad '((Swedish rye)
(French (mustard salad turkey))
salad))
; -> ((Swedish rye) (French (mustard turkey)) salad)
view raw rember1*.scm hosted with ❤ by GitHub


The Seasoned Schemer

0 件のコメント:

コメントを投稿