We converted our first named let version of map to a tail-recursive form by adding an accumulator argument to the loop. Another strategy is to add a continuation to the loop:

  (define (map f lst) 
    (let loop ([lst lst]
               [k (lambda (x) x)])
      (if (null? lst)
          (k null)
          (loop (cdr lst) 
                (lambda (v) 
                  (k (cons (f (car lst)) v)))))))

The continuation computes an answer from the result produced by a particular loop iteration. That is, for the continuation given for recursive calls to loop, the variable v becomes bound to the result for the cdr of the list, which we use to build the result for the current iteration. This version does not require a reversal.