Differenza tra REPL e shell interattiva


37

Domanda Noob. Non sono in grado di dire la differenza tra una REPL e una shell interattiva semplicemente leggendo le definizioni su Wikipedia.

Wiki osserva che REPL è un particolare tipo di shell linguistica interattiva. È un sottoinsieme corretto però? La definizione di Wiki sembra limitare la terminologia REPL a linguaggi simili a Lisp, mentre le proprietà dichiarate non contengono realmente alcuna caratteristica distintiva.

In particolare, sarebbe corretto chiamare IPython un REPL?

Risposte:


24

REPL: questa è una procedura che esegue semplicemente il loop, accetta un comando alla volta, eseguendolo e stampando il risultato.

I tre passaggi di ciascuna iterazione del loop sono:

  1. Chiamando read per leggere i caratteri che compongono un'espressione testuale dal buffer di input della tastiera e costruire una struttura di dati per rappresentarla,
  2. Chiamare eval per valutare l'espressione - intuitivamente, eval "capisce cosa significa l'espressione" e "fa ciò che dice di fare", restituendo il valore dell'espressione - e
  3. Chiamando write per stampare una rappresentazione testuale del risultante da eval, in modo che l'utente possa vederlo.

Puoi scrivere il tuo ciclo read-eval-print per i tuoi programmi, in modo che gli utenti possano digitare espressioni e interpretarle come preferisci. Puoi avviare il tuo ciclo read-eval-print (digitando (rep-loop)), e prenderà il posto del normale ciclo read-eval-print dello Schema, interpretando le espressioni a modo tuo.

Ecco un semplice ciclo read-eval-print:

  (define (rep-loop)
  (display "repl>")      ; print a prompt
  (write (eval (read)))  ; read expr., pass to eval, write result
  (rep-loop))            ; loop (tail-recursive call) to do it again

Si noti che l'espressione (write (eval (read))) fa le cose nel giusto ordine read-eval-print, perché l'argomento di ciascuna chiamata di procedura viene calcolato prima della chiamata effettiva.

Shell interattiva: una shell interattiva legge i comandi dall'input dell'utente su un terminale. Tra le altre cose, tale shell legge i file di avvio all'attivazione, visualizza un prompt e abilita il controllo dei processi per impostazione predefinita. L'utente può interagire con la shell. Ecco come è nato il nome della shell interattiva. Consideriamo questo script bash:

     #!/bin/bash
     echo -n "Enter the value of variable 'var1': "
     read var1
     echo "var1 = $var1"
     echo

    echo -n "Enter the values of variables 'var2' and 'var3' "
    echo =n "(separated by a space or tab): "
    read var2 var3
    echo "var2 = $var2      var3 = $var3"
    #  If you input only one value,
    #+ the other variable(s) will remain unset (null).

    exit 0

Ora lo script sopra interagisce con l'utente, chiede all'utente di inserire input in base ai quali esegue i suoi calcoli. Ecco perché si comporta come una shell interattiva.

Allo stesso modo, l'interprete di Python che la maggior parte delle persone usa per imparare Python è interattivo mentre comunica con l'utente.


1
@ The Dark Knight: Quindi, in base alla teoria di cui sopra, possiamo dire che l'estensione per gli sviluppatori (in chrome) o l'estensione firebug (in firefox) è un po 'REPL?
Rajkishore,

9

Tecnicamente, è corretto affermare che una shell è un'istanza di una REPL. Tuttavia, non è una questione di definizione del programma in quanto è uno degli scenari di utilizzo comuni.

Bash, per esempio, è scritto in C, ma avrebbe potuto essere scritto in Python. A quel punto, se parli delle caratteristiche e delle abilità del programma, sarebbe corretto dire che Bash è una shell mentre Python non lo è?

Si potrebbe anche dire che le shell riguardano l'esecuzione di comandi mentre le REPL riguardano l'esecuzione di istruzioni e chiamate di funzioni. Ma non puoi eseguire comandi in REPL (os.system di Python, os.popen, ecc.) E non puoi eseguire (o definire) funzioni in Bash, usando molti dei suoi built-in?

Come detto, è una questione di utilizzo. Se manipoli file e programmi già pronti, lo stai usando come shell. Se stai testando librerie o semantiche linguistiche, è una REPL.

Spero che sia d'aiuto.


3

Questa domanda StackOverflow tratta proprio quella domanda (tra le altre cose).

Sono personalmente sul recinto per quanto riguarda Python interattivo. Ma, se vuoi chiamarlo REPL, non penso che qualcuno si arrabbierà con te (ci sono un po 'troppe cose che funzionano nei file di codice sorgente, ma non nella shell interattiva per me essere completamente felice di chiamare un REPL).


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.