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.