Entrada y salida en LISP

Prerrequisitos: Introducción a LISP

Lisp proporciona un gran conjunto de facilidades para realizar entrada/salida. Todas las operaciones de entrada/salida se realizan sobre flujos de varios tipos. Si bien es posible leer y escribir datos binarios, la mayoría de los métodos de entrada/salida de Common Lisp leen o escriben caracteres. Para leer y escribir caracteres individuales o líneas de datos, existen primitivas sencillas. Sin embargo, leer y escribir representaciones escritas de cualquier objeto Lisp arbitrario es la operación de entrada/salida más útil.

Objetos ceceo:

Los objetos Lisp suelen ser estructuras de datos complejas en lugar de strings de texto. Se diferencian de las strings de texto en términos de atributos debido a cómo se representan internamente. Sin embargo, Lisp ofrece una representación de la mayoría de los objetos en forma de texto escrito, conocida como representación impresa, que se utiliza para las funciones de E/S. Esto hace posible acceder y discutir objetos Lisp.

Los caracteres de la representación impresa de un objeto Lisp se transmiten a un flujo a través de funciones como imprimir. La impresora (Lisp) es un grupo de funciones que logra esto. El lector (Lisp) es un grupo de rutinas que realiza la función de lectura, que acepta caracteres de un flujo, los interpreta como una representación impresa de un objeto Lisp, crea ese objeto y lo devuelve.

Funciones de entrada:

Las funciones de entrada se dividen en dos categorías: las que funcionan con flujos de caracteres y las que funcionan con flujos binarios.

Entrada de secuencias de caracteres:

Hay muchos argumentos opcionales en las funciones de entrada de caracteres llamados input-stream, eof-error-p y eof-value. El argumento flujo de entrada es el flujo desde el cual recopilar la entrada; si no se especifica o es nulo, el valor predeterminado es el de la variable especial ‘entrada estándar’. El parámetro eof-error-p controla lo que sucede si la entrada es de un archivo y se llega al final del archivo. Si eof-error-p es verdadero, que es el valor predeterminado, se indicará un error al final del archivo. Si es falso, entonces no se encuentra ningún error y, en su lugar, la función devuelve eof-value.

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

  • Construye un objeto Lisp correspondiente basado en la representación escrita de un objeto Lisp leído del flujo de entrada y luego devuelve el objeto.

línea de lectura & flujo de entrada opcional eof-error-p eof-value recursive-p 

  • read-line inserta una línea de texto que ha sido separada por una nueva línea. La línea se devuelve como una string de caracteres (sin el carácter de nueva línea). Esta función se usa típicamente para obtener una línea de entrada del usuario. Un indicador que es verdadero si el final del archivo finalizó la línea (no vacía) o falso si la línea finalizó correctamente es el segundo valor que se devuelve.

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

  • Se toma un carácter del flujo de entrada y read-char lo devuelve como un objeto de carácter.

carácter de caracteres no leídos y flujo de entrada opcional 

  • El carácter se mueve al frente del flujo de entrada por unread-char. El carácter debe coincidir con el que se acaba de leer del flujo de entrada. La próxima vez que se lea un carácter del flujo de entrada, será el carácter especificado seguido del contenido anterior del flujo de entrada porque el flujo de entrada «hace una copia de seguridad» sobre este carácter. Unread-char devuelve cero.

lectura-conservación-de-espacios-en-blanco &opcional en flujo eof-error-p eof-value recursive-p

  • Cuando es necesario saber con precisión qué carácter finalizó el token extendido, se ofrece la función read-preserving-whitespace.

char de lista delimitada de lectura & flujo de entrada opcional recursivo-p

  • Esto lee objetos de la transmisión hasta que el siguiente carácter es un carácter (sin tener en cuenta los espacios en blanco y los comentarios). Devuelve una lista de los elementos leídos.

peek-char &opcional peek-type input-stream eof-error-p eof-value recursive-p 

  • El tipo de peek, que tiene un valor predeterminado de nil, determina qué realiza peek-char. Sin eliminar realmente el carácter del flujo de entrada, peek-char devuelve el siguiente carácter que se leerá del flujo de entrada cuando el tipo de vista es nulo. El carácter permanecerá cuando la entrada del flujo de entrada se vuelva a realizar más tarde. Parece como si read-char y unread-char se llamaran de forma consecutiva.

