Diferença entre um REPL e um shell interativo

36
REPL e um shell interativo apenas lendo as definições na Wikipedia.

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

Em particular, seria correto chamar o IPython de REPL?

    
por tchakravarty 10.10.2012 / 12:14
fonte

3 respostas

22

REPL: Este é um procedimento que apenas faz 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 ler 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. Chamando 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. Chamando write para imprimir uma representação textual do resultado de eval, para que o usuário possa vê-lo.

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

Aqui está um loop muito simples de impressão 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 e impressão-eval, porque o argumento para cada chamada de procedimento é calculado antes da chamada real.

Interactive Shell: Um shell interativo lê os comandos da entrada do usuário em um terminal. Entre outras coisas, esse shell lê arquivos de inicialização na ativação, exibe um prompt e ativa o controle de tarefas por padrão. O usuário pode interagir com o shell. Foi assim que surgiu o nome do shell interativo. 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, ele pede ao usuário para inserir entradas com base no que ele faz seus cálculos. É por isso que se comporta como um shell interativo.

Similarmente, o interpretador python que a maioria das pessoas usa para aprender python é interativo quando se comunica com seu usuário.

    
por 10.10.2012 / 12:35
fonte
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 comuns de uso.

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

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

Como dito anteriormente, é uma questão de uso. Se você manipular arquivos e programas prontos, você está usando isso como um shell. Se você está testando bibliotecas ou semântica de linguagem, é um REPL.

Espero que ajude.

    
por 10.10.2012 / 13:01
fonte
3

Esta pergunta do StackOverflow discute essa mesma pergunta (entre outras coisas ).

Pessoalmente, estou em dúvida no que diz respeito ao Python interativo. Mas, se você quiser chamá-lo de REPL, eu não acho que alguém vai ficar com raiva de você (há um pouco demais coisas que funcionam em arquivos de código-fonte, mas não no shell interativo para que eu seja totalmente feliz em chamar um REPL).

    
por 10.10.2012 / 12:21
fonte