Read–eval–print loop: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
DaimonBot (discussione | contributi)
m Conversione url nudo in cita web, formattazioni nei Cita, fix sezioni e template di compatibilità, fix minori. Vedi PU per dettagli
Funzionalità collegamenti suggeriti: 3 collegamenti inseriti.
 
(5 versioni intermedie di 5 utenti non mostrate)
Riga 1:
AUn '''Read–Eval–Print Loop''' ('''REPL'''), noto anche come un '''interactive toplevel''' o '''linguaggio shell''', è un ambiente di [[Programmazione (informatica)|programmazione]] semplice e interattivo che accetta input da parte di un singolo utente (vale a dire singole espressioni), li valuta e restituisce il risultato all'utente; un programma scritto in un ambiente REPL viene eseguito a tratti. Il termine è solitamente usato per riferirsi a interfacce di programmazione simili al classico ambiente interattivo della [[macchina Lisp]]. Esempi comuni includono [[Shell (informatica)|shell]] a [[riga di comando]] e ambienti simili per i [[linguaggi di programmazione]] ed è una particolare caratteristica dei [[Scripting|linguaggi di scripting]].<ref>{{Cita libro|ISBN=978-1-31612322-5}}Parametro <code style="color:red;">titolo</coderef> vuoto o mancante ([[Discussioni modulo:Citazione/Aiuto#citation missing title|aiuto]])
[[Categoria:Errori del modulo citazione - citazioni senza titolo]]</ref>
 
== 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]] <code>(+ 1 2 3)</code>, che viene analizzato in una lista collegata contenente quattro elementi di dati.
* 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 <code>+</code> è chiamata sugli argomenti <code>1 2 3</code>, restituendo il risultato <code>6</code>.
* 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 <code>6</code> non ha bisogno di molta formattazione per stampare.
Riga 18 ⟶ 17:
 
== Uso ==
Come uno [[Shell (informatica)|shell]], un ambiente REPL consente agli utenti di accedere alle funzionalità rilevanti di un sistema operativo, oltre a fornire accesso alle funzionalità di programmazione.
 
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 [[IPython]]), la manutenzione del software interattivo, il [[Benchmark (informatica)|benchmarking]] e l'esplorazione dell'algoritmo.
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:
<sourcesyntaxhighlight lang="lisp">(loop (print (eval (read))))</sourcesyntaxhighlight>Una possibile implementazione di eval è come un [[interprete ricorsivo]] che agisce sull'[[Abstract syntax tree]] creato da ''read''. Un'altra possibilità è compilare l'albero di sintassi in [[codice macchina]] ed eseguirlo.
 
=== Funzionalità ===
Riga 35 ⟶ 34:
* 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 [[mouse]] e output di oggetti dati.
Riga 52 ⟶ 51:
* 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]
* [httphttps://repl.it/ repl.it] is a client-side web REPL for various programming languages.
[[Categoria:Software di shell]]
[[Categoria:Interpreti]]