LISP - Entrée et sortie

Common LISP fournit de nombreuses fonctions d'entrée-sortie. Nous avons déjà utilisé la fonction de format et la fonction d'impression pour la sortie. Dans cette section, nous examinerons certaines des fonctions d'entrée-sortie les plus couramment utilisées fournies dans LISP.

Fonctions d'entrée

Le tableau suivant présente les fonctions d'entrée les plus couramment utilisées de LISP -

N ° Sr. Description de la fonction
1

read& flux d'entrée optionnel eof-error-p eof-value recursive-p

Il lit la représentation imprimée d'un objet Lisp à partir du flux d'entrée, construit un objet Lisp correspondant et renvoie l'objet.

2

read-preserving-whitespace& optionnel in-stream eof-error-p eof-value recursive-p

Il est utilisé dans certaines situations spécialisées où il est souhaitable de déterminer précisément quel caractère a terminé le jeton étendu.

3

read-line& flux d'entrée optionnel eof-error-p eof-value recursive-p

Il lit une ligne de texte terminée par une nouvelle ligne.

4

read-char& flux d'entrée optionnel eof-error-p eof-value recursive-p

Il prend un caractère du flux d'entrée et le renvoie comme un objet caractère.

5

unread-char caractère et flux d'entrée facultatif

Il place le caractère le plus récemment lu depuis le flux d'entrée, sur l'avant du flux d'entrée.

6

peek-char& flux d'entrée optionnel de type peek eof-error-p eof-value recursive-p

Il renvoie le caractère suivant à lire à partir du flux d'entrée, sans le supprimer réellement du flux d'entrée.

sept

listen& flux d'entrée facultatif

Le prédicat listen est vrai s'il y a un caractère immédiatement disponible à partir du flux d'entrée, et est faux dans le cas contraire.

8

read-char-no-hang& flux d'entrée optionnel eof-error-p eof-value recursive-p

C'est similaire à read-char, mais s'il n'obtient pas de caractère, il n'attend pas de caractère, mais renvoie immédiatement nil.

9

clear-input& flux d'entrée facultatif

Il efface toute entrée mise en mémoire tampon associée au flux d' entrée.

dix

read-from-string string & optionnel eof-error-p eof-value & key: start: end: préserver-whitespace

Il prend successivement les caractères de la chaîne et construit un objet LISP et retourne l'objet. Il renvoie également l'index du premier caractère de la chaîne non lu, ou la longueur de la chaîne (ou, longueur +1), selon le cas.

11

parse-integer string & key: start: end: radix: junk-allowed

Il examine la sous-chaîne de chaîne délimitée par: start et: end (par défaut au début et à la fin de la chaîne). Il ignore les caractères d'espacement et tente ensuite d'analyser un entier.

12

read-byte flux d'entrée binaire et valeur eof-error-p eof-value optionnelle

Il lit un octet dans le flux d'entrée binaire et le renvoie sous la forme d'un entier.

Lecture de l'entrée depuis le clavier

le readLa fonction est utilisée pour prendre les entrées du clavier. Cela ne peut prendre aucun argument.

Par exemple, considérez l'extrait de code -

(write ( + 15.0 (read)))

Supposons que l'utilisateur entre 10.2 à partir de l'entrée STDIN, il renvoie,

25.2

La fonction read lit les caractères d'un flux d'entrée et les interprète en les analysant comme des représentations d'objets Lisp.

Exemple

Créez un nouveau fichier de code source nommé main.lisp et tapez le code suivant -

; the function AreaOfCircle
; calculates area of a circle
; when the radius is input from keyboard

(defun AreaOfCircle()
(terpri)
(princ "Enter Radius: ")
(setq radius (read))
(setq area (* 3.1416 radius radius))
(princ "Area: ")
(write area))
(AreaOfCircle)

Lorsque vous exécutez le code, il renvoie le résultat suivant -

Enter Radius: 5 (STDIN Input)
Area: 78.53999

Exemple

Créez un nouveau fichier de code source nommé main.lisp et tapez le code suivant dedans.

(with-input-from-string (stream "Welcome to Tutorials Point!")
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (peek-char nil stream nil 'the-end))
   (values)
)

Lorsque vous exécutez le code, il renvoie le résultat suivant -

#\W 
#\e 
#\l 
#\c 
#\o 
#\m 
#\e 
#\Space 
#\t 
#\o 
#\Space

Les fonctions de sortie

Toutes les fonctions de sortie de LISP prennent un argument facultatif appelé output-stream, où la sortie est envoyée. S'il n'est pas mentionné ou nul, le flux de sortie prend par défaut la valeur de la variable * standard-output *.

Le tableau suivant fournit les fonctions de sortie les plus couramment utilisées de LISP -

N ° Sr. Fonction et description
1

write object & key: stream: escape: radix: base: circle: pretty: level: length: case: gensym: array

write object & key: stream: escape: radix: base: circle: pretty: level: length: case: gensym: array: readably: right-margin: miser-width: lines: pprint-dispatch

Les deux écrivent l'objet dans le flux de sortie spécifié par: stream, qui prend par défaut la valeur de * standard-output *. Les autres valeurs par défaut correspondent aux variables globales correspondantes définies pour l'impression.

2

prin1 objet et flux de sortie facultatif

print objet et flux de sortie facultatif

pprint objet et flux de sortie facultatif

princ objet et flux de sortie facultatif

Toutes ces fonctions sortent la représentation imprimée de l'objet vers le flux de sortie . Cependant, les différences suivantes existent -

  • prin1 renvoie l'objet comme sa valeur.

  • print imprime l'objet avec un retour à la ligne précédent et suivi d'un espace. Il renvoie un objet.

  • pprint est exactement comme print sauf que l'espace de fin est omis.

  • princ est exactement comme prin1 sauf que la sortie n'a pas de caractère d'échappement

3

write-to-string objet & clé : escape: base: base: cercle: joli: niveau: longueur: case: gensym: tableau

write-to-string object & key: escape: radix: base: circle: pretty: level: length: case: gensym: array: readably: right-margin: miser-width: lines: pprint-dispatch

prin1-to-string objet

princ-to-string objet

L'objet est effectivement imprimé et les caractères de sortie sont transformés en une chaîne, qui est renvoyée.

4

write-char caractère et flux de sortie facultatif

Il sort le caractère dans le flux de sortie et renvoie le caractère.

5

write-string chaîne et flux de sortie facultatif et clé: début: fin

Il écrit les caractères de la sous - chaîne spécifiée de chaîne au flux de sortie.

6

write-line chaîne et flux de sortie facultatif et clé: début: fin

Cela fonctionne de la même manière que write-string, mais génère une nouvelle ligne par la suite.

sept

terpri& flux de sortie optionnel

Il génère une nouvelle ligne dans le flux de sortie.

8

fresh-line& flux de sortie optionnel

il génère une nouvelle ligne uniquement si le flux n'est pas déjà au début d'une ligne.

9

finish-output& flux de sortie optionnel

force-output& flux de sortie optionnel

clear-output& flux de sortie optionnel

  • La fonction finish-output tente de s'assurer que toute la sortie envoyée au flux de sortie a atteint sa destination, et retourne alors seulement nil.

  • La fonction force-output lance le vidage de tous les tampons internes mais renvoie nil sans attendre la fin ou l'accusé de réception.

  • La fonction clear-output tente d'annuler toute opération de sortie en cours afin de permettre au moins de sortie possible de continuer vers la destination.

dix

write-byte flux de sortie binaire entier

Il écrit un octet, la valeur de l' entier.

Exemple

Créez un nouveau fichier de code source nommé main.lisp et tapez le code suivant dedans.

; this program inputs a numbers and doubles it
(defun DoubleNumber()
   (terpri)
   (princ "Enter Number : ")
   (setq n1 (read))
   (setq doubled (* 2.0 n1))
   (princ "The Number: ")
   (write n1)
   (terpri)
   (princ "The Number Doubled: ")
   (write doubled)
)
(DoubleNumber)

Lorsque vous exécutez le code, il renvoie le résultat suivant -

Enter Number : 3456.78 (STDIN Input)
The Number: 3456.78
The Number Doubled: 6913.56

Sortie formatée

La fonction formatest utilisé pour produire du texte joliment formaté. Il a la syntaxe suivante -

format destination control-string &rest arguments

où,

  • la destination est la sortie standard
  • control-string contient les caractères à sortir et la directive d'impression.

UNE format directive se compose d'un tilde (~), de paramètres de préfixe optionnels séparés par des virgules, de modificateurs optionnels deux-points (:) et de signe arobase (@), et d'un seul caractère indiquant de quel type de directive il s'agit.

Les paramètres de préfixe sont généralement des entiers, notés comme des nombres décimaux éventuellement signés.

Le tableau suivant fournit une brève description des directives couramment utilisées -

N ° Sr. Directive et description
1

~A

Est suivi d'arguments ASCII.

2

~S

Est suivi d'expressions S.

3

~D

Pour les arguments décimaux.

4

~B

Pour les arguments binaires.

5

~O

Pour les arguments octaux.

6

~X

Pour les arguments hexadécimaux.

sept

~C

Pour les arguments de caractères.

8

~F

Pour les arguments à virgule flottante au format fixe.

9

~E

Arguments à virgule flottante exponentiels.

dix

~$

Arguments dollar et virgule flottante.

11

~%

Une nouvelle ligne est imprimée.

12

~*

L'argument suivant est ignoré.

13

~?

Indirection. L'argument suivant doit être une chaîne et celui qui suit une liste.

Exemple

Réécrivons le programme calculant l'aire d'un cercle -

Créez un nouveau fichier de code source nommé main.lisp et tapez le code suivant dedans.

(defun AreaOfCircle()
   (terpri)
   (princ "Enter Radius: ")
   (setq radius (read))
   (setq area (* 3.1416 radius radius))
   (format t "Radius: = ~F~% Area = ~F" radius area)
)
(AreaOfCircle)

Lorsque vous exécutez le code, il renvoie le résultat suivant -

Enter Radius: 10.234 (STDIN Input)
Radius: = 10.234
Area = 329.03473