我遇到了以下 statement by Richard Stallman :
'When you start a Lisp system, it enters a read-eval-print loop. Most other languages have nothing comparable to read, nothing comparable to eval, and nothing comparable to print. What gaping deficiencies! '
现在,我很少用 Lisp 进行编程,但我已经用 Python 编写了大量代码,最近还用 Erlang 编写了一些代码。我的印象是这些语言也提供 read-eval-print 循环,但 Stallman 不同意(至少关于 Python):
'I skimmed documentation of Python after people told me it was fundamentally similar to Lisp. My conclusion is that that is not so. When you start Lisp, it does 'read', 'eval', and 'print', all of which are missing in Python.'
Lisp 和 Python 的 read-eval-print 循环之间真的存在根本的技术差异吗?你能举例说明 Lisp REPL 使哪些事情变得容易而在 Python 中很难做到吗?
最佳答案
为了支持 Stallman 的立场,Python 在以下方面与典型的 Lisp 系统不同:
Lisp 中的
read
函数读取一个 S 表达式,它表示一个任意数据结构,可以将其视为数据,也可以将其计算为代码。 Python 中最接近的东西读取单个字符串,如果你想让它有任何含义,你必须自己解析它。Lisp 中的
eval
函数可以执行任何 Lisp 代码。 Python 中的eval
函数只计算 表达式,并且需要exec
语句来运行语句。但是这两种方法都适用于以文本形式表示的 Python 源代码,并且您必须跳过一堆障碍才能“评估”一个 Python AST。Lisp 中的
print
函数以read
接受的完全相同的形式写出一个S 表达式。 Python 中的print
打印出由您尝试打印的数据定义的内容,这当然并不总是可逆的。
Stallman 的说法有点虚伪,因为很明显 Python 确实 具有完全命名为 eval
和 print
的函数,但它们做了一些不同的事情(并且低于)他的期望。
在我看来,Python确实在某些方面与 Lisp 相似,我可以理解为什么人们可能会建议 Stallman 研究 Python。但是,作为 Paul Graham argues in What Made Lisp Different ,任何包含 Lisp 所有功能的编程语言,也必须是 Lisp。
关于python - Lisp 的 read-eval-print 循环与 Python 的有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12253200/