I would use an auxiliary function char-plus to add or subtract an offset to
a character:
(define (caesar str n)
(define (char-plus c)
(let ((alpha "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
(if (not (char-alphabetic? c)) c
(let ((i (- (char->integer (char-upcase c)) 65)))
(string-ref alpha (modulo (+ i n) 26))))))
(list->string (map char-plus (string->list str))))
Then here are your two examples; decryption is just encryption by the
negative:
> (caesar "To craunch the marmoset." 1)
"UP DSBVODI UIF NBSNPTFU."
> (caesar "UP DSBVODI UIF NBSNPTFU." -1)
"TO CRAUNCH THE MARMOSET."
On Mon, Mar 10, 2014 at 9:51 AM, Daniel Carrera <[email protected]> wrote:
> Hello,
>
> I found a Scheme implementation of the Caesar cipher on Rosetta Code. It
> said "This was written by a novice, please review"... So I reviewed it, and
> basically rewrote it.
>
> I think my version is much better (clearer) but since I too am a novice, I
> feel bad removing the "novice" warning. Could someone who has used Scheme
> longer than two weeks have a quick look at my work and tell me if I can
> remove the warning (or make corrections if my code is not idiomatic or
> something)?
>
> My version(s):
>
> http://rosettacode.org/wiki/Caesar_cipher#Scheme
>
> Previous version:
>
> http://rosettacode.org/mw/index.php?title=Caesar_cipher&oldid=177675#scheme
>
> Cheers,
> Daniel.
> --
> When an engineer says that something can't be done, it's a code phrase
> that means it's not fun to do.
>
> _______________________________________________
> Chicken-users mailing list
> [email protected]
> https://lists.nongnu.org/mailman/listinfo/chicken-users
>
>
_______________________________________________
Chicken-users mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/chicken-users