#lang racket (provide (all-defined-out)) ; shift : char, int -> char ; Shift `ch` by `k` letters (wrapping around at Z). ; Account for upper/lower case. ; Punctuation, however, is not handled correctly (it gets turned into a letter). ; (define (shift ch k) (let* {[offset (char->integer (if (char-upper-case? ch) #\A #\a))] [code (- (char->integer ch) offset)] [new-code (+ code k)] [new-code% (modulo new-code 26)] } (integer->char (+ new-code% offset)))) (module+ test ;; a submodule: not run when this file is being require'd elsewhere. (require rackunit) (check-eq? (shift #\A 1) #\B) (check-eq? (shift #\b 2) #\d) (check-eq? (shift #\Z 1) #\A) (check-eq? (shift #\A -1) #\Z) (check-eq? (shift #\A 26) #\A) (check-eq? (shift #\A 29) #\D) (check-eq? (shift #\a -29) #\x) (check-eq? (shift #\B -2601) #\A) )