; reverse words
(define (string-reverse! s lo hi)
(let loop ((lo lo) (hi (- hi 1)))
(if (< hi lo) s
(let ((t (string-ref s lo)))
(string-set! s lo
(string-ref s hi))
(string-set! s hi t)
(loop (+ lo 1) (- hi 1))))))
(define (next-space s len i)
(do ((i i (+ i 1))) ((or (= i len) (char=? (string-ref s i) #\space)) i)))
(define (reverse-words s)
(let* ((s (substring s 0)) (len (string-length s)))
(let loop ((s (string-reverse! s 0 len)) (lo 0) (hi (next-space s len 0)))
(if (= len hi) (string-reverse! s lo hi)
(loop (string-reverse! s lo hi) (+ hi 1) (next-space s len (+ hi 1)))))))
(write (reverse-words "")) (newline)
(write (reverse-words " ")) (newline)
(write (reverse-words " ")) (newline)
(write (reverse-words "hello")) (newline)
(write (reverse-words "hello ")) (newline)
(write (reverse-words " hello")) (newline)
(write (reverse-words "the quick brown fox")) (newline)
(write (reverse-words "the quick brown fox")) (newline)
(write (reverse-words "the quick brown 42 fox!")) (newline)