Read–eval–print loop: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Creata dalla traduzione della pagina "Read–eval–print loop" |
Funzionalità collegamenti suggeriti: 3 collegamenti inseriti. Etichette: Modifica visuale Modifica da mobile Modifica da web per mobile Attività per i nuovi utenti Suggerito: aggiungi collegamenti |
||
(8 versioni intermedie di 8 utenti non mostrate) | |||
Riga 1:
== Panoramica ==
In un REPL, l'utente inserisce una o più espressioni (piuttosto che un'intera [[unità di compilazione]]) e REPL le valuta e visualizza i risultati. Il nome ''read-eval-print loop'' deriva dai nomi delle funzioni primitive [[Lisp]] che implementano questa funzionalità:
* La funzione di '''lettura''' accetta un'espressione dall'utente e la analizza in una [[struttura dati]] in memoria. Ad esempio, l'utente può inserire l'[[s-expression]]
* La funzione [[eval]] prende questa struttura interna dei dati e la valuta. In Lisp, la valutazione di un's-expression che inizia con il nome di una funzione significa chiamare quella funzione sugli argomenti che costituiscono il resto dell'espressione. Quindi la funzione
* La funzione di '''stampa''' prende il risultato ottenuto da'' eval'' e lo stampa all'utente. Se è un'espressione complessa, potrebbe essere [[pretty-printed]] per renderne più facile la comprensione. In questo esempio, però, il numero
L'ambiente di sviluppo ritorna quindi allo stato di lettura, creando un
REPLs facilitano la [[programmazione esplorativa]] e il [[debugging]] perché il programmatore può ispezionare il risultato stampato prima di decidere quale espressione fornire per la prossima lettura. Il ciclo read-eval-print loop coinvolge il programmatore più frequentemente rispetto al classico ciclo edit-compile-run-debug.
Poiché la funzione di ''stampa'' viene emessa nello stesso formato testuale utilizzato dalla funzione di lettura per l'input, la maggior parte dei risultati viene stampata in una forma che potrebbe (se è utile) essere copiata e incollata nel REPL. Tuttavia, a volte è necessario stampare rappresentazioni di elementi che non possono essere letti in modo sensibile, come un handle di socket o un'istanza di classe complessa. In questi casi, deve esistere una sintassi per gli oggetti illeggibili. In Python, è la
I REPLs possono essere creati per supportare qualsiasi linguaggio basato su testo. Il supporto REPL per i linguaggi compilati viene in genere ottenuto implementando un interprete su una macchina virtuale che fornisce un'interfaccia al compilatore. Ad esempio, a partire da JDK 9, [[Java (linguaggio di programmazione)|Java]] ha incluso [[JShell]] come interfaccia a riga di comando per il linguaggio. Vari altri linguaggi dispongono di strumenti di terze parti disponibili per il download che forniscono un'interazione shell simile con il linguaggio.
== Uso ==
L'uso più comune dei REPL al di fuori delle shell del sistema operativo è la [[prototipazione]] istantanea. Altri usi includono il calcolo matematico, la creazione di documenti che integrano l'analisi scientifica (ad esempio [[
Un REPL può diventare una parte essenziale dell'apprendimento di una nuova lingua in quanto fornisce un rapido riscontro al novizio.
Riga 28 ⟶ 27:
=== Implementazione ===
Per implementare un Lisp REPL, è necessario solo implementare queste tre funzioni e una funzione a [[loop infinito]]. (Naturalmente, l'implementazione di eval sarà complicata, poiché deve anche implementare tutte le funzioni primitive come [[Car e cdr|car]] e + e operatori speciali come ''if''.) Ciò fatto, un REPL di base non è altro che una singola riga di codice:
<
=== Funzionalità ===
Riga 34 ⟶ 33:
* Storia di input e output.
* Le variabili sono impostate per le espressioni di input e i risultati. Queste variabili sono anche disponibili in REPL. Ad esempio in Common Lisp * si riferisce all'ultimo risultato, ** e *** ai risultati precedenti.
* Livelli di REPL. In molti sistemi Lisp se si verifica un errore durante la lettura, la valutazione o [[La Stampa|la stampa]] di un'espressione, il sistema non viene riportato al livello superiore con un messaggio di errore. Invece, nel nuovo REPL, di livello più profondo, viene avviato nel contesto dell'errore. L'utente può quindi ispezionare il problema, correggerlo e continuare, se possibile. Se si verifica un errore come un REPL debug, viene avviato un altro REPL, di nuovo un livello più profondo. Spesso REPL offre speciali comandi di debug.
* [[Gestione degli errori]]. Il REPL fornisce riavvii. Questi riavvii possono essere utilizzati, quando si verifica un errore, per tornare a un determinato livello REPL.
* Ingresso sensibile al [[
* Elaborazione di input e completamento specifico del contesto su simboli, nomi di percorsi, nomi di classi e altri oggetti.
* Guida e documentazione per i comandi.
* [[Variabile (informatica)|Variabili]] per controllare il lettore. Ad esempio, i controlli della variabile * read-base * in cui i numeri di base vengono letti per impostazione predefinita.
* Variabili per controllare la stampante. Esempio: lunghezza massima o massima profondità delle espressioni da stampare.
* Sintassi del comando aggiuntiva. Alcuni REPL hanno comandi che non seguono la sintassi dell's-expression, ma spesso funzionano con dati Lisp come argomenti.
* REPL grafici. Alcuni Lisp REPL (il Listener CLIM è un esempio) accettano anche input e output grafici.
== Note ==
<references />
== Collegamenti
* Paul Graham has written a [http://www.paulgraham.com/rootsoflisp.html description of a REPL implementation] in Common Lisp.
* Joël Franusic [http://joel.franusic.com/Online-REPs-and-REPLs Online-REPs-and-REPLs list]
* [
[[Categoria:Software di shell]]
[[Categoria:Interpreti]]
|