理系学生日記

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

問題2-31

昨日とおなじなんだけど、もっと抽象度をあげる。
関数を引数にするよ!!
よく見ると昨日のとほとんどかわってない。

(define (map proc items)
  (if (null? items)
      ()
      (cons (proc (car items))
	    (map proc (cdr items)))))

(define (tree-map proc tree)
  (map (lambda (sub-tree)
	 (if (pair? sub-tree)
	     (tree-map proc sub-tree)
	     (proc sub-tree)))
       tree))

そしたら昨日のsquare-treeはこんな風に定義できます。とてもうつくしい。

(define (square-tree tree) (tree-map square tree))

結果はもちろんおなじ。

gosh> (square-tree
       (list 1
	     (list 2 (list 3 4) 5)
	     (list 6 7)))
(1 (4 (9 16) 25) (36 49))