+#lang racket
+
+(define (map1 f list)
+ (cond
+ [(empty? list) '()]
+ [else (cons (f (first list))
+ (map1 f (rest list)))]))
+
+(define (mymap f lists)
+ (cond
+ [(empty? (first lists)) '()]
+ [else (cons (apply f (map1 first lists))
+ (mymap f (map1 rest lists)))]))
+
+;; 2.28
+(define (fringe coll)
+ (cond
+ [(null? coll) '()]
+ [(not (pair? coll)) (list coll)]
+ [else (append (fringe (first coll))
+ (fringe (rest coll)))]))
+
+(define (scale-tree tree factor)
+ (map (lambda (subtree)
+ (if (pair? subtree)
+ (scale-tree subtree factor)
+ (* subtree factor)))
+ tree))
+
+;; 2.30
+(define (square-tree1 tree)
+ (map (lambda (subtree)
+ (if (pair? subtree)
+ (square-tree1 subtree)
+ (* subtree subtree)))
+ tree))
+
+(define (square-tree2 tree)
+ (cond
+ [(null? tree) '()]
+ [(not (pair? tree)) (* tree tree)]
+ [else (cons (square-tree2 (car tree))
+ (square-tree2 (cdr tree)))]))
+
+(define (fringe1 tree)
+ (map (lambda (subtree)
+ (if (not (pair? subtree))
+ subtree
+ (fringe1 subtree)))
+ tree))
+
+
+(define (tree-map f tree)
+ (map (lambda (subtree)
+ (if (pair? subtree)
+ (tree-map f subtree)
+ (f subtree)))
+ tree))