[ create a new paste ] login | about

Project: programmingpraxis
Link: http://programmingpraxis.codepad.org/NYohlcHq    [ raw code | output | fork ]

programmingpraxis - Scheme, pasted on Mar 7:
; 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)


Output:
1
2
3
4
5
6
7
8
9
""
" "
"  "
"hello"
" hello"
"hello "
"fox brown quick the"
"fox brown  quick the"
"fox! 42 brown  quick the"


Create a new paste based on this one


Comments: