Lisp-1和Lisp-2有什么区别?
我试图理解Lisp-1和Lisp-2之间的区别,以及它如何与Clojure相关,但我仍然无法正确理解。 任何人都可以启发我吗?
根据维基百科 :
一个单独的函数名字空间是否是一个优势是Lisp社区中争用的来源。 它通常被称为Lisp-1与Lisp-2的辩论。 Lisp-1是指Scheme的模型,而Lisp-2是指Common Lisp的模型。
这基本上是关于variables和函数是否可以在没有冲突的情况下具有相同的名称。 Clojure是一个Lisp-1,意思是它不允许同时使用同一个名字来作为一个函数和一个variables。
您可能想阅读Richard Gabriel撰写的这篇论文 。 这是Lisp社区在Lisp1和Lisp2中讨论的问题的总结。 在前几部分中,它有点密集而且缓慢,但是当你读完第5部分的时候更容易阅读。
基本上,Lisp1有一个将符号映射到值的环境,这些值可以是“常规”或函数。 Lisp2有(至less)两个命名空间(符号有一个function值的插槽和一个常规值的插槽)。 因此,在Lisp2中,可以有一个名为foo的函数和一个名为foo的值,而在Lisp1中,名称foo只能引用单个值(函数或其他)。
两者之间有几种折衷和差异的味道,但是请阅读这篇文章的细节。 Christian Queinnec的着作“Lisp in Small Pieces”也讨论了文本中的差异。