EoPL reading (3) 1.2.4 Exercises
再帰でさくっと書いてみる事に。なんかだらだらしてる感じなので。
Exercise 1.15-2
とりあえず以下の試験を書いた。
(use gauche.test) (add-load-path ".") (load "invert") (test-start "1.15-2") (test-section "invert") (test* "(invert '((a 1) (a 2) (b 1) (b 2)))" '((1 a) (2 a) (1 b) (2 b)) (invert '((a 1) (a 2) (b 1) (b 2)))) (test-end)
実装微妙。ちょっと間違えました。
(define (invert lst) (if (null? lst) '() (cons (list (cadr (car lst)) (car (car lst))) (invert (cdr lst)))) )
Exercise 1.15-3
試験が以下
(use gauche.test) (add-load-path ".") (load "filter-in") (test-start "1.15-3") (test-section "filter-in") (test* "(filter-in number? '(a 2 (1 3) b 7))" '(2 7) (filter-in number? '(a 2 (1 3) b 7))) (test* "(filter-in symbol? '(a (b c) 17 foo))" '(a foo) (filter-in symbol? '(a (b c) 17 foo))) (test-end)
実装が以下なんですが、最初 if の consequent と alternative を逆にしててびっくり。
(define (filter-in pred lst) (if (null? lst) '() (if (pred (car lst)) (cons (car lst) (filter-in pred (cdr lst))) (filter-in pred (cdr lst)))) )
Exercise 1.15-4
もう一つ。
(use gauche.test) (add-load-path ".") (load "every?") (test-start "1.15-4") (test-section "test-every?") (test* "(every? number? '(a b c 3 e))" #f (every? number? '(a b c 3 e))) (test* "(every? number? '(1 2 3 5 4))" #t (every? number? '(1 2 3 5 4))) (test-end)
実装が以下
(define (every? pred lst) (cond ((null? lst) #t) ((pred (car lst)) (every? pred (cdr lst))) (else #f)) )
なんとなく微妙。ちょっと酔ったイキオイが加速してますので止めとこ。