Qfjbl rq ljkfx nrxb pzofmpfpqf klk zxmfxj. Cloqxppb zljmolyxob mlqbp?Zbqbori, pf Zxbpxobi fifqxkqbp hfqqboxp j bq v brfqxirp, klkkb bxbabi bszfmfbkaxb prkq ab oxqflkb klqxori?
;;;; LICENTIA: FAC QVOD VIS
(defpackage #:caesar
(:use #:cl)
(:export #:encode
#:encode-with-casing
#:latin23
#:latin26))
(in-package #:caesar)
(defun try-encode-char (char key shift)
(let ((p (position char key)))
(and p (char key (mod (+ p shift) (length key))))))
(defun encode (string shift key)
(unless (listp key)
(setf key (list key)))
(with-output-to-string (s)
(loop for char across string
for encoded-char = (loop for k in key
for e = (try-encode-char char k shift)
when e
do (return e)
finally (return nil))
do (write-char (or encoded-char char) s))))
(defun encode-with-casing (string shift minuscules)
(encode string shift (list minuscules (string-upcase minuscules))))
(defun latin23 (string shift)
(encode string shift '("abcdefghiklmnopqrstuxyz" "ABCDEFGHIKLMNOPQRSTVXYZ")))
(defun latin26 (string shift)
(encode-with-casing string shift "abcdefghijklmnopqrstuvwxyz"))
CAESAR> (latin23 "Salue!" -3)
"Pxhrb!"
CAESAR> (latin23 "SALVE" -3)
"PXHRB"