我试图了解Lisp-1和Lisp-2之间的区别以及它与Clojure的关系,但我仍然不太了解。谁能启发我?
我试图了解Lisp-1和Lisp-2之间的区别以及它与Clojure的关系,但我仍然不太了解。谁能启发我?
Answers:
根据维基百科:
在Lisp社区中,争用一个单独的函数名称空间是否是一个优势是争论的源头。通常将其称为Lisp-1与Lisp-2辩论。Lisp-1是指Scheme的模型,而Lisp-2是指Common Lisp的模型。
基本上,这是关于变量和函数是否可以具有相同的名称而不会发生冲突。 Clojure是Lisp-1,这意味着它不允许同一名称同时用于函数和变量。
list
通常用作函数参数,没什么用,OMG令人困惑,因为(list ...)
它是标准函数。许多具有list
变量的list
函数不使用该函数,或者不在该变量附近使用它。即使确实发生了,也还不错:(list foo list)
。这比“打架”之类的句子更令人困惑,在该句子中,同一个词以名词和动词形式出现。
您可能想阅读Richard Gabriel撰写的本文。它是Lisp社区在Lisp1 vs Lisp2中讨论的问题的摘要。在前几节中,它有点密集且移动缓慢,但是当您超过第5节时,它会更容易阅读。
基本上,Lisp1具有将符号映射到值的单个环境,并且这些值可以是“常规”或函数。Lisp2具有(至少)两个名称空间(符号的功能值具有一个插槽,而常规值则具有一个插槽)。因此,在Lisp2中,可以有一个名为foo的函数和一个名为foo的值,而在Lisp1中,名称foo只能引用一个值(函数或其他值)。
两者之间存在一些权衡和口味差异,但请阅读本文以了解详细信息。克里斯蒂安·奎因克(Christian Queinnec)的书《小块裂口》也讨论了文本所编织的差异。
funcall
and function
运算符填满代码。这些消失在Lisp-1中。