escucha y flujo de entrada opcional 

  • Cuando un carácter está disponible instantáneamente desde el flujo de entrada, el predicado de escucha es verdadero; de lo contrario, es falso. Esto es especialmente útil cuando la secuencia obtiene sus caracteres de un teclado u otro dispositivo interactivo.

read-char-no-hang &opcional input-stream eof-error-p eof-value recursive-p 

  • Es similar a read-char, pero en lugar de esperar un carácter si no lo recibe, devuelve nil de inmediato.

entrada clara y flujo de entrada opcional

  • Al hacer esto, se borra la entrada almacenada en búfer de la secuencia relacionada con la entrada. Cuando se produce un error asíncrono, es más útil para borrar la escritura anticipada de los teclados. Si la transmisión en cuestión no tiene sentido para esta operación, la entrada clara no tiene efecto. La entrada de compensación produce cero.

lectura de string string &opción eof-error-p eof-value &key :start :end :preserve-whitespace

  • Genera un objeto LISP a partir de los caracteres de la string de uno en uno y luego devuelve el objeto. Además, devuelve la longitud de la string (o longitud + 1), o el índice del primer carácter de la string que no se leyó.

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

  • Examina la parte de la string que está delimitada por el inicio y el final (por defecto, al principio y al final de la string). Los caracteres de espacio en blanco se omiten antes de intentar analizar un entero.

Ejemplo :

Lisp

;LISP- Input 
(with-input-from-string (stream "Geeks for Geeks welcomes you!")
   (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)
)

Producción :

 

Entrada de flujos binarios:

flujo de entrada binaria de bytes de lectura y valor de eof-error-p opcional 

  • read-byte extrae un byte del flujo de entrada binario y lo devuelve como un número entero.

Entrada de lectura desde el teclado:

La función de lectura en Common Lisp permite la entrada de teclado. Puede que no tome ningún parámetro. Los caracteres se leen de un flujo de entrada y se analizan en representaciones de objetos Lisp.

Sintaxis:

(setq varname ( leer ))

Esta declaración tomará la entrada del teclado y la almacenará en la variable.

Ejemplo:

Lisp

; Lisp program to demonstrate 
; use of read function
; Program inputs value of radius from
; keyboard and calculates the perimeter of circle
  
(defun PerimOfCircle()
(terpri)
(princ "Enter Radius: ")
(setq radius (read))
(setq perimeter (* 2 3.1416 radius))
(princ "Perimeter: ")
(write perimeter))
(PerimOfCircle)

Producción:

 

Funciones de salida:

Las funciones de salida se dividen en dos categorías: las que funcionan con flujos de caracteres y las que funcionan con flujos binarios. Debido a su extrema complejidad, el formato de la función, que opera en flujos de caracteres, se analiza en una sección separada de las demás funciones de salida de caracteres.

Salida a secuencias de caracteres:

Cada una de estas rutinas acepta un argumento opcional llamado flujo de salida que especifica dónde se debe enviar la salida. El flujo de salida tiene por defecto el valor de la variable «salida estándar» si no se especifica o es nulo. Se utiliza el valor de la variable “terminal-io” si el valor es t.

escribir objeto &clave :stream :escape :radix :base :circle :bonita :level :length :case :gensym :array

escribir objeto y clave: corriente: escape: raíz: base: círculo: bonito: nivel: longitud: caso: gensym: array: legible: margen derecho: ancho de avaro: líneas: pprint-dispatch

  • El flujo de salida designado por: flujo, que por defecto tiene el valor de «salida estándar», recibe la versión impresa del objeto.

objeto prin1 & flujo de salida opcional objeto de
impresión & flujo de salida opcional objeto
pprint & flujo de salida opcional objeto
princ & flujo de salida opcional

  • prin1 envía la representación impresa de un objeto al flujo de salida. Cuando es necesario, se utilizan caracteres de escape.
  • Print es idéntico a prin1, con la excepción de que se usa una nueva línea y un espacio para separar la representación impresa de un elemento. print genera el objeto.
  • Para proporcionar una salida «hermosa», el objeto se imprime con el indicador «imprimir-bonito» establecido en no nulo cuando se usa pprint en lugar de imprimir. pprint no da resultados.
  • Excepto por la ausencia de caracteres de escape en la salida, princ es idéntico a prin1. Devuelve el objeto como el valor.

