Answers:
REPL:这是一个仅循环执行,一次接受一个命令,执行该命令并打印结果的过程。
循环的每个迭代中的三个步骤是:
您可以为自己的程序编写自己的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解释器是一种与用户进行交流的交互式工具。
从技术上讲,说外壳程序是REPL的实例是正确的。但是,这不是程序定义的问题,因为它是常见的使用场景之一。
例如,Bash用C编写,但它很可能用Python编写。到那时,如果您谈论程序的特性和功能,那么说Bash是shell而Python不是,那是正确的吗?
您也可以说Shell是关于运行命令的,而REPL是关于运行指令和函数的调用的。但是,您是否不能在REPL(Python的os.system,os.popen等)中运行命令,也不能使用其许多内置功能在Bash中运行(或定义)函数吗?
如上所述,这是使用问题。如果您处理文件和现成的程序,则将其用作外壳。如果您要测试库或语言语义,则它是REPL。
希望能有所帮助。
这个StackOverflow问题(除其他外)讨论了这个问题。
关于交互式Python,我本人也处于隔离状态。但是,如果您想将其称为REPL,我认为没有人会生您的气(在源代码文件中工作的东西太多了,但在交互式shell中工作的东西太多了,让我完全不满意调用它是一个REPL)。