基本的cons-cell将两个任意事物粘在一起,是允许构建链表和任意数据对象的基本单元。问题:是否有理由坚持这种简单的语言设计决策(例如,在所有的lisp家族中)? 为什么不为此目的使用固定长度数组(或一些嵌套堆栈)?我无法预见到这方面的任何问题,但是有一个明显的优点是更加“打包”的内存,更少的指针分辨率和更少的“死重”缺陷单元来定义数据的层次结构。
答案 0 :(得分:3)
你有一个标题为“功能编程:为什么配对作为一个基本的构造单元?”,但是这个标题并没有正确反映许多重要和众所周知的函数语言(例如Haskell,F#,Scala,SML,Clojure)具有代数数据类型或不同的数据结构集合,其中该对只是一种不同类型的构造函数,如果可用的话。其他多范式语言的情况类似,它支持函数式编程,如C ++,Java,Objective-C,Swift等。
在所有这些情况下,该对(如果存在)与数组,记录或列表或任何其他类型的数据构造函数完全“基本”。
剩下的是Lisp语言系列,特别是Common Lisp和Scheme,除了拥有丰富的数据结构外,就像Rainer Joswig的评论中引用的那样,使用这对语言作为一项重要任务:作为基础数据构造函数来表示程序。
Lisp代码是一个s表达式(列表和原子列表)这一事实带来了基本结果,其中最引人注目的是宏系统的兴起,它允许程序员轻松创建新的语法,甚至新的特定领域语言。
答案 1 :(得分:2)
Renzo's answer是现场的。函数编程是关于将编程与逻辑和数学对齐,其中表达式表示值,并且没有副作用。 (当然,在实践中,我们需要I / O的副作用等。)函数式编程并不需要单链表作为基本结构。
列表是使Lisps lispy的东西之一。 在Lisp族语言中,对很常见的原因之一可能是有序对很容易在Lisps受到启发的lambda演算中实现。 (我说"灵感来自"而不是"基于"因为在语法和使用lambda来表示匿名函数之后,存在很多不同之处,并且'最好不要假设关于一个的事情适用于另一个。)请参阅Use of lambda for cons/car/cdr definition in SICP的答案,快速了解减法,汽车和cdr如何只使用词法闭包来实现。