是什么让 Lisp 如此特别

«有史以来最伟大的编程语言«
——艾伦·凯,《论 Lisp》

是什么让 Lisp 如此特别

当 McCarthy 在 1950 世纪 XNUMX 年代末开发 Lisp 时,它与现有语言截然不同,其中最重要的是 Fortran语言.

Lisp 引入了九个新想法:

1. 条件句。 条件语句是 if-then-else 结构。 现在我们认为它们是理所当然的。 他们是 发明了 麦卡锡在 Lisp 的开发过程中。 (当时的 Fortran 只有 goto 语句,与底层硬件上的分支指令紧密耦合。)McCarthy 在 Algol 委员会任职期间,为 Algol 贡献了条件语句,并从那里传播到了其他语言。

2. 函数类型。 在 Lisp 中,函数是一等对象 - 它们是一种数据类型,就像数字、字符串等一样,并且具有文字表示形式,可以存储在变量中,可以作为参数传递等。

3. 递归。 当然,递归在 Lisp 之前就作为数学概念存在,但 Lisp 是第一个支持它的编程语言。 (这可能隐含在将函数创建为一流对象时。)

4. 变量的新概念。 在 Lisp 中,所有变量都是有效指针。 值是类型所拥有的,而不是变量,并且分配或绑定变量意味着复制指针,而不是它们指向的内容。

5. 垃圾收集.

6. 由表达式组成的程序。 Lisp 程序是表达式树,每个表达式都返回一个值。 (某些 Lisp 表达式可以返回多个值。)这与 Fortran 和许多其他区分“表达式”和“语句”的成功语言形成鲜明对比。

Fortran 中存在这种区别是很自然的,因为该语言是面向行的(对于输入格式为打孔卡的语言来说这并不奇怪)。 你不能有嵌套语句。 只要您需要数学表达式才能工作,那么让其他任何东西返回值就没有意义,因为可能没有任何东西等待返回。

随着块结构语言的出现,这些限制被取消,但那时已经太晚了。 表达式和语句之间的区别已经确定。 它从 Fortran 传递到 Algol,并进一步传递到它们的后代。

当语言完全由表达式组成时,您可以以任何您想要的方式组成表达式。 您可以编写其中之一(使用语法 )

(if foo (= x 1) (= x 2))

(= x (if foo 1 2))

7. 符号类型。 字符与字符串不同,在这种情况下,您可以通过比较指针来检查是否相等。

8. 代码的表示法 使用符号树。

9. 整个语言始终可用。 读取时间、编译时间和运行时间之间没有明显区别。 您可以在阅读时编译或运行代码,或者在编译时阅读或运行代码,或者在运行时阅读或编译代码。

在阅读时运行代码允许用户重新编程 Lisp 的语法; 编译时运行代码是宏的基础; 运行时编译是在 Emacs 等程序中使用 Lisp 作为扩展语言的基础; 最后,运行时读取允许程序使用 s 表达式进行通信,这是最近在 XML 中重新发明的一个想法。

结论

当 Lisp 首次发明时,这些想法与 1950 世纪 XNUMX 年代末可用硬件所决定的传统编程实践相去甚远。

随着时间的推移,流行语言的成功所体现的默认语言逐渐向 Lisp 发展。 第1-5点现已被广泛接受。 第 6 点开始成为主流。 在Python中,有某种形式的第7条,尽管没有合适的语法。 第 8 项(与第 9 项一起)使 Lisp 中的宏成为可能,但仍然只在 Lisp 中存在,可能是因为 (a) 它需要这些括号或同样糟糕的东西,以及 (b) 如果您添加最新的功能增强,您可以不再声称发明了一种新语言,而只是开发了一种新的 Lisp 方言; -)

尽管这对于现代程序员来说很有用,但是用 Lisp 与其他语言中采用的随机技术的区别来描述 Lisp 是很奇怪的。 这可能不是麦卡锡的想法。 Lisp 的设计初衷并不是为了纠正 Fortran 的错误; 它看起来更像是尝试的副产品 公理化计算.

来源: habr.com

添加评论