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

114
我尝试理解Lisp-1和Lisp-2的区别以及与Clojure的关系,但我仍然没有完全理解。有人能给我解释一下吗?
3个回答

91
您可能希望阅读理查德·加布里埃尔(Richard Gabriel)的文章,其中总结了Lisp1与Lisp2之争中Lisp社区正在讨论的问题。在前几个部分中,这篇文章有点过于深奥和缓慢,但是一旦您浏览到第5节,它就变得更容易理解了。
基本上,Lisp1具有将符号映射到值的单一环境,并且这些值可以是“常规”值或函数。Lisp2具有(至少)两个命名空间(符号有一个函数值的插槽和一个普通值的插槽)。因此,在Lisp2中,您可以同时拥有一个名为foo的函数和一个名为foo的值,而在Lisp1中,名称foo只能引用单个值(函数或其他类型)。
两种方法之间存在多个权衡和不同之处,请阅读该文章以获取详细信息。克里斯蒂安·奎内克(Christian Queinnec)的书籍《小片语的Lisp》也穿插着讨论这些差异的内容。

7
《Gabriel论文》中比较神秘的一个部分是第11节多处理。在那个部分,他暗示Lisp1更有利于函数式编程风格,因此更有利于多处理。显然,这与Clojure相关。但我真的不确定为什么Lisp1更适合FP。有人能深入了解吗? - Peter McLain
47
可能是因为函数式编程的主要观点是将函数视为一等值,因此将它们与其他所有值相同地对待在概念上更加清晰、更加便利。 - mikera
15
当Lisp-1方言的用户说Lisp-1更适合函数式编程时,他们的意思是你不必将代码塞满funcallfunction操作符。在Lisp-1中,这些操作符会消失。 - Kaz
4
一个例子展示了当Scheme程序员试图编写Lisp代码时会发生什么:http://emacs.stackexchange.com/q/28979/2787 - ceving
6
我喜欢这篇文章使用“perspicuously”这个词,它具有美妙的讽刺意味,表示“更易理解”。 - BaseZen
显示剩余4条评论

76
根据维基百科
是否为函数单独设置命名空间是Lisp社区争议的焦点。这通常被称为Lisp-1与Lisp-2之争。Lisp-1指Scheme的模型,而Lisp-2指Common Lisp的模型。
基本上是关于变量和函数是否可以在没有冲突的情况下具有相同的名称。Clojure是Lisp-1,这意味着它不允许同时将相同名称用于函数和变量。

11
Lisp-2中函数和变量使用相同的名称会更令人困惑,不是吗? - yazzapps.com
44
Lisp-2方言的程序员之所以不特别让函数和变量具有相同的名称,部分原因是因为他们不认为这样会造成困惑。例如,在函数参数中经常使用list,但没有人觉得这很混乱,因为(list ...)是一个标准函数。许多具有list作为变量名的函数并不使用list函数,或者在其附近不使用它。即使出现这种情况,也不会太糟糕:“(list foo list)”与“fight the good fight”这样的句子一样,其中相同的单词作为名词和动词出现并不更具困惑性。 - Kaz
7
Java具有更多的命名空间。你可以定义一个类、一个方法和一个变量使用相同的名称。 - ceving
32
作为一个助记符,我认为Lisp 1s只有一个命名空间,而Lisp 2s有两个命名空间(一个用于函数,一个用于变量)。 - Nick McCurdy
8
作为一个提示,我把自行车看作有两个轮子,三轮车有三个轮子。 - Kaz
据我所知,Lisp-2在Lisp-1之前出现。@yazz.com - Sandra

2
在Lisp-1中,一个符号只能有一个值。在Lisp-2中,一个符号可以有两个值,即当符号被解释为函数时的值和当符号被解释为值时的值。
在Lisp-1的实现中,包含与符号关联的值的结构只有一个指向数据和类型的插槽。而在Lisp-2中,有两个指针,一个指向函数值,另一个指向变量值。
在Common Lisp中,一个Lisp-2,你可以调用(symbol-function 'a)和(symbol-value 'a)来分别获取函数和值。如果'a被定义为add函数,并且(setq a 3),那么(a a a 1)将返回7。
在Lisp-1中,你不能这样做,因为a只能是一种东西,而上下文不会改变其含义。
在Common Lisp中,#'是symbol-function的缩写。 (setf (symbol-function 'a) #'+)将a设置为求和函数。
如果你愿意,你可以创建一个函数a,它将a设置为最后一次调用a返回的值,也许如果计算a的代价很高的话。
在Lisp-2中,如果你将一个函数赋值给一个符号,那么要调用该函数,你需要使用funcall运算符。

在将文本复制并粘贴到Lisp中时,请注意示例中的引号。在我的Mac上,单引号似乎无法正确复制。尝试示例时,请将引号更改为单引号。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接