是什么使Lisp与众不同

有史以来最伟大的编程语言
-艾伦·凯(Alan Kay),《在Lisp上》



当麦卡锡在1950年代后期开发Lisp时,它与现有的语言完全不同,其中最重要的是Fortran

Lisp实施了九个新想法:

1. 条件句 。 条件语句是if-then-else构造。 现在,我们认为它们是理所当然的。 它们是在Lisp的开发过程中 McCarthy 发明的 。 (当时,Fortran仅具有与底层硬件上的分支指令密切相关的goto语句。)McCarthy在Algol委员会任职期间,在Algol中进行了条件语句,并从那里传播到其他语言。

2. 功能类型(一种功能类型) 。 在Lisp中,函数是第一类的对象-它们是数据类型,例如数字,字符串等,并且具有文字表示形式,可以存储在变量中,可以作为参数传递等。

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

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

5. 垃圾收集

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

在Fortran中有这样的差异是很自然的,因为该语言是线性定向的(对于输入格式为打孔卡的语言,这不足为奇)。 您不能有嵌套的语句。 尽管您需要数学表达式才能起作用,但是强迫其他东西返回值没有意义,因为可能没有等待返回的东西。

块结构语言的出现取消了这些限制,但那时已经为时已晚。 表达式和语句之间的区别已得到修复。 它从Fortran传到Algol,再传给他们的后代。

当语言完全由表达式组成时,您可以根据需要创建表达式。 您可以编写任何一个(使用Arc语法)

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

要么

 (= x (if foo 1 2)) 

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

8.使用来自字符的树的代码符号

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

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

结论


Lisp刚发明时,所有这些想法都与1950年代后期可用硬件所规定的常规编程实践相去甚远。

随着时间的流逝,体现在流行语言成功中的默认语言逐渐演变为Lisp。 1-5点现在很普遍。 点6开始出现在主流中。 在Python中,虽然没有合适的语法,但以某种形式存在项7。 第8条(与第9条一起使用)使Lisp中的宏成为可能,但它仍然仅在Lisp中,可能是因为(a)它需要这些括号或类似的东西,以及(b)如果如果加上最后一次增加的功能,您就不能再声称发明了一种新语言,而只开发了一种新的Lisp方言; -)

尽管这对于现代程序员很有用,但是用Lisp与其他语言中使用的随机技巧有何不同来描述Lisp还是很奇怪的。 也许这不是麦卡锡在想的。 Lisp并非旨在解决Fortran错误。 它似乎更多地是试图公理化计算的副产品。

Source: https://habr.com/ru/post/zh-CN476994/


All Articles