2012-07-14 4 views
-1

Je veux écrire un programme dans LISP pour obtenir une chaîne de l'utilisateur et retourner la chaîne formée en ajoutant 1 à chaque char-code de la chaîne. Par exemple:Convertir CHAR en ASCII dans LISP

entrée: « hello123 » sortie: « ifmmp234 »

Je pensais que je devrais convertir les caractères un par un à ASCII et faire ce que je veux faire.

Toute aide avec ce sera tellement apprécié ..

Merci

Voici le code que j'ai développé. Cela ne me donne rien dans la sortie. Pouvez-vous me aider:

(defun esi (n) 
    (setf m 0) 
    (loop (when (< m (length n)) 
      (return)) 
     (code-char (+ 1 (char-code (char n m)))) 
     (+ 1 m))) 
+2

Ce livre est une introduction en douceur dans Lisp: http://www.cs.cmu.edu/~dst/LispBook/ - gratuit pour le téléchargement. –

Répondre

3

Regardez les fonctions char-code et code-char.

EDIT: En ce qui concerne votre exemple de code:

  • Il semble que l'entrée à votre fonction doit être une chaîne. Nommez-le, par ex. string.
  • Cette (setf m 0) définit une variable libre. Dans ce contexte, je dois supposer que m n'est jamais défini nulle part, donc le comportement est indéfini. Vous devez par exemple utiliser let pour établir une liaison locale. Astuce: la plupart des constructions en boucle permettent également d'établir des liaisons locales. La seule sortie de votre boucle est (return). Comme il n'obtient aucun paramètre, il retournera toujours nil. Vous devez accumuler la nouvelle chaîne quelque part et finalement la renvoyer.
  • Les fonctions de Lisp ne modifient généralement pas leurs arguments. (+ 1 m) ne modifie pas m. Il renvoie juste une valeur supérieure à m. De même, code-char ne modifie pas son argument, mais renvoie une nouvelle valeur correspondant au caractère correspondant à l'argument. Vous devez lier ou affecter ces valeurs.
  • Cette condition de fin est incorrecte. Il se terminera directement ou, si la chaîne d'entrée est vide, ne se terminera jamais.
+0

Merci Svante ... Vraiment utile ... avez-vous une idée sur la façon d'écrire le code que je cherche? – iSi

+0

C'est le code que j'ai développé. Cela ne me donne rien dans la sortie. Pouvez-vous me aider: (defun esi (n) (setf m 0) (boucle (quand ( iSi

0

Il existe plusieurs façons de faire ce que vous voulez. Commençons par une fonction qui renvoie un caractère plus tard un point de code (il y a quelques problèmes de limites ici, ignorons cela pour l'instant).

(defun next-codepoint (char) (code-char (1+ (char-code char)))) 

Maintenant, cela fonctionne sur les caractères. Heureusement, une chaîne est, essentiellement, une séquence de caractères. Les opérations de séquence devraient, en général, vous envoyer dans la direction de la famille MAP.

Ainsi, nous avons:

(defun nextify-string (string) (map 'string #'next-codepoint string)) 

Prendre ce qui se passe étape par étape:

  • Pour chaque caractère dans un stringm d'entrée nous:
    • Nous convertir un caractère à un code attribut.
    • Nous incrémenter ce
    • Nous reconvertir pour un personnage
  • Ensuite, nous assemblons tous ces en une valeur de retour.