为什么大多数Lisps和Schemes都是动态输入的? 静态类型不会与它们的一些常见功能混合使用吗?
答案 0 :(得分:15)
可以使键入和s表达式协同工作,请参阅typed scheme。
部分地,s表达式语言是动态类型的历史巧合。这些语言往往更多地依赖于宏,并且在s表达式上解析和模式匹配的简易性使得宏处理变得更加容易。大多数关于复杂宏的研究都是用s表达式语言进行的。
答案 1 :(得分:13)
当Lisp从1958年到1960年发明时,它引入了很多功能,无论是语言还是实现(垃圾收集,自托管编译器......)。某些功能是从其他语言继承(有一些改进)(列表处理,...)。该语言使用函数实现计算。与语言特征相比,s表达式更像是一个实现细节(当时)。类型系统不是语言的一部分。以交互方式使用该语言也是一种早期实现功能。
当时尚未发明功能语言的有用类型系统。直到今天,以交互方式使用静态类型语言也相对困难。静态类型语言的许多实现也提供了一些交互式接口 - 但是大多数它们不像典型的Lisp系统那样提供相同级别的交互式使用支持。在交互式Lisp系统中进行编程意味着可以随时更改许多内容,如果类型更改必须通过这样的交互式Lisp系统中的整个程序和数据传播,则可能会出现问题。请注意,一些Schemers对这些事情有不同的看法。 R6RS主要是一种批处理语言,在Lisp的精神中通常没那么多......
随后使用静态类型系统发明的函数式语言也得到了非s表达式语法 - 它们不支持宏或相关功能。后来这些语言/实现中的一些使用了语法扩展的预处理器。
答案 2 :(得分:5)
静态类型是词法,它意味着可以从读取源代码推断出有关类型的所有信息,而无需评估任何表达式或计算任何事物,条件在这里是最重要的。设计一种静态类型语言,以便可以实现这一点,一个更好的术语将是“词法类型”,例如,编译器可以通过单独读取源来证明不会发生类型错误。
在lisp的情况下,这是不同的,因为lisp的源代码本身不是静态的,lisp是同源的,它使用数据作为代码,并且可以在某种程度上动态编辑自己的运行源。
Lisp是第一种动态类型语言,可能由于这个原因,程序代码本身在Lisp中不再是词法。
编辑:一个更强大的原因,在静态类型的情况下,您必须键入列表。您可以为每个列表具有极其复杂的类型,这些类型考虑了所有元素,每个元素具有相同类型的需求,并将其键入为列表。前一个选项将产生列表列表的地狱。后一个选项要求源代码只为每个数据包含相同的类型,这意味着你甚至不能构建表达式,因为列表无论如何都是一个不同于整数的类型。
所以我敢说,实现它是完全不可能的。