理系学生日記

おまえはいつまで学生気分なのか

問題2-22

Louis Reasnorがこんなの作って、逆順に出力されたとか何とか騒いでいるらしい。

(define (square x) (* x x))

(define (square-list items)
  (define (iter things answer)
    (if (null? things)
	answer
	(iter (cdr things)
	      (cons (square (car things))
		    answer))))
  (iter items ()))
gosh> (square-list (list 1 2 3 4))
(16 9 4 1)

なぜかとかいわれても、そう作ってるんだからそうなるよくらいしか言えないような気がするのだけども、thingsの先頭をanswerの尻尾にしていってるんだからそうなる。
で、騒ぎまくったLouis Reasnorがこんな風に作り変えた。

(define (square-list items)
  (define (iter things answer)
    (if (null? things)
	answer
	(iter (cdr things)
	      (cons answer
		    (square (car things))))))
    (iter items ()))

動かないとかいってまだ騒いだらしい。Reasnor++。

gosh> (square-list (list 1 2 3 4))
((((() . 1) . 4) . 9) . 16)

リストの構造は本来

(cons 1
      (cons 2
	    (cons 3
		  (cons 4 ()))))

でないといけないのに、Louis Reasonerは

(cons 
 (cons 
  (cons 
   (cons () 1) 2) 3) 4)

こんなのを作ってる。一昨日ぼくもはまった。