objeto de escritura en string &clave :escape :radix :base :circle :bonita :nivel :longitud :case :gensym :array
prin1-to-string object
princ-to-string object

  • El objeto se imprime efectivamente y se crea una string a partir de los caracteres de salida y se devuelve.

carácter write-char & flujo de salida opcional

  • write-char escribe el carácter en el flujo de salida y devuelve el carácter.

string de escritura string y flujo de salida opcional y clave: inicio: final

  • La salida del comando write-string transmite los caracteres de la substring de string proporcionada. Una substring de una string está delimitada por los parámetros: inicio y: final de una manera típica.

Terpri & flujo de salida opcional Fresh
-Line & flujo de salida opcional

  • La función terpri envía una nueva línea al flujo de salida. Sin embargo, terpri siempre devuelve nil, a diferencia de (write-char #Newline output-stream), que tiene un efecto equivalente.
  • Similar a terpri, fresh-line solo genera una nueva línea si la transmisión no está ya al comienzo de una línea.

Salida final y flujo de salida opcional Salida forzada y flujo
de salida opcional Salida
clara y flujo de salida opcional

  • La función finish-output intenta asegurarse de que toda la salida enviada al flujo de salida haya llegado a su destino, y solo entonces devuelve cero.
  • La función force-output inicia la limpieza de cualquier búfer interno, 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 curso para permitir que la salida más pequeña posible continúe hasta el destino.

Ejemplo :

Lisp

; Lisp program to show output functions
; Program to double a number
  
  
(defun DoubledNumber()
   (terpri)
   (princ "Enter the Number : ")
   (setq n1 (read))
   (setq double (* 2.0 n1))
   (princ "The number is: ")
   (write n1)
   (terpri)
   (princ "The doubled number is: ")
   (write double)
)
(DoubledNumber)

Producción :

 

Salida a flujos binarios:

escritura-byte entero flujo-de-salida-binario

  • write-byte genera un valor entero de un byte. Si el número entero no se ajusta a la descripción proporcionada como argumento de ‘tipo de elemento’ para abrir cuando se estableció la secuencia, es un error. El resultado es un valor entero.

Salida formateada:

El formato de la función es muy útil para crear texto bien formateado, mensajes atractivos y otras cosas. Se puede producir una secuencia o una string por formato.

Sintaxis:

formato de string de control de destino y argumentos de descanso

La salida estándar es el destino de la sintaxis, mientras que la variable de string de control contiene los caracteres que se emitirán junto con la instrucción de impresión.

Con la excepción de la tilde (~), que comienza una directiva, el formato genera los caracteres de la string de control. Se especifica mediante el carácter que sigue a la tilde, que puede ir seguido de parámetros y modificadores de prefijo. Una tilde (~), parámetros de prefijo opcionales separados por comas, dos puntos opcionales (:) y modificadores de arroba (@), y un solo carácter que designa el tipo de directiva que se trata de una directiva de formato.

Por lo general, los parámetros de prefijo son números enteros con notación decimal firmada opcionalmente.

La siguiente tabla tabula algunas de las directivas comúnmente utilizadas con sus descripciones:

Directiva Descripción
~A seguido de argumentos ASCII.
~ S seguido de expresiones S.
~B Para argumentos binarios.
~C Para argumentos de carácter.
~D Para argumentos decimales.
~E Argumentos de punto flotante exponencial.
~F Para argumentos de punto flotante de formato fijo.
~ O Para argumentos octales.
~ X Para argumentos hexadecimales.
~$ Argumentos de dólar y punto flotante.
~% Se imprime una nueva línea.
~* El siguiente argumento es ignorado.
~? Indirección. El siguiente argumento debe ser una string y el siguiente una lista.
~T Tabular. Este espacio sobre una columna dada.

Ejemplo :

Lisp

;Lisp program to show format function
  
(defun PerimOfCircle()
   (terpri)
   (princ "Enter Radius: ")
   (setq radius (read))
   (setq Perimeter (* 2 3.1416 radius))
   (format t "Radius: = ~F~% Perimeter = ~F" radius Perimeter)
)
(PerimOfCircle)

Producción :

 

Publicación traducida automáticamente

Artículo escrito por himanshu77deer y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *