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:
|
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
|
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