9 集合

member

gosh> (define (my-member elm lst . options)
	(let-optionals* options ((pred equal?))
		      (cond ((null? lst) #f)
			    ((pred elm (car lst)) lst)
			    (else (my-member elm (cdr lst) pred)))))
my-member
gosh> (my-member 'ration '(cookie dagger ration gun knife))
(ration gun knife)

勇み足って書いたらすぐ下に答があった。[]とか使った方がキレイかなやっぱり。

ベンチマーク

なるほど以前にやった let-optionals* で内部関数をなくす案が如何にバカであるか、ここを読めば明らかだったのか。

delete-1 & delete-all

gosh> (define (delete-1 elt lis . options)
	(let-optionals* options ((cmp-fn equal?))
			(define (loop lis)
			  (cond [(null? lis) '()]
				[(cmp-fn elt (car lis)) (cdr lis)]
				[else (cons (car lis) (loop (cdr lis)))]))
			(loop lis)))
delete-1
gosh> (delete-1 'ration '(baka aho manuke ration hoge ration))
(baka aho manuke hoge ration)
gosh> (define (delete-all elt lis . options)
	(let-optionals* options ((cmp-fn equal?))
			(define (loop lis)
			  (cond [(null? lis) '()]
				[(cmp-fn elt (car lis)) (loop (cdr lis))]  ; ここ!
				[else (cons (car lis) (loop (cdr lis)))]))
			(loop lis)))
delete-all
gosh> (delete-all 'ration '(baka aho manuke ration hoge ration))
(baka aho manuke hoge)

コピーしない delete(練習問題p112)

gosh> (define (delete-1 elt lis . options)
	(let-optionals* options ((cmp-fn equal?))
			(define (loop lis)
			  (cond [(null? lis) '()]
				[(cmp-fn elt (car lis)) (cdr lis)]
				[else (let ((ret (loop (cdr lis))))
					(if (eq? ret (cdr lis)) lis
					    (cons (car lis) ret)))]))
			(loop lis)))
delete-1
gosh> (use gauche.test)
#<undef>
gosh> (let ((data (list 1 2 3 4 5)))
	(test* "non-copy delete-1" data (delete-1 6 data) eq?))
test non-copy delete-1, expects (1 2 3 4 5) ==> ok
#<undef>

なんかださいけど okになった。模範解答は後でぐぐろう。

named let

gosh> (let name ((a 1))
	(if (= a 10) #f (begin (print a) (name (+ a 1)))))
1
2
3
4
5
6
7
8
9
#f

ああ、なるほど。便利かも。後でわけわからんくなりそうだけど。

完了

面白かった。明日の夜は gauche.testを勉強しよう。