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:
- 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,
- 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
- 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.
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.
fonte
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).
fonte