2016-11-30 2 views
-1

Ceci est juste un César Cipher en Common Lisp avec une clé de rotation réglée sur 5.Affichage d'une liste de chaînes au lieu d'un affichage d'une chaîne

J'ai quelques restrictions
L'entrée doit être lu et traité récursivement comme une liste.
Aucune variable, tableaux, boucles, progn autorisés.
La sortie doit être une chaîne et non une liste.
Le programme doit utiliser uniquement la récursivité.

(defun encode (expr) ; define function funcName (argument) 
    ; Out case when the list is empty 
    (cond ((null expr) nil)  ; conditional (test1 action1) 
    ; Checking if the expression is an atom only then to go encryption 
    ((atom expr) (encrot expr)) ; test2 see if one or less atom 
    ; Adding the result of encrot to the list and 
    (t(cons (encode(car expr)) (encode(cdr expr)))))) ; will run if all others fail 

(defun encrot (expr) 
    ; casts the object and then shifts the char by 5 
    (string (int-char(encrot2 (+ 5 (char-int(char (string expr) 0))))))) 

(defun encrot2 (x) 
    ; Checking to see if the atom is a letter 
    (cond ((> x 90) (+ 64 (mod x 90))) 
    ((< x 91) x))) 

Ma compréhension est que les inconvénients de la fonction affiche les éléments de la liste sous forme de chaînes. Par exemple ("A" "B" "C")

En tant que chaîne, il devrait en théorie ressembler à ceci: "A B C".

Je compile en utilisant GNU CLISP 2.49 (2010-07-07) http://clisp.cons.org/.

+1

Pourriez-vous donner un exemple (entrée + sortie)? – coredump

+2

'cons' n'affiche rien. Cela ne produit aucune sortie. 'cons' ne construit qu'une contre-cellule. –

Répondre

1

La façon la plus simple de convertir la liste de sortie à une chaîne est au format:

(format t "~{~a ~}" '(a b c)) => A B C 
+2

Sauf si vous voulez réellement l'effet secondaire d'impression, il est probablement préférable d'utiliser '(format nil ...)' – Vatine

+0

Merci Leo, cela a fonctionné –

+0

@Vatine encore mieux! –