Differenza tra un REPL e una shell interattiva

36

Domande Noob. Non sono in grado di capire la differenza tra un REPL e un shell interattiva solo leggendo le definizioni su Wikipedia.

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

In particolare, sarebbe corretto chiamare IPython a REPL?

    
posta tchakravarty 10.10.2012 - 12:14
fonte

3 risposte

22

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

I tre passaggi a ogni iterazione del ciclo sono:

  1. Chiamare leggere per leggere i caratteri che costituiscono un'espressione testuale dal buffer di input della tastiera e costruire una struttura dati per rappresentarlo,
  2. Chiamando eval per valutare l'espressione - intuitivamente, eval "capisce cosa significa l'espressione" e "fa quello che dice di fare", restituendo il valore dell'espressione - e
  3. Chiamando scrivi per stampare una rappresentazione testuale del risultato di eval, in modo che l'utente possa vederlo.

È possibile scrivere il proprio ciclo read-eval-print per i propri programmi, in modo che gli utenti possano digitare le espressioni e interpretarle nel modo desiderato. Puoi avviare il tuo ciclo read-eval-print (digitando in (rep-loop)), e prenderà il posto del normale ciclo Scheme-eval-print dello schema, interpretando le espressioni a modo tuo.

Ecco un ciclo di lettura-eval-print molto semplice:

  (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 nell'ordine corretto read-eval-print, perché l'argomento per ogni 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, una shell di questo tipo 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. Prendiamo in considerazione 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 gli input in base ai quali esegue i suoi calcoli. Ecco perché si comporta come una shell interattiva.

Similario, l'interprete python che la maggior parte delle persone usa per imparare Python è interattivo mentre comunica con il suo utente.

    
risposta data 10.10.2012 - 12:35
fonte
9

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

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

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

Come detto, è una questione di utilizzo. Se si manipolano i file e i programmi pronti, lo si utilizza come una shell. Se stai testando le librerie o la semantica del linguaggio, è un REPL.

Spero che ti aiuti.

    
risposta data 10.10.2012 - 13:01
fonte
3

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

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

    
risposta data 10.10.2012 - 12:21
fonte

Leggi altre domande sui tag