The*_*uck 71 lisp scheme common-lisp sicp racket
注意:我不是在问哪个学习,哪个更好,或者类似的东西.
我拿起SICP的免费版本,因为我觉得阅读会很好(我听说过很好的东西,而且我对这种编程方面很感兴趣).
我知道Scheme是Lisp的一种方言,我想知道:Scheme和Common Lisp之间的实际区别是什么?
似乎有很多关于'CL有一个更大的stdlib ...方案对现实世界的编程不好......'但实际上并没有说'这是因为CL就是这个/有这个'.
Mat*_*ard 92
这是一个棘手的问题,因为差异既是技术性的,也是(更重要的是,在我看来)文化差异.答案只能提供不精确的主观观点.这就是我要在这里提供的内容.有关一些原始技术细节,请参阅Scheme Wiki.
Scheme是一种语言,其基础是提供优雅,一致,深思熟虑的基础语言基础,可以构建实用和学术应用语言.
您很少会找到使用纯R5RS(或R6RS)方案编写应用程序的人,并且由于简约标准,大多数代码都不能跨Scheme实现移植.这意味着如果您想编写某种最终用户应用程序,则必须仔细选择您的Scheme实现,因为选择将在很大程度上决定您可以使用哪些库.另一方面,设计实际应用语言的相对自由意味着Scheme实现通常提供其他地方闻所未闻的功能; 例如,PLT Racket使您能够使用静态类型,并提供一个非常语言感知的IDE.
超出基本语言的互操作性是通过社区驱动的SRFI流程提供的,但任何给定SRFI的可用性因实施而异.
大多数Scheme方言和库都专注于函数式编程习语,如递归而不是迭代.当您想要进行OOP时,可以将各种对象系统作为库加载,但与现有代码的集成在很大程度上取决于Scheme方言及其周围文化(例如,Chicken Scheme似乎比Racket更面向对象).
交互式节目是Scheme子社区不同的另一点.MIT Scheme以强大的交互支持着称,而PLT Racket则更为静态.在任何情况下,交互式编程似乎都不是大多数Scheme子社区的核心问题,我还没有看到编程环境与大多数Common Lisp一样具有交互性.
Common Lisp是一种专为实际编程而设计的战斗语言.它充满了丑陋的疣和兼容性黑客 - 与Scheme的优雅极简主义完全相反.但它本身就更有特色.
Common Lisp已经培育了一个相对庞大的便携式库生态系统.您通常可以随时切换实现,即使在应用程序部署之后也没有太多麻烦.总的来说,Common Lisp比Scheme更加统一,如果完成的话,更激进的语言实验通常被嵌入为可移植的库而不是定义一种全新的语言方言.因此,语言扩展往往更加保守,但也更易于组合(通常是可选的).
像外来函数接口这样非常有用的语言扩展不是通过正式手段开发的,而是依赖于所有主要Common Lisp实现上可用的准标准库.
语言习语是功能性,命令式和面向对象方法的混合体,一般来说,Common Lisp更像是命令式语言而不是功能性语言.它也是非常动态的,可以说比任何流行的动态脚本语言都要多(例如,类重新定义适用于现有实例,并且条件处理系统具有内置的交互性),而交互式,探索性编程是其中的重要部分. "Common Lisp方式." 这也体现在Common Lisp可用的编程环境中,几乎所有这些环境都提供了与运行的Lisp编译器的某种直接交互.
Common Lisp具有内置对象系统(CLOS),一种条件处理系统,比异常处理,运行时可修补性以及各种内置数据结构和实用程序(包括臭名昭着的LOOP宏,迭代)强大得多.对于Scheme而言,子语言太难看了,更不用说了,以及在格式字符串中支持GOTO的类似printf的格式化机制.
由于基于图像的交互式开发,以及由于语言较大,Lisp实现在操作系统中的可移植性通常低于Scheme实现.例如,让Common Lisp在嵌入式设备上运行并不适合胆小的人.与Java虚拟机类似,您也往往会在虚拟内存受限的计算机上遇到问题(如基于OpenVZ的虚拟服务器).另一方面,方案实现往往更紧凑和便携.ECL实施质量的提高在一定程度上缓解了这一点,尽管其本质仍然是正确的.
如果您关心商业支持,有几家公司提供自己的Common Lisp实现,包括图形化GUI构建器,专用数据库系统等等.
总而言之,Scheme是一种设计更优雅的语言.它主要是一种具有一些动态特性的函数式语言.它的实现代表了各种具有鲜明特征的不兼容方言.Common Lisp是一种功能齐全,高度动态,多范式的语言,具有各种丑陋但实用的特性,其实现在很大程度上是彼此兼容的.Scheme Lis方言比Common Lisp更倾向于静态且交互性更小; 常见的Lisp实现往往更重,更难以安装.
无论你选择哪种语言,我都祝你玩得愉快!:)
new*_*cct 19
一些基本的实际差异:
(function ...),并使用显式调用存储在值中的函数(funcall ...)nil(空列表)被视为false(例如in if),并且是唯一的false值.在Scheme中,空列表被认为是真的,而(distinct)#f是唯一的假值这是一个难以公正回答的难题,特别是因为许多LISP人员会将Scheme归类为LISP.
乔什布洛赫(这个类比可能不是他的发明)描述选择一种语言就像选择一家当地酒吧一样.那么,那么:
"Scheme"酒吧里面有很多编程语言研究人员.这些人非常关注语言的含义,保持定义和简单,并讨论创新的新功能.每个人都有自己的语言版本,旨在让他们探索自己特定的编程语言角落.Scheme人们非常喜欢他们从LISP获取的带括号的语法; 它灵活,轻便,统一,消除了语言扩展的许多障碍.
"LISP"酒吧?嗯......我不应该评论; 我没有在那里度过足够的时间:).