; titlecase
(define (char-alphanumeric? c)
(or (char-alphabetic? c) (char-numeric? c)))
(define (titlecase str)
(let ((str (string-downcase str)) (inword #f))
(do ((i 0 (+ i 1))) ((= i (string-length str)) str)
(if inword
(when (char-whitespace? (string-ref str i))
(set! inword #f))
(when (and (char-alphanumeric? (string-ref str i))
(or (zero? i)
(not (char-alphanumeric? (string-ref str (- i 1))))))
(set! inword #t)
(string-set! str i (char-upcase (string-ref str i))))))))
(display (titlecase "programming PRAXIS")) (newline)
(display (titlecase "\"prax'is\"")) (newline)
(display (titlecase "123p")) (newline)
OyB0aXRsZWNhc2UKCihkZWZpbmUgKGNoYXItYWxwaGFudW1lcmljPyBjKQogIChvciAoY2hhci1hbHBoYWJldGljPyBjKSAoY2hhci1udW1lcmljPyBjKSkpCgooZGVmaW5lICh0aXRsZWNhc2Ugc3RyKQogIChsZXQgKChzdHIgKHN0cmluZy1kb3duY2FzZSBzdHIpKSAoaW53b3JkICNmKSkKICAgIChkbyAoKGkgMCAoKyBpIDEpKSkgKCg9IGkgKHN0cmluZy1sZW5ndGggc3RyKSkgc3RyKQogICAgICAoaWYgaW53b3JkCiAgICAgICAgICAod2hlbiAoY2hhci13aGl0ZXNwYWNlPyAoc3RyaW5nLXJlZiBzdHIgaSkpCiAgICAgICAgICAgIChzZXQhIGlud29yZCAjZikpCiAgICAgICAgICAod2hlbiAoYW5kIChjaGFyLWFscGhhbnVtZXJpYz8gKHN0cmluZy1yZWYgc3RyIGkpKQogICAgICAgICAgICAgICAgICAgICAob3IgKHplcm8/IGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAobm90IChjaGFyLWFscGhhbnVtZXJpYz8gKHN0cmluZy1yZWYgc3RyICgtIGkgMSkpKSkpKQogICAgICAgICAgICAoc2V0ISBpbndvcmQgI3QpCiAgICAgICAgICAgIChzdHJpbmctc2V0ISBzdHIgaSAoY2hhci11cGNhc2UgKHN0cmluZy1yZWYgc3RyIGkpKSkpKSkpKQoKKGRpc3BsYXkgKHRpdGxlY2FzZSAicHJvZ3JhbW1pbmcgUFJBWElTIikpIChuZXdsaW5lKQooZGlzcGxheSAodGl0bGVjYXNlICJcInByYXgnaXNcIiIpKSAobmV3bGluZSkKKGRpc3BsYXkgKHRpdGxlY2FzZSAiMTIzcCIpKSAobmV3bGluZSk=