昨日とおなじなんだけど、もっと抽象度をあげる。
関数を引数にするよ!!
よく見ると昨日のとほとんどかわってない。
(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))