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))
  )

なんとなく微妙。ちょっと酔ったイキオイが加速してますので止めとこ。