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

Zub*_*air 89 lisp clojure lisp-2

我试图理解Lisp-1和Lisp-2之间的区别以及它与Clojure的关系,但我仍然不理解.任何人都可以开导我吗?

Pet*_*ain 66

你可能想读理查德加布里埃尔的这篇论文.它是Lisp社区在Lisp1和Lisp2中讨论的问题的摘要.它在前几节中有点密集且缓慢移动,但是当你超过第5节时更容易阅读.

基本上,Lisp1有一个将符号映射到值的环境,这些值可以是"常规"或函数.Lisp2具有(至少)两个名称空间(符号具有用于其函数值的槽和用于常规值的槽).因此,在Lisp2中,您可以拥有一个名为foo的函数和一个名为foo的值,而在Lisp1中,名称foo只能引用一个值(函数或其他).

两者之间存在一些权衡和品味差异,但请阅读论文了解详情.Christian Queinnec的书"Lisp in Small Pieces"也讨论了通过文本编织的差异.

  • 可能是因为FP的主要观点是将函数视为一等值,因此以与所有其他值相同的方式处理它们更加方便和概念上更清晰 (38认同)
  • @PeterMcLain当Lisp-1方言的用户说Lisp-1对函数式编程更具传导性时,他们的意思是你不必填充充满`funcall`和`function`运算符的代码.这些在Lisp-1中消失. (10认同)
  • Gabriel论文中较为神秘的部分之一是关于多处理的第11节.在该部分中,他暗示Lisp1更有利于编程的功能风格,因此更有利于多处理.显然,这对Clojure很感兴趣.但我不确定*为什么*Lisp1更有利于FP.有人对此有所了解吗? (7认同)
  • Schemer尝试编写Lisp时会发生什么的例子:http://emacs.stackexchange.com/q/28979/2787 (3认同)
  • 你使用了关于Lisp-2的短语"至少".两种情况之间的简单区别是:符号是否位于s表达式的头部位置(如果是,则在函数名称空间中查找,否则在变量名称空间中查找).你能举出一些其他的例子,而不是那两个案例吗? (2认同)
  • 我只是喜欢这篇论文使用“明显”一词,具有极具讽刺意味的含义“易于理解”。 (2认同)

pau*_*doo 60

根据维基百科:

函数的单独命名空间是否有优势是Lisp社区争用的根源.它通常被称为Lisp-1 vs. Lisp-2辩论.Lisp-1指的是Scheme的模型,Lisp-2指的是Common Lisp的模型.

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

  • 部分原因是使用Lisp-2方言的程序员不会擅自使用具有相同名称的函数和变量.`list`经常被用作函数参数而且没有东西,因为`(list ...)`是一个标准函数,所以OMG很混乱.许多将`list`作为变量的函数不使用`list`函数,或者不在该变量附近使用它.即使确实发生了这种情况,也不会太糟糕:`(list foo list)`.这并不比像"打好斗争"这样的句子更令人困惑,因为同一个词出现在名词和动词中. (34认同)
  • 作为助记符,我认为 Lisp 1s 有 1 个命名空间,而 Lisp 2s 有 2 个命名空间(一个用于函数,一个用于变量)。 (11认同)
  • 那么具有相同名称的函数和变量的Lisp-2不是更令人困惑吗? (10认同)
  • @NickMcCurdy 作为助记符,我认为自行车有两个轮子,三轮车有三个轮子。 (5认同)
  • @Zubair Java有更多的名称空间.您可以定义具有相同名称的类,方法和变量. (4认同)