; reverse string ignoring special characters

(define (string-reverse! str)
  (let loop ((lo 0) (hi (- (string-length str) 1)))
    (cond ((<= hi lo) str)
          (else (let ((t (string-ref str lo)))
                  (string-set! str lo (string-ref str hi))
                  (string-set! str hi t)
                  (loop (+ lo 1) (- hi 1)))))))

(display (string-reverse! "a!b3c")) (newline)

(define (string-reverse! str)
  (let loop ((lo 0) (hi (- (string-length str) 1)))
    (cond ((<= hi lo) str)
          ((not (char-alphabetic? (string-ref str lo)))
            (loop (+ lo 1) hi))
          ((not (char-alphabetic? (string-ref str hi)))
            (loop lo (- hi 1)))
          (else (let ((t (string-ref str lo)))
                  (string-set! str lo (string-ref str hi))
                  (string-set! str hi t)
                  (loop (+ lo 1) (- hi 1)))))))

(display (string-reverse! "a!b3c")) (newline)