读取﹣求值﹣输出循环

优点

REPL对于学习一门新的编程语言具有很大的帮助，因为它能立刻对初学者做出回应。许多工具集和编程语言使用REPL研究算法、进行调试，比如MATLAB，ROOT，SciPy和IPython。Python的doctest模块能够通过捕捉自身REPL命令行的输出使测试代码更容易地进行。
由于 print 函数输出的数据格式（字符串）与用户输入的数据格式（字符串）相同，大多数输出的结果也可以被带回到read 函数作为输入。然而，有的时候输出的结果只能代表求值结果而不是求值结果本身，比如一个socket句柄或一些类的实例。比如在Python中使用 <__模块名__.类名 实例名>  这种形式来代表一个实例本身，在Common Lisp当中就使用 #<whatever> 的形式。而在CLIM，SLIME以及Symbolics Lisp Machine的REPL却有办法读取很难被完全字符串化的这些对象。他们记录被输出过的对象，之后当代码被读取时，这些对象能够被解析并重新被使用。

实现

为了实现一个Lisp REPL，只需要实现这三个函数和一个不停轮询的函数即可（当然，求值函数的实现是最为复杂的，因为它在内部要实现像car 与 + 的原始函数以及像if 一样的特殊操作符）。这些工作完成了之后，一个基本的REPL就可以用如下的简单形式表达：(loop (print (eval (read))))。
一种实现eval的方式就是实现一个递归处理抽象语法树（该语法树被read 函数创建）的函数。另一种可行的方法是将这个抽象语法树编译为机器码并执行。

主要的REPL编程语言环境

APL、BASIC、Clojure、F#、Haskell、J、Julia、Perl、PHP、Prolog、Python、R、Ruby、Scala、Smalltalk、Standard ML、Swift、Tcl、Javascript、Java(版本jdk-9起)