Scheme和Common Lisp之间的实际区别是什么? (或Lisp的任何其他两种方言)
注意:我不是问要学哪个,哪个更好,或者类似的东西。
我拿起了SICP的免费版本,因为我觉得阅读起来不错(我听说过很好的东西,而且我对这种编程方面很感兴趣)。
我知道Scheme是Lisp的一种方言,我想知道:Scheme和Common Lisp之间的实际区别是什么?
似乎有很多关于“CL有一个更大的stdlib … Scheme对现实世界的编程不好”,但没有实际的事情说“这是因为CL是这个/有这个”。
这是一个棘手的问题,因为差异是技术性的(更重要的是在我看来)文化。 答案只能提供一个不精确的,主观的观点。 这是我要在这里提供的。 有关原始技术细节,请参阅Scheme Wiki 。
Scheme是一种build立在提供优雅,一致,深思熟虑的基础语言基础的基础上的语言,可以使用实际的和学术的应用语言。
很less有人会发现有人用纯R5RS(或R6RS)scheme编写应用程序,并且由于极简标准,大多数代码在整个Scheme实现中不可移植。 这意味着,如果您想编写某种最终用户应用程序,则必须仔细select您的Scheme实现,因为select将主要决定哪些库可供您使用。 另一方面,devise实际应用程序语言的相对自由意味着Scheme实现往往提供其他地方闻所未闻的特性; PLT Racket,例如,使您能够使用静态打字,并提供一个非常有语言意识的IDE。
基础语言之外的互操作性是通过社区驱动的SRFI过程提供的,但是任何给定SRFI的可用性因实施而异。
大多数scheme方言和图书馆都把重点放在函数式编程习惯上,比如recursion而不是迭代。 当你想做OOP时,有许多对象系统可以作为库加载,但是与现有代码的集成很大程度上依赖于Scheme方言及其周围的文化(例如,Chicken Scheme似乎比Racket更面向对象)。
交互式编程是Scheme子社区的另一个不同之处。麻省理工学院的计划以强大的互动性支持着称,而PLT球拍则更加静态。 在任何情况下,交互式编程似乎都不是大多数Scheme子小组的核心问题,而且我还没有看到与大多数Common Lisp具有类似交互性的编程环境。
Common Lisp是为实际编程devise的战斗用语言。 它充满了丑陋的疣和兼容性黑客 – 完全相反的计划的优雅简约。 但是,它本身也更有特色。
Common Lisp育出了一个相对较大的便携式图书馆生态系统。 通常,即使在部署应用程序之后,您也可以随时切换实现,而不会有太多的麻烦。 总的来说,Common Lisp比Scheme更统一,更激进的语言实验,如果完成的话,通常embedded作为一个便携式的库,而不是定义一个全新的语言方言。 正因为如此,语言扩展往往是更保守,但也更可组合(通常是可选的)。
像外部函数接口这样的通用语言扩展并不是通过正式手段来开发的,而是依赖于所有主要的Common Lisp实现中可用的准标准库。
语言习语是function性,必要性和面向对象方法的混合体,通常,Common Lisp更像是一种命令性语言,而不是function性语言。 它也是非常dynamic的,可以说比任何stream行的dynamic脚本语言(例如,类重定义适用于现有的实例,并且条件处理系统具有内置的交互性)更可靠,并且交互式探索性编程是“Common Lisp方式”。 这也反映在Common Lisp可用的编程环境中,实际上所有这些都提供了与正在运行的Lisp编译器的某种直接交互。
Common Lisp具有一个内置对象系统(CLOS),一个条件处理系统比单纯的exception处理,运行时可分性以及各种内置的数据结构和实用程序(包括臭名昭着的LOOPmacros,迭代子语言对于Scheme来说太难看了,但是太不用说了,以及格式化string中带有GOTO支持的类似printf的格式化机制)。
无论是基于图像的交互式开发,还是由于更大的语言,Lisp实现在操作系统上的可移植性通常都比Scheme实现要低。 例如,让一个Common Lisp在embedded式设备上运行并不是一件容易的事情。 与Java虚拟机类似,在虚拟内存受到限制的计算机上(例如基于OpenVZ的虚拟服务器),也往往遇到问题。 另一方面,Scheme的实现往往更加紧凑和便携。 ECL实施的质量越来越高,这一点有所缓解,尽pipe其本质依然如此。
如果您关心商业支持,有几家公司提供自己的Common Lisp实现,包括graphics化GUI构build器,专用数据库系统等等。
总之 ,Scheme是一种更优雅的语言。 它主要是一些具有一些dynamic特征的function语言。 它的实现代表了各种不相容的方言,具有鲜明的特点。 Common Lisp是一种完全成熟的,高度dynamic的多范式语言,具有各种丑陋但实用的特征,其实现在很大程度上相互兼容。 Scheme语言往往比Common Lisp更静态,交互性更差; Common Lisp实现往往比较笨重,难以安装。
无论您select哪种语言,我都祝您玩得开心! 🙂
一些基本的实际区别:
- Common Lisp具有独立的variables和函数作用域; 而在Scheme中只有一个范围 – 函数是值,定义一个具有特定名称的函数只是定义一个设置为lambda的variables。 因此,在Scheme中,你可以使用一个函数名作为variables,并将其存储或传递给其他函数,然后使用该variables执行一个调用,就像它是一个函数一样。 但在Common Lisp中,需要使用
(function ...)
显式地将函数转换为值,并使用(funcall ...)
显式地调用存储在值中的函数 - 在Common Lisp中,
nil
(空列表)被认为是错误的(例如if
),并且是唯一的错误值。 在Scheme中,空列表被认为是真的,并且(不同的)#f
是唯一的假值
这是一个很难回答公平的问题,尤其是因为很多LISP人员都会将LISP分类。
乔希布洛赫(这个比喻可能不是他的发明)描述select一种语言就像select一个当地的酒吧。 那么,那么:
“计划”酒吧里有很多编程语言的研究人员。 这些人对语言的含义,保持清晰和简单,以及讨论创新的新特征,都非常关注。 每个人都有自己的语言版本,旨在让他们探索自己的编程语言的特定angular落。 该计划的人员真的很喜欢他们从LISP采取的括号语法; 它是灵活的,轻量级和统一的,消除了语言扩展的许多障碍。
“LISP”酒吧? 那么…我不该评论; 我没有花足够的时间在那里:)。
scheme:
- 原本很less的规格(新的R7RS似乎更重)
- 由于语法简单,scheme可以快速学习
- 实现提供了额外的function,但名称在不同的实现中可能有所不同
常见的lisp:
- 许多function是由更大的规格定义的
- 函数和variables的不同名称空间(lisp-2)
这是一些点,肯定还有更多的,我现在不记得了。