Common Lisp有很好的遗产吗?(学习Common Lisp或更现代的变体如Scheme会更好吗?)

dem*_*emi 15 lisp scheme common-lisp

我想学习Lisp家族的一些语言.它可能是CL或Scheme,并尝试将其用于Web编程.纯娱乐.我有很多C++经验(专业发展).

但我希望我的选择是没有遗产的现代语言(在语言本身和库中),因为我想从一开始就学习好的设计模式.

我无法决定什么是更好的:CL或Scheme.CL拥有更大更优质的库和框架(Weblocks),但我听说它在语法和库方面有很多遗产.Scheme是另一种:简单,简洁的语法但是库很差.如果它没有遗产,我更喜欢CL.

我不喜欢学习像C++这样的另一个怪物.CL是否像Lisp系列中的C++一样?而Scheme就像是C#或Java - "修订版"的C++.

编辑:我想写功能样式,OOP可能是,但可选.

Rai*_*wig 18

该计划是在70年代中期发明的.

CL从1982年开始开发.第一个定义发表于1984年:Common Lisp the Language.

该计划没有遗产或更现代是一个神话.Scheme已经在Common Lisp之前定义了近十年.Scheme仍然有s-expressions,cons单元格,符号,car,cdr,cons等遗留物.该方案有遗产使其成为Lisp语言家族的一员,其源于1958年的第一个Lisp语言.

Scheme的最初目标是成为一种比传统Lisp更接近lambda演算的小型语言.因此,词法绑定作为Lisp语言的默认是第一个.

不幸的是,它在许多其他方面都是一种玩具语言.它只有一小部分功能,你需要编写程序所需的功能,比如一种有用的错误处理方式.

十年之后Common Lisp的设计目标是不同的.它旨在编写商业软件,大型软件,高性能软件.另一个目标是它是Lisp方言主线(这里是Maclisp)的传统,因此已经拥有大型图书馆或程序的程序员不会从零开始.

Common Lisp从第一天开始就添加了很多被认为有用的功能:

  • 词法绑定作为默认值
  • 记录(称为结构)
  • 基础库
  • I/O
  • 类型声明
  • 参数列表与关键字参数
  • 编译器提示
  • 一位读者

以及更多.

在90年代中期,CL的修订版已经发布.它补充说:

  • 具有可选元对象协议的对象系统
  • 广泛的错误处理系统,条件系统

由于CL作为Scheme开始变大,因此一些设计决策使得CL比Scheme更好用.例如,Scheme只有原始参数列表,仅此一点就使得库更难使用.

Scheme对其标准进行了更多的修订,但基本的设计决策仍然存在,社区正在努力解决错误处理,记录,对象系统等基础问题.R6RS被证明是有争议的,我同意批评者的看法.我认为R6RS的方向和内容都非常令人失望.

还有另外两种观点:半标准和个别实施.

Scheme社区产生了许多半标准扩展.这应该被视为成功.

OTOH的实现在Scheme中广泛分歧.对他们几乎没有共识.有许多非常小的实现和许多大型实现.

CL实现OTOH已经包含一个大型语言,因此它们不会从小开始.关键字参数就在那里.对象系统也是如此.随着时间的推移,一些应用程序确保它们可以在许多实现上大致保持不变.此外,个别实现增加了许多功能,如Unicode支持,线程,并发执行等.

因此,当前的Lisp实现可以具有很多功能.

Common Lisp和Scheme共享Lisp的遗产:符号,s表达式,汽车,cdr,cons,cons基于单元格的列表,......等等.

Common Lisp有一些不太好的部分,但在标准中定义.一个例子是CL符号名称在内部是大写的."序列"的概念在标准中是不可扩展的.和更多.各个实现处理CL标准的许多限制.因此,例如在大多数实现中,I/O系统使用CLOS编写,条件基于CLOS,存在可扩展的SBCL序列等.

CL可能是一种庞大的语言,但它不是C++.许多部件设计出色,易于使用.由于Common Lisp是一种可编程编程语言,因此用户也可以修复许多问题.你不喜欢内置的LOOP吗?使用ITERATE,如果你更喜欢或甚至自己编写.

  • 使用Scheme几十年来获得的不仅仅是基本的错误处理.请参阅R6RS库中的异常内容.这是怎样的'最新'? (5认同)

per*_*erp 11

Common Lisp有许多特性,其中一些可能源于遗留(不知道我的Lisp历史是否足以肯定地说).有很多瑕疵,如功能命名和参数顺序的不一致.但实际语言本身虽然有点奇怪,但相当明智.不像C++ ......

Scheme也有瑕疵,但我认为程度较轻.另一方面,与CL相比,Scheme的标准库很小,因此疣的空间也较小.:-)

除了普通的CL和Scheme实现之外,你还有一些"下一代Lisps",比如Clojure(可能是它们中最"现代"的 - 从头开始​​设计用于重度并发)和newLISP,以及"下一代计划",球拍(以前称为PLT计划).

我个人对Racket印象非常深刻,我希望有一天能用它来做些什么.

  • 黛米:*什么*太慢了?你提到了web开发,但世界上有没有语言不够快(或者不能足够快)将字符推送到网络? (2认同)