; 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)
OyByZXZlcnNlIHN0cmluZyBpZ25vcmluZyBzcGVjaWFsIGNoYXJhY3RlcnMKCihkZWZpbmUgKHN0cmluZy1yZXZlcnNlISBzdHIpCiAgKGxldCBsb29wICgobG8gMCkgKGhpICgtIChzdHJpbmctbGVuZ3RoIHN0cikgMSkpKQogICAgKGNvbmQgKCg8PSBoaSBsbykgc3RyKQogICAgICAgICAgKGVsc2UgKGxldCAoKHQgKHN0cmluZy1yZWYgc3RyIGxvKSkpCiAgICAgICAgICAgICAgICAgIChzdHJpbmctc2V0ISBzdHIgbG8gKHN0cmluZy1yZWYgc3RyIGhpKSkKICAgICAgICAgICAgICAgICAgKHN0cmluZy1zZXQhIHN0ciBoaSB0KQogICAgICAgICAgICAgICAgICAobG9vcCAoKyBsbyAxKSAoLSBoaSAxKSkpKSkpKQoKKGRpc3BsYXkgKHN0cmluZy1yZXZlcnNlISAiYSFiM2MiKSkgKG5ld2xpbmUpCgooZGVmaW5lIChzdHJpbmctcmV2ZXJzZSEgc3RyKQogIChsZXQgbG9vcCAoKGxvIDApIChoaSAoLSAoc3RyaW5nLWxlbmd0aCBzdHIpIDEpKSkKICAgIChjb25kICgoPD0gaGkgbG8pIHN0cikKICAgICAgICAgICgobm90IChjaGFyLWFscGhhYmV0aWM/IChzdHJpbmctcmVmIHN0ciBsbykpKQogICAgICAgICAgICAobG9vcCAoKyBsbyAxKSBoaSkpCiAgICAgICAgICAoKG5vdCAoY2hhci1hbHBoYWJldGljPyAoc3RyaW5nLXJlZiBzdHIgaGkpKSkKICAgICAgICAgICAgKGxvb3AgbG8gKC0gaGkgMSkpKQogICAgICAgICAgKGVsc2UgKGxldCAoKHQgKHN0cmluZy1yZWYgc3RyIGxvKSkpCiAgICAgICAgICAgICAgICAgIChzdHJpbmctc2V0ISBzdHIgbG8gKHN0cmluZy1yZWYgc3RyIGhpKSkKICAgICAgICAgICAgICAgICAgKHN0cmluZy1zZXQhIHN0ciBoaSB0KQogICAgICAgICAgICAgICAgICAobG9vcCAoKyBsbyAxKSAoLSBoaSAxKSkpKSkpKQoKKGRpc3BsYXkgKHN0cmluZy1yZXZlcnNlISAiYSFiM2MiKSkgKG5ld2xpbmUp