Sezar şifreleme için yazdığım ilk kod aşağıdaki gibiydi

  1. (define str2 "")
  2. (define (sezar str lst)
  3. (do ((i 0 (+ i 1)) (j 0 (+ j 1))) ((= j (string-length str)))
  4. (if (= i (length lst))
  5. (set! i 0))
  6. (set! str2
  7. (string-append
  8. str2
  9. (string (integer->char
  10. (+ (list-ref lst i )
  11. (char->integer (string-ref str j)))))))))

Ancak bu kod pek hoşuma gitmedi üzerinde biraz daha oynama yapmak gerekiyordu. Mesela en baştaki

(define str2 "")

pek hoş durmuyordu ve hiç bir sonuç gönmüyordu. Ekstradan srt2 nin değerini sorgulamak gerekiyordu.

Bu sebeple kodu aşağıdaki hale getirdim.

  1. (define (sezar str lst)
  2. (let ((str (string-downcase str)) (str2 ""))
  3. (do ((i 0 (+ i 1)) (j 0 (+ j 1))) ((= j (string-length str)))
  4. (if (= i (length lst))
  5. (set! i 0))
  6. (set! str2
  7. (string-append
  8. str2
  9. (string (integer->char
  10. (+ (list-ref lst i )
  11. (char->integer (string-ref str j))))))))
  12. (values str2)))

Ancak yine eksiklikler vardı.

(sezar "zeliha" '(1 2))

bize "{gmkic" değerini döndürüyordu. "agmkic" gibi bir değer bizim için daha hoş olabilirdi.

  1. (define (sezar str lst)
  2. (let ((str (string-downcase str)) (str2 "") (tmp 0))
  3. (do ((i 0 (+ i 1)) (j 0 (+ j 1))) ((= j (string-length str)))
  4. (if (= i (length lst))
  5. (set! i 0))
  6. (set! str2
  7. (string-append
  8. str2
  9. (string (integer->char
  10. (begin
  11. (set! tmp (+ (list-ref lst i )
  12. (char->integer (string-ref str j))))
  13. (cond
  14. [(> tmp 122) (- tmp 26)]
  15. [else tmp])))))))
  16. (values str2)))

Burda eklediğim satırlar karaktere çevirilecek sayının değerinin 122den büyük olup olmadığını kontrol ediyor. Eğer z+1=123 gibi bir değer elde ederse bu değer a'ya çevirliyor.
Kodlara Burdan ulaşabilirsiniz.