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.2
La 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.53999
Esempio
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
#\Space
Le 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.56
Output formattato
La funzione formatviene utilizzato per produrre testo ben formattato. Ha la seguente sintassi:
format destination control-string &rest arguments
dove,
- 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