Diferença entre um REPL e um shell interativo

37

Pergunta Noob. Não sou capaz de dizer a diferença entre um REPL e um shell interativo apenas lendo as definições na Wikipedia.

O Wiki observa que o REPL é um tipo específico de shell de linguagem interativa. É um subconjunto adequado? A definição do Wiki parece restringir a terminologia REPL a linguagens do tipo Lisp, enquanto as propriedades declaradas realmente não contêm nenhum recurso distintivo.

Em particular, seria correto chamar o IPython de REPL?

tchakravarty
fonte

Respostas:

24

REPL: Este é um procedimento que apenas executa um loop, aceita um comando de cada vez, executa-o e imprime o resultado.

As três etapas em cada iteração do loop são:

  1. Chamando read para ler os caracteres que compõem uma expressão textual do buffer de entrada do teclado e construir uma estrutura de dados para representá-la,
  2. Chamar eval para avaliar a expressão - intuitivamente, eval "descobre o que a expressão significa" e "faz o que diz para fazer", retornando o valor da expressão - e
  3. Chamar write para imprimir uma representação textual do resultado da avaliação, para que o usuário possa vê-la.

Você pode escrever seu próprio loop de leitura-avaliação-impressão para seus próprios programas, para que os usuários possam digitar expressões e interpretá-las da maneira que desejar. Você pode iniciar o loop read-eval-print (digitando (rep-loop)) e ele substituirá o loop normal do esquema read-eval-print, interpretando as expressões do seu jeito.

Aqui está um loop muito simples de leitura e avaliação:

  (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

Observe que a expressão (write (eval (read))) faz as coisas na ordem apropriada de leitura, avaliação e impressão, porque o argumento para cada chamada de procedimento é calculado antes da chamada real.

Shell Interativo: Um shell interativo lê comandos da entrada do usuário em um terminal. Entre outras coisas, esse shell lê os arquivos de inicialização na ativação, exibe um prompt e ativa o controle do trabalho por padrão. O usuário pode interagir com o shell. Foi assim que o nome do shell interativo surgiu. Vamos considerar este 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

Agora, o script acima interage com o usuário, solicita que ele insira entradas com base nas quais faz seus cálculos. É por isso que se comporta como um shell interativo.

Similary, o intérprete python que a maioria das pessoas usa para aprender python é interativo, pois se comunica com seu usuário.

O Cavaleiro das Trevas
fonte
11
@ The Dark Knight: Então, com base na teoria acima, podemos dizer que a barra de ferramentas do desenvolvedor (no chrome) ou a extensão do firebug (no firefox) é meio REPL?
Rajkishore 01/02
9

Tecnicamente, é correto dizer que um shell é uma instância de um REPL. No entanto, não é uma questão de definição de programa, pois é um dos cenários de uso comum.

O Bash, por exemplo, é escrito em C, mas poderia muito bem ter sido escrito em Python. Nesse ponto, se você falar sobre os recursos e habilidades do programa, seria correto dizer que o Bash é um shell enquanto o Python não é?

Você também pode dizer que os Shell são sobre a execução de comandos, enquanto os REPLs são sobre a execução de instruções e chamadas de função. Mas você não pode executar comandos nos REPLs (os.system, os.popen, etc) do Python e não pode executar (ou definir) funções no Bash, usando muitos de seus recursos internos?

Como mencionado acima, é uma questão de uso. Se você manipula arquivos e programas prontos, está usando-o como um shell. Se você estiver testando bibliotecas ou semântica de idiomas, é um REPL.

Espero que ajude.

Yam Marcovic
fonte
3

Esta questão StackOverflow discute essa mesma questão (entre outras coisas).

Pessoalmente, estou em cima do muro em relação ao Python interativo. Mas, se você quiser chamá-lo de REPL, acho que ninguém ficará bravo com você (há coisas um pouco demais que funcionam nos arquivos de código-fonte, mas não no shell interativo, para que eu fique totalmente feliz em ligar. um REPL).

Vatine
fonte