LISP - Ingresso e uscita
Common LISP fornisce numerose funzioni di input-output. Abbiamo già utilizzato la funzione di formattazione e la funzione di stampa per l'output. In questa sezione, esamineremo alcune delle funzioni di input-output più comunemente utilizzate fornite in LISP.
Funzioni di input
La tabella seguente fornisce le funzioni di input più comunemente utilizzate di LISP:
| Sr.No. | Descrizione della funzione | 
|---|---|
| 1 | read& input-stream opzionale eof-error-p eof-value ricorsivo-p Legge la rappresentazione stampata di un oggetto Lisp da input-stream, costruisce un oggetto Lisp corrispondente e restituisce l'oggetto. | 
| 2 | read-preserving-whitespace& opzionale in-stream eof-error-p eof-value recursive-p Viene utilizzato in alcune situazioni specializzate in cui è desiderabile determinare con precisione quale carattere ha terminato il token esteso. | 
| 3 | read-line& input-stream opzionale eof-error-p eof-value ricorsivo-p Si legge in una riga di testo terminata da una nuova riga. | 
| 4 | read-char& input-stream opzionale eof-error-p eof-value ricorsivo-p Prende un carattere da input-stream e lo restituisce come oggetto carattere. | 
| 5 | unread-char carattere e flusso di input opzionale Mette il carattere letto più di recente dal flusso di input, sulla parte anteriore del flusso di input. | 
| 6 | peek-char& input-stream di tipo peek opzionale eof-error-p eof-value ricorsivo-p Restituisce il carattere successivo da leggere dal flusso di input, senza rimuoverlo effettivamente dal flusso di input. | 
| 7 | listen& flusso di input opzionale Il predicato listen è vero se c'è un carattere immediatamente disponibile da input-stream, ed è falso in caso contrario. | 
| 8 | read-char-no-hang& input-stream opzionale eof-error-p eof-value ricorsivo-p È simile a read-char, ma se non ottiene un carattere, non attende un carattere, ma restituisce immediatamente zero. | 
| 9 | clear-input& flusso di input opzionale Cancella qualsiasi input bufferizzato associato a input-stream. | 
| 10 | read-from-string stringa e opzionale eof-error-p eof-valore e chiave: inizio: fine: conserva-spazi Prende i caratteri della stringa in successione e costruisce un oggetto LISP e restituisce l'oggetto. Restituisce anche l'indice del primo carattere della stringa non letta, o la lunghezza della stringa (o, lunghezza +1), a seconda dei casi. | 
| 11 | parse-integer stringa e chiave: inizio: fine: radix: junk-consentita Esamina la sottostringa della stringa delimitata da: start e: end (impostazione predefinita all'inizio e alla fine della stringa). Salta i caratteri di spazio bianco e quindi tenta di analizzare un numero intero. | 
| 12 | read-byte binary-input-stream e opzionale eof-error-p eof-value Legge un byte dal flusso di input binario e lo restituisce sotto forma di numero intero. | 
Lettura dell'input dalla tastiera
Il readviene utilizzata per ricevere input dalla tastiera. Potrebbe non essere necessario alcun argomento.
Ad esempio, considera lo snippet di codice:
(write ( + 15.0 (read)))Supponiamo che l'utente inserisca 10.2 dall'ingresso STDIN, ritorna,
25.2La funzione di lettura legge i caratteri da un flusso di input e li interpreta analizzandoli come rappresentazioni di oggetti Lisp.
Esempio
Crea un nuovo file di codice sorgente denominato main.lisp e digita il seguente codice in esso -
; 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)Quando esegui il codice, restituisce il seguente risultato:
Enter Radius: 5 (STDIN Input)
Area: 78.53999Esempio
Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente.
(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)
)Quando esegui il codice, restituisce il seguente risultato:
#\W 
#\e 
#\l 
#\c 
#\o 
#\m 
#\e 
#\Space 
#\t 
#\o 
#\SpaceLe funzioni di output
Tutte le funzioni di output in LISP accettano un argomento opzionale chiamato output-stream, dove viene inviato l'output. Se non è menzionato o è nullo, output-stream utilizza per impostazione predefinita il valore della variabile * standard-output *.
La tabella seguente fornisce le funzioni di output più comunemente utilizzate di LISP:
| Sr.No. | Funzione e descrizione | 
|---|---|
| 1 | write oggetto e chiave: stream: escape: radix: base: circle: pretty: level: length: case: gensym: array write oggetto e chiave: stream: escape: radix: base: circle: pretty: level: length: case: gensym: array: readably: right-margin: miser-width: lines: pprint-dispatch Entrambi scrivono l'oggetto nel flusso di output specificato da: stream, il cui valore predefinito è * standard-output *. Gli altri valori vengono impostati di default sulle variabili globali corrispondenti impostate per la stampa. | 
| 2 | prin1 oggetto e flusso di output opzionale print oggetto e flusso di output opzionale pprint oggetto e flusso di output opzionale princ oggetto e flusso di output opzionale Tutte queste funzioni restituiscono la rappresentazione stampata dell'oggetto in output-stream . Tuttavia, ci sono le seguenti differenze: 
 | 
