chicken-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Chicken-users] Review my Caesar Cipher?


From: Phil Bewig
Subject: Re: [Chicken-users] Review my Caesar Cipher?
Date: Mon, 10 Mar 2014 10:41:34 -0500

I used only the procedures provided by RnRS, instead of loading SRFI-13, but you could use string-map if you want to. For those who prefer to roll their own, here is a simple version of string-map! that mutates the string in place:

(define (string-map! f str)
  (do ((i 0 (+ i 1))) ((= i (string-length str)) str)
    (string-set! str i (f (string-ref str i)))))

Or you could convert to a list, perform the mapping, and convert back, as I did in my original version of the function. With string-map!, the caesar function changes to this:

(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))))))
  (string-map! char-plus str))

For purposes of Rosetta Code, it's probably better to avoid SRFI-13 and stay with RnRS, as in my first version of the function.


On Mon, Mar 10, 2014 at 10:31 AM, Peter Bex <address@hidden> wrote:
On Mon, Mar 10, 2014 at 10:26:56AM -0500, Phil Bewig wrote:
> 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))))

If you're using srfi-13, you might as well change the final line to use
string-map:  (string-map char-plus str)

Cheers,
Peter
--
http://www.more-magic.net


reply via email to

[Prev in Thread] Current Thread [Next in Thread]