Scheme 球拍和计划有什么不同?
勒克特是阴谋的后代。球拍和R6RS有什么不同?它增加了什么,带走了什么,或者只是有所不同Scheme 球拍和计划有什么不同?,scheme,lisp,racket,Scheme,Lisp,Racket,勒克特是阴谋的后代。球拍和R6RS有什么不同?它增加了什么,带走了什么,或者只是有所不同 我知道Racket不仅仅是一种语言,它是一个语言平台。但我指的是主要的Racket方言。举个大例子,Racket列表在默认情况下是不可变的,而Scheme是可变的。Racket还包括许多其他方案所没有的标准库(如Web服务器)。如上文所述,它包含不可变列表。它还包含一个比R6RS记录系统更干净的结构系统。它有一个面向对象的类和对象系统。它支持按合同设计。它有一个让人想起ML模块系统的单元系统,以及一个与R6
我知道Racket不仅仅是一种语言,它是一个语言平台。但我指的是主要的Racket方言。举个大例子,Racket列表在默认情况下是不可变的,而Scheme是可变的。Racket还包括许多其他方案所没有的标准库(如Web服务器)。如上文所述,它包含不可变列表。它还包含一个比R6RS记录系统更干净的结构系统。它有一个面向对象的类和对象系统。它支持按合同设计。它有一个让人想起ML模块系统的单元系统,以及一个与R6RS模块系统非常相似的模块系统。我肯定我已经忘记了我提到的那么多事情
我不确定这个名字除了作为一个营销噱头之外是否有用,但racket绝对是这个计划的一种独特方言 Racket最终基于R5R,而不是R6R,也不是这两者的严格超集。我不认为它可以被称为“Scheme”,因为它与任何Scheme标准都不向后兼容 大多数实现都提供扩展,但在其他方面是向后兼容的,当然,Racket附带的编译器也可以在R5RS或R6RS模式下运行。在racket模式下运行的有效R5/6RS方案可能会被拒绝,导致运行时错误,或者表现出与应有的不同。话虽如此,其不向后兼容的要点如下:
- 球拍没有
设置cdr代码>和
设置车辆代码>,而不是
设置mcar代码>仅对专门创建为可变的对有效
- Racket调用的
在R6RS中称为letrec
,在R5RS中不存在,R5RS和R6RS调用的letrec*
在Racket中不存在letrec
- 在Racket中,很多事情都是自我评估,这会在R5R中产生错误,最重要的是空列表
- Racket区分大小写,但R6RS也区分大小写
- Racket将
和(…)
视为等价物,R5RS没有,但R6RS有[…]
可能还有更多,但在大多数其他部分,racket是Scheme的超集。讨论了从PLT Scheme到racket的名称更改的基本原理。racket包含了许多R6RS Scheme中未包含的非常好的语言结构,类似。方案编程语言的语言规范R5RS基于多个方案实现者之间的共识。这意味着语言非常稳定。它还意味着许多有用的特性不是R5RS标准的一部分 球拍已经建立在R5R的基础上,并大大扩展了它。有些扩展被定义为宏,但有些功能需要运行时系统的支持 Racket中的功能不能单独由宏实现:
- 分隔的连续体(比call/cc更通用)
- 连续标记
- 线程
- 地点
- 外国金融机构
#lang
阅读器/语言规范一起,可以定义自定义语言(使用自定义语法)并将其用于普通的Racket程序
在少数情况下,Racket具有行为偏离R5R的结构。最明显的一个是使
cons
构造一个不可变对(mcons
构造一个可变对)。拥有不可变对的一个优点是,length
现在运行在O(1)个摊销时间内。我认为重命名是因为他们不想成为Scheme的某个方言,有一堆非标准的添加-他们想成为一种基于Scheme的语言,有一堆更标准的东西。将PLT Scheme归类为“仅仅”Scheme方言就像将Ruby归类为Mirah方言一样——这并不不准确,但它有点淡化了该语言的优势。我认为使用不同的名称是一个明智的决定:对具有共同起源的不同语言使用相同的名称是令人困惑的。我会更改名称,即使该语言包含Scheme作为一个子集,但包含太多的附加内容,这将鼓励一种非常不同的编程风格。在Racket()
中,它是无效的,不是自评估的。另外,Racket确实有更严格的letrec
——例如,使用r5rs
语言的;在默认语言中使用<代码> LeReC*类似的版本是一个有意的选择。@ Eli,哎呀,你说得对,在诈骗模式下运行的球拍似乎考虑<代码>(代码)< /代码>自我评估,我和那个混淆了。我从来没有真正理解为什么(
在Scheme中没有像在普通的Lisp中那样进行自我评估。@Zorf它可以通过重载#%app
很容易改变,但是:#lang racket(require(在racket中重命名[#%app old])(定义语法#%app(语法规则()[((#))[(语法规则())[((语法规则)][((语法规则)][((语法规则)][(((语法规则)][(((语法规则)][(语法规则)](语法规则)](((((语法规则)])))(空?)=>#t应更新此答案。Racket的功能集远远超过Scheme的功能集,包括模块和语言定义等。@MaliRemorker我不完全理解你的意思,但Scheme目前在R7RS上,以前在R6RS上。但Racket仍然在R6RS功能集之外。。。。但是它使O(1)列表附加变得不可能。为什么“匹配”是一个很好的特性呢?至少,当你表达一个观点时,你应该给出一个简短的解释,这样不熟悉Racket的人就可以理解为什么“匹配”在理论上是有益的。模式匹配是许多有函数式编程背景的语言真正需要的功能,不幸的是,R6RS或CommonLisp在默认情况下都没有实现这一点,所以是的,这是Racket提供的一个非常好的、与众不同的特性。例如,像