(define (within? x lower upper) (and (<= x upper) (>= x lower))) ; rotate-char char amount lower upper -> char ; If char is within lower and upper range, increase char by amount, and if ; it goes over the upper range, then wrap around to the lower range. (define (rotate-char in amount lower upper) (let ((in (char->integer in)) (lower (char->integer lower)) (upper (char->integer upper))) (integer->char (if (within? in lower upper) (begin (set! in (+ in amount)) (if (> in upper) (+ lower (- in upper) -1) in)) in)))) (define (rot13 in) (cond ((char-lower-case? in) (rotate-char in 13 #\a #\z)) ((char-upper-case? in) (rotate-char in 13 #\A #\Z)) (else in))) ; I am not sure I want to think about this for now... ;(define (rotate-char2 in amount lower upper) ; (let loop ((i in)) ; (cond ; ((< i lower) (loop (+ i amount))) ; ((< i upper) i) ; (else (loop (+ lower (- i upper)))))))