How to compose two mapping functions into a third?
paulgb: You could use lazy lists like (I think) Haskell uses:  (define (lazy-range start end) ; create a lazy list that returns the next number in the range [start end]
    (if (= start end) (cons start '())
    (cons start
      (delay (lazy-range (add1 start) end)))))

  (define (lazy-map fn lst) ; map a function to every element of a lazy list, returning a lazy list
    (if (empty? lst) '()
      (cons (fn (car lst))
        (delay (lazy-map fn (force (cdr lst)))))))

  (define map1 (curry lazy-map (curry + 10))) ; equivalent to map1 from your example
  (define map2 (curry lazy-map (lambda (x) (expt x 2)))) ; equivalent to map2 from your example

  (define (lazy-list->list lazy) ; convert a lazy list to a list (for printing, etc)
    (if (empty? lazy) '()
      (cons (car lazy) (lazy-list->list (force (cdr lazy))))))

  (lazy-list->list (map1 (map2 (lazy-range 1 10)))) ; example use

Because the lists are lazy, the maps will only be applied as each value is actually needed, like you described.