python - Lisp 的 read-eval-print 循环与 Python 的有何不同?

标签 python functional-programming lisp read-eval-print-loop

我遇到了以下 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 确实 具有完全命名为 evalprint 的函数,但它们做了一些不同的事情(并且低于)他的期望。

在我看来,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/

相关文章:

python - 我想获取所有图像,但 selenium python 只获取三个图像

scala - "effectively tail recursive"是什么意思?

f# - 我是否正确使用函数组合?

compiler-construction - Lisp编译器设计

functional-programming - Common Lisp 中的字符串比较

emacs - 开始 elisp 如何在不实际使用除号的情况下编写除号

应用函数列表的 Pythonic 方式?

python - 在 pandas 中计算数据集的每月天值

functional-programming - Common LISP 传递的参数少于所需的参数 - 这是怎么回事?

python - 有没有类似 Python 的 pty.fork for Ruby 的东西?