LISP - Entrada y salida

Common LISP proporciona numerosas funciones de entrada y salida. Ya hemos utilizado la función de formato y la función de impresión para la salida. En esta sección, veremos algunas de las funciones de entrada-salida más comúnmente utilizadas proporcionadas en LISP.

Funciones de entrada

La siguiente tabla proporciona las funciones de entrada de LISP más utilizadas:

No Señor. Función descriptiva
1

read& flujo de entrada opcional eof-error-p eof-value recursive-p

Lee la representación impresa de un objeto Lisp de input-stream, construye un objeto Lisp correspondiente y devuelve el objeto.

2

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

Se utiliza en algunas situaciones especializadas en las que es deseable determinar con precisión qué carácter terminó el token extendido.

3

read-line& flujo de entrada opcional eof-error-p eof-value recursive-p

Lee en una línea de texto terminada por una nueva línea.

4

read-char& flujo de entrada opcional eof-error-p eof-value recursive-p

Toma un carácter de input-stream y lo devuelve como un objeto de carácter.

5

unread-char carácter y flujo de entrada opcional

Coloca el carácter leído más recientemente del flujo de entrada, al frente del flujo de entrada.

6

peek-char& flujo de entrada de tipo peek opcional eof-error-p eof-value recursive-p

Devuelve el siguiente carácter que se leerá del flujo de entrada, sin eliminarlo realmente del flujo de entrada.

7

listen& flujo de entrada opcional

El predicado listen es verdadero si hay un carácter inmediatamente disponible desde input-stream, y es falso si no.

8

read-char-no-hang& flujo de entrada opcional eof-error-p eof-value recursive-p

Esto es similar a read-char, pero si no obtiene un carácter, no espera un carácter, sino que devuelve nil inmediatamente.

9

clear-input& flujo de entrada opcional

Borra cualquier entrada almacenada en búfer asociada con input-stream.

10

read-from-string string & opcional eof-error-p eof-value & key: start: end: preserve-whitespace

Toma los caracteres de la cadena sucesivamente y construye un objeto LISP y devuelve el objeto. También devuelve el índice del primer carácter de la cadena no leída, o la longitud de la cadena (o, longitud +1), según sea el caso.

11

parse-integer cadena y clave: inicio: fin: base: basura permitida

Examina la subcadena de la cadena delimitada por: inicio y: fin (por defecto al principio y al final de la cadena). Omite los caracteres de espacio en blanco y luego intenta analizar un número entero.

12

read-byte flujo de entrada binaria y valor eof-error-p opcional

Lee un byte del flujo de entrada binario y lo devuelve en forma de entero.

Leer entrada desde el teclado

los readLa función se utiliza para recibir entradas desde el teclado. Puede que no necesite ningún argumento.

Por ejemplo, considere el fragmento de código:

(write ( + 15.0 (read)))

Suponga que el usuario ingresa 10.2 desde la entrada STDIN, regresa,

25.2

La función de lectura lee caracteres de un flujo de entrada y los interpreta analizándolos como representaciones de objetos Lisp.

Ejemplo

Cree un nuevo archivo de código fuente llamado main.lisp y escriba el siguiente código en él:

; 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)

Cuando ejecuta el código, devuelve el siguiente resultado:

Enter Radius: 5 (STDIN Input)
Area: 78.53999

Ejemplo

Cree un nuevo archivo de código fuente llamado main.lisp y escriba el siguiente código en él.

(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)
)

Cuando ejecuta el código, devuelve el siguiente resultado:

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

Las funciones de salida

Todas las funciones de salida en LISP toman un argumento opcional llamado flujo de salida, donde se envía la salida. Si no se menciona o es nulo, output-stream toma por defecto el valor de la variable * standard-output *.

La siguiente tabla proporciona las funciones de salida de LISP más utilizadas:

No Señor. Función y descripción
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: legible: right-margin: miser-width: lines: pprint-dispatch

