REPL和交互式外壳之间的区别


37

新手问题。我仅通过阅读Wikipedia上的定义就无法分辨REPL交互式外壳之间的区别。

Wiki指出REPL是一种特殊的交互式语言外壳。它是否是适当的子集?Wiki定义似乎将术语REPL限制为类似Lisp的语言,而声明的属性实际上并不包含任何区别功能。

特别是,将IPython称为REPL是否正确?

Answers:


24

REPL:这是一个仅循环执行,一次接受一个命令,执行该命令并打印结果的过程。

循环的每个迭代中的三个步骤是:

  1. 调用read从键盘输入缓冲区读取组成文本表达式的字符,并构造一个数据结构来表示它,
  2. 调用eval来评估表达式-直观地,eval“弄清楚了表达式的含义”,并“执行了要说的事情”,返回表达式的值-并
  3. 调用write以打印评估结果的文本表示形式,以便用户可以看到它。

您可以为自己的程序编写自己的read-eval-print循环,以便用户可以键入表达式,并且可以根据需要解释它们。您可以启动read-eval-print循环(通过键入(rep-loop)),它将取代普通的Scheme read-eval-print循环,以您自己的方式解释表达式。

这是一个非常简单的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

请注意,表达式(write(eval(read)))以正确的read-eval-print顺序执行操作,因为每个过程调用的参数都是在实际调用之前计算的。

交互式外壳:交互式外壳从终端上的用户输入读取命令。除其他外,此类外壳在激活时读取启动文件,显示提示,并默认启用作业控制。用户可以与shell进行交互,这就是交互shell名称的产生方式。让我们考虑一下这个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

现在,上面的脚本与用户交互,它要求用户输入输入,并以此为基础进行计算。这就是为什么它的行为像交互式外壳一样。

类似地,大多数人用来学习python的python解释器是一种与用户进行交流的交互式工具。


1
@黑暗骑士:基于上述理论,我们可以说开发人员工具栏(在chrome中)或firebug扩展(在firefox中)有点像REPL吗?
Rajkishore

9

从技术上讲,说外壳程序是REPL的实例是正确的。但是,这不是程序定义的问题,因为它是常见的使用场景之一。

例如,Bash用C编写,但它很可能用Python编写。到那时,如果您谈论程序的特性和功能,那么说Bash是shell而Python不是,那是正确的吗?

您也可以说Shell是关于运行命令的,而REPL是关于运行指令和函数的调用的。但是,您是否不能在REPL(Python的os.system,os.popen等)中运行命令,也不能使用其许多内置功能在Bash中运行(或定义)函数吗?

如上所述,这是使用问题。如果您处理文件和现成的程序,则将其用作外壳。如果您要测试库或语言语义,则它是REPL。

希望能有所帮助。


3

这个StackOverflow问题(除其他外)讨论了这个问题。

关于交互式Python,我本人也处于隔离状态。但是,如果您想将其称为REPL,我认为没有人会生您的气(在源代码文件中工作的东西太多了,但在交互式shell中工作的东西太多了,让我完全不满意调用它是一个REPL)。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.