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 って読むって本当ですか?
以下コード。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; 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) |
0 件のコメント:
コメントを投稿