| 3 | write-to-string oggetto e chiave : escape: radix: base: circle: pretty: level: length: case: gensym: array write-to-string oggetto e chiave: escape: radix: base: circle: pretty: level: length: case: gensym: array: readably: right-margin: miser-width: lines: pprint-dispatch prin1-to-string oggetto princ-to-string oggetto L'oggetto viene effettivamente stampato ei caratteri di output vengono trasformati in una stringa, che viene restituita. | 
| 4 | write-char carattere e flusso di output opzionale Emette il carattere nel flusso di output e restituisce il carattere. | 
| 5 | write-string stringa e flusso di output opzionale e chiave: inizio: fine Scrive i caratteri della sottostringa di stringa specificata nel flusso di output. | 
| 6 | write-line stringa e flusso di output opzionale e chiave: inizio: fine Funziona allo stesso modo di write-string, ma in seguito genera una nuova riga. | 
| 7 | terpri& flusso di output opzionale Emette una nuova riga in output-stream. | 
| 8 | fresh-line& flusso di output opzionale emette una nuova riga solo se il flusso non è già all'inizio di una riga. | 
| 9 | finish-output& flusso di output opzionale force-output& flusso di output opzionale clear-output& flusso di output opzionale 
 | 
| 10 | write-byte flusso di output binario intero Scrive un byte, il valore dell'intero. | 
Esempio
Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente.
; 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)Quando esegui il codice, restituisce il seguente risultato:
Enter Number : 3456.78 (STDIN Input)
The Number: 3456.78
The Number Doubled: 6913.56Output formattato
La funzione formatviene utilizzato per produrre testo ben formattato. Ha la seguente sintassi:
format destination control-string &rest argumentsdove,
- la destinazione è lo standard output
- stringa di controllo contiene i caratteri da visualizzare e la direttiva di stampa.
UN format directive consiste in una tilde (~), parametri di prefisso opzionali separati da virgole, modificatori opzionali di due punti (:) e segno (@) e un singolo carattere che indica che tipo di direttiva si tratta.
I parametri del prefisso sono generalmente numeri interi, annotati come numeri decimali con segno facoltativo.
La tabella seguente fornisce una breve descrizione delle direttive comunemente utilizzate:
| Sr.No. | Direttiva e descrizione | 
|---|---|
| 1 | ~A È seguito da argomenti ASCII. | 
| 2 | ~S È seguito da espressioni S. | 
| 3 | ~D Per argomenti decimali. | 
| 4 | ~B Per argomenti binari. | 
| 5 | ~O Per argomenti ottali. | 
| 6 | ~X Per argomenti esadecimali. | 
| 7 | ~C Per argomenti di carattere. | 
| 8 | ~F Per argomenti in virgola mobile in formato fisso. | 
| 9 | ~E Argomenti in virgola mobile esponenziale. | 
| 10 | ~$ Dollaro e argomenti in virgola mobile. | 
| 11 | ~% Viene stampata una nuova riga. | 
| 12 | ~* L'argomento successivo viene ignorato. | 
| 13 | ~? Indiretto. L'argomento successivo deve essere una stringa e quello dopo un elenco. | 
Esempio
Riscriviamo il programma calcolando l'area di un cerchio -
Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente.
(defun AreaOfCircle()
   (terpri)
   (princ "Enter Radius: ")
   (setq radius (read))
   (setq area (* 3.1416 radius radius))
   (format t "Radius: = ~F~% Area = ~F" radius area)
)
(AreaOfCircle)Quando esegui il codice, restituisce il seguente risultato:
Enter Radius: 10.234 (STDIN Input)
Radius: = 10.234
Area = 329.03473