Ambos escriben el objeto en el flujo de salida especificado por: flujo, que por defecto tiene el valor de * salida-estándar *. Otros valores predeterminados para las variables globales correspondientes configuradas para la impresión.

2

prin1 objeto y flujo de salida opcional

print objeto y flujo de salida opcional

pprint objeto y flujo de salida opcional

princ objeto y flujo de salida opcional

Todas estas funciones generan la representación impresa del objeto en el flujo de salida . Sin embargo, existen las siguientes diferencias:

  • prin1 devuelve el objeto como su valor.

  • print imprime el objeto con una nueva línea anterior y seguido de un espacio. Devuelve objeto.

  • pprint es como print excepto que se omite el espacio final.

  • princ es como prin1 excepto que la salida no tiene carácter de escape

3

write-to-string object & key : escape: radix: base: circle: pretty: level: length: case: gensym: array

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

prin1-to-string objeto

princ-to-string objeto

El objeto se imprime eficazmente y los caracteres de salida se convierten en una cadena, que se devuelve.

4

write-char carácter y flujo de salida opcional

Envía el carácter al flujo de salida y devuelve el carácter.

5

write-string cadena y flujo de salida opcional y clave: inicio: fin

Escribe los caracteres de la subcadena especificada de cadena en el flujo de salida.

6

write-line cadena y flujo de salida opcional y clave: inicio: fin

Funciona de la misma manera que write-string, pero luego genera una nueva línea.

7

terpriy flujo de salida opcional

Genera una nueva línea en el flujo de salida.

8

fresh-liney flujo de salida opcional

genera una nueva línea solo si la secuencia no está ya al comienzo de una línea.

9

finish-outputy flujo de salida opcional

force-outputy flujo de salida opcional

clear-outputy flujo de salida opcional

  • La función finish-output intenta asegurarse de que toda la salida enviada a output-stream haya llegado a su destino, y solo entonces devuelve nil.

  • La función force-output inicia el vaciado de los búferes internos pero devuelve nil sin esperar a que se complete o acuse de recibo.

  • La función clear-output intenta abortar cualquier operación de salida pendiente en progreso para permitir que la menor salida posible continúe hacia el destino.

10

write-byte flujo de salida binario entero

Escribe un byte, el valor del entero.

Ejemplo

Cree un nuevo archivo de código fuente llamado main.lisp y escriba el siguiente código en él.

; 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)

Cuando ejecuta el código, devuelve el siguiente resultado:

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

Salida formateada

La función formatse utiliza para producir texto con un formato agradable. Tiene la siguiente sintaxis:

format destination control-string &rest arguments

dónde,

  • el destino es salida estándar
  • cadena de control contiene los caracteres que se van a generar y la directiva de impresión.

UN format directive consta de una tilde (~), parámetros de prefijo opcionales separados por comas, dos puntos opcionales (:) y modificadores de signo de arroba (@), y un solo carácter que indica qué tipo de directiva es esta.

Los parámetros de prefijo son generalmente números enteros, anotados como números decimales con signo opcional.

La siguiente tabla proporciona una breve descripción de las directivas de uso común:

No Señor. Directiva y descripción
1

~A

Va seguido de argumentos ASCII.

2

~S

Va seguido de expresiones S.

3

~D

Para argumentos decimales.

4

~B

Para argumentos binarios.

5

~O

Para argumentos octales.

6

~X

Para argumentos hexadecimales.

7

~C

Para argumentos de personajes.

8

~F

Para argumentos de punto flotante de formato fijo.

9

~E

Argumentos exponenciales de punto flotante.

10

~$

Argumentos del dólar y del punto flotante.

11

~%

Se imprime una nueva línea.

12

~*

El siguiente argumento se ignora.

13

~?

Indirección. El siguiente argumento debe ser una cadena y el siguiente una lista.

Ejemplo

Reescribamos el programa calculando el área de un círculo -

Cree un nuevo archivo de código fuente llamado main.lisp y escriba el siguiente código en él.

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

Cuando ejecuta el código, devuelve el siguiente resultado:

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