25

为什么大多数 Lisp 和 Scheme 都是动态类型的?静态类型不会与它们的一些共同特征混合吗?

4

3 回答 3

17

键入和 s 表达式可以一起工作,请参阅类型化方案

s-expression 语言是动态类型的,部分原因是历史上的巧合。这些语言往往更多地依赖于,而对 s 表达式的解析和模式匹配的易用性使得宏处理变得更加容易。大多数关于复杂宏的研究都发生在 s 表达式语言中。

输入卫生宏很难。

于 2010-06-01T20:50:43.333 回答
13

当 Lisp 在 1958 年到 1960 年间被发明时,它引入了许多功能,既作为一种语言又作为一种实现(垃圾收集、自托管编译器……)。某些功能是从其他语言(列表处理,...)继承的(进行了一些改进)。该语言使用函数实现了计算。s 表达式(当时)更像是一种实现细节,而不是一种语言特性。类型系统不是语言的一部分。以交互方式使用该语言也是一个早期的实现特性。

那时还没有发明用于函数式语言的有用类型系统。直到今天,以交互方式使用静态类型语言也相对困难。有许多静态类型语言的实现也提供了一些交互界面——但大多数情况下它们没有提供与典型 Lisp 系统相同级别的交互使用支持。在交互式 Lisp 系统中进行编程意味着可以随时更改许多内容,如果类型更改必须通过此类交互式 Lisp 系统中的整个程序和数据传播,则可能会出现问题。请注意,一些计划者对这些事情有不同的看法。R6RS 主要是一种批处理语言,通常不那么符合 Lisp 的精神......

后来用静态类型系统发明的函数式语言也得到了非 s 表达式语法——它们不提供对宏或相关特性的支持。后来,其中一些语言/实现使用了预处理器进行语法扩展。

于 2010-06-01T23:26:19.147 回答
5

静态类型是词法的,这意味着所有关于类型的信息都可以从阅读源代码中推断出来,而不需要评估任何表达式或计算任何东西,条件在这里是最重要的。静态类型的语言被设计为可以发生这种情况,更好的术语是“词法类型”,例如,编译器可以仅通过阅读源代码来证明不会发生类型错误。

在 lisp 的情况下,这是一个尴尬的不同,因为 lisp 的源代码本身不是静态的,lisp 是同质的,它使用数据作为代码,并且可以在某种程度上动态地编辑它自己的运行源代码。

Lisp 是第一个动态类型语言,可能正是因为这个原因,程序代码本身在 Lisp 中不再是词法的。

编辑:一个更强大的原因,在静态类型的情况下,您必须键入列表。您可以为每个包含所有元素的列表设置极其复杂的类型,要求每个元素具有相同的类型并将其键入为该列表。前一个选项将产生带有列表列表的地狱。后一个选项要求源代码中每个数据只包含相同的类型,这意味着您甚至无法构建表达式,因为列表无论如何都是与整数不同的类型。

所以我敢说,实现它是完全不可行的。

于 2010-06-09T02:46:19.827 回答