(define (within? x lower upper) (and (<= x upper) (>= x lower))) (define (wrap-range x lower upper) (cond ((> x upper) (wrap-range (+ lower (- x upper)) lower upper)) ((< x lower) (wrap-range (- upper (- lower x)) lower upper)) (else x))) ; 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) (wrap-range (+ in amount) lower upper) 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)))))))