EoPL reading (1) 1.2.4 Exercises

現実トウヒです。色々とばたばたしてて SICP の問題 5.11 は微妙に面倒。EoPL も読みたいのになぁ、と言いつつこっそり読んでたり。
ばたばたしてる時に限ってこーゆーコトをしたくなってくるのは死ななければ直らない病気の一種と思われるんですが ...

1.2.4 - 1

まず試験を。

(use gauche.test)

(add-load-path ".")
(load "duple")

(test-start "duple")
(test-section "duple")
(test* "(duple 2 3) shuould return (3 3)"
       '(3 3)
       (duple 2 3))
(test* "(duple 4 '(ho ho)) should return ((ho ho) (ho ho) (ho ho) (ho ho))"
       '((ho ho) (ho ho) (ho ho) (ho ho))
       (duple 4 '(ho ho)))
(test* "(duple 0 '(blah)) should return ()"
       '()
       (duple 0 '(blah)))
(test-end)

本体はこんな感じですので

(define (duple n x)
  )

試験はこうなります。

$ make
Testing duple ...                                                failed.
discrepancies found.  Errors are:
test (duple 2 3) shuould return (3 3): expects (3 3) => got #<undef>
test (duple 4 '(ho ho)) should return ((ho ho) (ho ho) (ho ho) (ho ho)): expects ((ho ho) (ho ho) (ho ho) (ho ho)) => got #<undef>
test (duple 0 '(blah)) should return (): expects () => got #<undef>

このあたりはまだ実装が簡単。再帰で書くとこうか。

(define (duple n x)
  (if (= n 0)
      '()
      (cons x (duple (- n 1) x)))
  )

試験は一応パスしたんですが、最初 if の条件式を (= x 0) って書いてびっくり (を
これ、バスの中で見ながら思ったんですが、繰返しで綺麗に書くとしたらどうすりゃ良いのでしょうか。