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を勉強しよう。