首先,不仅有两种主要的语言方言(Common Lisp和Scheme),而且每种方言都有许多单独的实现。例如,Chicken Scheme,Bigloo等......每个都有细微差别。
从现代的角度来看,这很奇怪,因为现在的语言往往具有明确的实现/规范。想想Java,C#,Python,Ruby等,每个网站都有一个单一的权威网站,您可以访问API文档,下载等。当然,Lisp早于所有这些语言。但话说回来,甚至C / C ++都是标准化的(或多或少)。
由于Lisp的年龄,这个社区的碎片化是什么?或者也许不同的实现/方言旨在解决不同的问题?我理解为什么Lisp永远不会像在一个确定的实现中成长的语言那样团结一致,这是有充分理由的,但是在这一点上,Lisp社区不应该朝着这个方向发展吗?
答案 0 :(得分:161)
Lisp社区是支离破碎的,但其他一切也是如此。
为什么会有这么多Linux发行版?
为什么有这么多BSD变种? OpenBSD,NetBSD,FreeBSD,......甚至Mac OS X。
为什么有这么多脚本语言? Ruby,Python,Rebol,TCL,PHP和无数其他人。
为什么有那么多Unix shell? sh,csh,bash,ksh,...?
为什么有这么多Logo(> 100),Basic(> 100),C(无数),......
为什么Ruby有这么多变种? Ruby MRI,JRuby,YARV,MacRuby,HotRuby?
Python可能有一个主站点,但有几个略有不同的实现:CPython,IronPython,Jython,Python for S60,PyPy,Unladen Swallow,CL-Python,......
为什么有C(Clang,GCC,MSVC,Turbo C,Watcom C ......),C ++,C#,Cilk,Objective-C,D,BCPL,......?
让他们中的一些人得到五十,然后看看它有多少方言和实现。
我认为Lisp是多种多样的,因为每种语言都是多样的或变得多样化。有些人从一个实施开始(麦卡锡的Lisp),五十年后你有一个动物园。 Common Lisp甚至从多个实现开始(针对不同的机器类型,操作系统,使用不同的编译器技术......)。
如今 Lisp是一个语言系列,而不是单一语言。甚至没有达成共识的是哪种语言属于该家庭。可能有一些标准需要检查(s表达式,函数,列表......),但不是每个Lisp方言都支持所有这些标准。语言设计者已经尝试了不同的功能,我们得到了许多或多或少类似Lisp的语言。
如果你看看Common Lisp,大约有三到四个不同的活跃商业供应商。试着让他们落后于一个产品!不行。然后你有一堆活跃的开源实现有不同的目标:一个编译为C,另一个编译为C,一个尝试有一个快速优化编译器,一个试图有一些middlle与本机编译,一个目标是JVM ......等等。试着告诉维护者放弃他们的实现!
Scheme有大约100个实现。许多人死了,或者大部分已经死了。至少有十到二十个活跃。有些是业余爱好项目。有些是大学项目,有些是公司的项目。 用户有不同的需求。一个人需要一个游戏的实时GC,另一个需要嵌入C,一个人只需要用于教育目的的准系统结构,等等。如何告诉开发人员不要破解他们的实施。
然后有些人不喜欢Commmon Lisp(太大,太旧,功能不够,没有面向对象,太快,不够快,......)。有些人不喜欢Scheme(太学术,太小,不能扩展,功能太多,功能不够,没有模块,错误的模块,不是正确的宏......)。
然后有人需要一个Lisp结合Objective-C,然后你得到Nu。有人为.net攻击了一些Lisp。然后你会得到一些带有并发性和新想法的Lisp,然后你就有了Clojure。
语言在工作中的演变。这就像寒武纪的爆炸(许多新动物出现时)。有些人会死,有些人会活着,有些会出现。在某个时间点出现了一些方言,它们掌握了艺术的现状(70年代/ 80年代Lisp中的函数编程方案和80年代MacLisp类似的Common Lisp) - 这导致一些方言大部分消失(即标准Lisp,InterLisp和其他)。
Common Lisp是Lisp方言的鳄鱼。这是一个非常古老的设计(一亿年),几乎没有变化,看起来有点可怕,并且不时会吃掉一些年轻人......
如果您想了解更多信息,The Evolution of Lisp(以及corresponding幻灯片)是一个非常好的开始!
答案 1 :(得分:14)
我认为这是因为“Lisp”是一种语言的广泛描述。我所知道的所有lisps中唯一常见的东西是括号,并使用前缀函数表示法。例如
(fun (+ 3 4))
然而,几乎所有其他内容都可能因实现而异。 Scheme和CL是完全不同的语言,应该被认为是这样。
我认为将lisp社区称为支离破碎就像将“C like”社区称为支离破碎。它有c,c ++,d,java,c#,go,javascript,python和许多其他我无法想到的语言。
总结:Lisp更像是一种语言属性(比如垃圾收集,静态类型)而不是实际的语言实现,所以很多语言都有类似Lisp的属性是完全正常的,就像许多语言都有垃圾一样集合。
答案 2 :(得分:10)
我认为这是因为Lisp诞生于并且保持了黑客文化的精神。黑客文化就是根据你对“更好”的看法,采取一些措施并使其“更好”。
因此,当你有一群自以为是的黑客和一种修改文化时,会发生碎片化。得到Scheme,Common Lisp,ELISP,Arc。这些都是非常不同的语言,但它们同时都是“Lisp”。
现在为什么社区支离破碎?好吧,我会把时间和成熟归咎于此。语言已有50年历史! : - )
答案 3 :(得分:8)
LISP并不像BASIC那样支离破碎。
有很多方言和版本的BASIC,我已经失去了数量。
即使是最常用的实现(MS VB),版本也不同。
答案 4 :(得分:8)
Scheme和Common Lisp是标准化的。 SBCL看起来像是事实上的开源lisp,并且有很多关于如何使用它的例子。它快速而且免费。 ClozureCL看起来也很不错。
PLT Scheme似乎是事实上的开源方案,并且有很多例子如何使用它。这是快速而自由的。
CL HyperSpec对我来说似乎和JavaDoc一样好。
就社区分裂而言,我认为这对标准或资源几乎没有影响。我认为这与直到最近相对较小的社区有很大关系。
Clojure我认为很有可能成为新一代编码人员的Lisp。
也许我的观点是一个非常流行的实现,只需要给出一个有凝聚力的社区的幻觉。
答案 5 :(得分:4)
Common LISP的许多实现应该被认为是一件好事。事实上,考虑到语言的相对受欢迎程度,考虑到C ++的免费实现与公共LISP的自由实现大致相同,这是非常了不起的。
免费的常见LISP实施包括CMU CL,SBCL,OpenMCL / Clozure CL,CLISP,GCL和ECL。
免费的C ++实现包括G ++(使用Cygwin和MinGW32变体),Digital Mars,Open Watcom,Borland C ++(遗留?)和CINT(解释器)。 C ++还有各种STL实现。
关于Scheme和Common LISP,尽管不可否认,有一个不准确的类比,有时我会考虑Scheme是通用LISP C是什么C到C ++,即Scheme和C小而优雅,Common LISP和C ++很大,(可以说)更适合大型应用。
答案 6 :(得分:3)
两个可能的促成因素:
与其他语言(如C / C ++ / Ruby等)相比,Lisp语言并不是非常受欢迎 - 仅此一点就可能产生一个支离破碎的社区的错觉。其他语言社区可能存在相同的碎片,但更大的社区将有更大的碎片..
Lisp语言比大多数语言更容易实现。我见过很多很多“玩具”Lisp实现人们为了解决特定任务而制作的有趣,许多“正确”的Lisp实现。有很多Lisp实现,比如说,Python解释器(我知道的是... 5,其中大多数通常是可以互换的)
有很多有前途的项目,比如Clojure,这是一种新语言,具有明确的目标(并发),没有太多的“历史包袱”,易于安装/设置,可以搭载Java的库“生态系统”,拥有一个好的网站有文档/图书馆,并有一个官方邮件列表。这几乎解决了我在不久前尝试学习Common Lisp时遇到的每个问题,并鼓励更集中的社区。 p>
答案 7 :(得分:3)
我的观点是Lisp是一种小语言,因此很容易实现(与Java,C#,C ......相比)。
注意:正如许多人评论说它确实不小,它会错过我的观点。让我试着更精确一点:这个降到入门点的价格。与构建处理LISP的VM相比,构建编译一些众所周知的主流语言的VM是很难的。这样就可以轻松地围绕一个小项目建立小型社区。现在图书馆和规范可能会或可能不会完全实施,但价值主张仍然存在。关闭它是R5RS肯定不在范围内的典型例子。
答案 8 :(得分:3)
有许多实现是有益的,因为每个实现在唯一的位置是最佳的。而现代主流语言无论如何都没有一个实现。想想Python:它的主要实现是CPython,但是由于JPython,你也可以在JVM上运行Python;感谢Stackless Python,你可以通过微线程获得大量的并发性;这样的实现在某些方面是可以包含的:JPython与Java无缝集成,而CPython则不能。 Ruby也是如此。
您不想要的是有许多与骨骼不兼容的实现。这就是Scheme的情况,你不能在不重写大量代码的情况下在实现之间共享库,因为Schemers无法就如何导入/导出库达成一致。由于核心区域的标准化,通用Lisp库OTOH更可能是可移植的,并且存在有条件地编写处理每个实现的特性的代码的工具。实际上,现在你可能会说Common Lisp是由它的实现定义的(想想ASDF包安装库),就像主流语言一样。