EoPL reading (2) 1.2.4 Exercises

羽生くんのソレを見つつ。

1.2.4 - 1

繰返しなソレをバスで検討してみた。こんなカンジ。

(define (duple n x)
  (define (my-append x y)
    (if (null? x)
	(cons y '())
	(begin
	  (set-cdr! x (cons y '()))
	  x)))
  (define (inner-duple rslt n x)
    (if (= n 0)
	rslt
	(inner-duple (my-append rslt x) (- n 1) x)))
  (inner-duple '() n x)
  )

がしかし、試験にはパスしない。

$ make
Testing duple ...                                                failed.
discrepancies found.  Errors are:
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 (#0=(ho ho) #0#)
$

よく考えたらそうだよな、と言いつつ以下に修正

(define (duple n x)
  (define (my-append x y)
    (define (end-of-x x)
      (if (null? (cdr x))
	  x
	  (end-of-x (cdr x)))
      )
    (if (null? x)
	(cons y '())
	(begin
;	  (set-cdr! x (cons y '()))
	  (set-cdr! (end-of-x x) (cons y '()))
	  x)))
  (define (inner-duple rslt n x)
    (if (= n 0)
	rslt
	(inner-duple (my-append rslt x) (- n 1) x)))
  (inner-duple '() n x)
  )

ケツに追加しないと駄目じゃん、が上記。なんですが結局再帰になってるんじゃないかと。end-of-x は末尾再帰になってるのかなぁ。trace してみりゃ分かるのか。