Lisp-1和Lisp-2有什么区别?


94

我试图了解Lisp-1和Lisp-2之间的区别以及它与Clojure的关系,但我仍然不太了解。谁能启发我?

Answers:


68

根据维基百科

在Lisp社区中,争用一个单独的函数名称空间是否是一个优势是争论的源头。通常将其称为Lisp-1与Lisp-2辩论。Lisp-1是指Scheme的模型,而Lisp-2是指Common Lisp的模型。

基本上,这是关于变量和函数是否可以具有相同的名称而不会发生冲突。 Clojure是Lisp-1,这意味着它不允许同一名称同时用于函数和变量。


11
这样,Lisp-2是否更容易混淆具有相同名称的函数和变量?
appshare.co

39
部分原因是使用Lisp-2方言的程序员不会不遗余力地使函数和变量具有相同的名称。list通常用作函数参数,没什么用,OMG令人困惑,因为(list ...)它是标准函数。许多具有list变量的list函数不使用该函数,或者不在该变量附近使用它。即使确实发生了,也还不错:(list foo list)。这比“打架”之类的句子更令人困惑,在该句子中,同一个词以名词和动词形式出现。
卡兹(Kaz)2014年

5
@Zubair Java具有更多的名称空间。您可以使用相同的名称定义类,方法和变量。
ceving 2010年

19
作为助记符,我认为Lisp 1具有1个名称空间,Lisp 2具有2个名称空间(一个用于函数,一个用于变量)。
尼克·麦考

4
@NickMcCurdy作为助记符,我认为自行车有两个轮子,三轮车有三个轮子。
卡兹(Kaz)

71

您可能想阅读Richard Gabriel撰写的本文。它是Lisp社区在Lisp1 vs Lisp2中讨论的问题的摘要。在前几节中,它有点密集且移动缓慢,但是当您超过第5节时,它会更容易阅读。

基本上,Lisp1具有将符号映射到值的单个环境,并且这些值可以是“常规”或函数。Lisp2具有(至少)两个名称空间(符号的功能值具有一个插槽,而常规值则具有一个插槽)。因此,在Lisp2中,可以有一个名为foo的函数和一个名为foo的值,而在Lisp1中,名称foo只能引用一个值(函数或其他值)。

两者之间存在一些权衡和口味差异,但请阅读本文以了解详细信息。克里斯蒂安·奎因克(Christian Queinnec)的书《小块裂口》也讨论了文本所编织的差异。


7
关于加布里埃尔(Gabriel)的第11节是Gabriel论文中比较神秘的部分之一。在该部分中,他暗示Lisp1更有利于编程的功能样式,因此更有利于多处理。显然,这与Clojure有关。但是我不太确定为什么 Lisp1更适合FP。有人对此有见识吗?
彼得·麦克莱恩

40
可能是因为FP的重点是将函数视为一流的值,因此以与所有其他值相同的方式对待它们更加方便,并且从概念上讲更加干净
mikera 2011年

10
@PeterMcLain当使用Lisp-1的方言的用户说Lisp-1更适合函数式编程时,它们的意思是您不必将funcalland function运算符填满代码。这些消失在Lisp-1中。
卡兹(Kaz)2014年

3
一个示例,当Schemer尝试编写Lisp时会发生什么情况:emacs.stackexchange.com/q/28979/2787
2016年

2
您使用了“至少”关于Lisp-2的短语。两种情况之间的简单区别是:符号是否在s表达式的开头(如果是,则在函数名称空间中查找,否则在变量名称空间中查找)。除了这两种情况,您能否举一些其他例子?
Daniel Dinnyes
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.