Scheme 球拍和计划有什么不同?

Scheme 球拍和计划有什么不同?,scheme,lisp,racket,Scheme,Lisp,Racket,勒克特是阴谋的后代。球拍和R6RS有什么不同?它增加了什么,带走了什么,或者只是有所不同 我知道Racket不仅仅是一种语言,它是一个语言平台。但我指的是主要的Racket方言。举个大例子,Racket列表在默认情况下是不可变的,而Scheme是可变的。Racket还包括许多其他方案所没有的标准库(如Web服务器)。如上文所述,它包含不可变列表。它还包含一个比R6RS记录系统更干净的结构系统。它有一个面向对象的类和对象系统。它支持按合同设计。它有一个让人想起ML模块系统的单元系统,以及一个与R6

勒克特是阴谋的后代。球拍和R6RS有什么不同?它增加了什么,带走了什么,或者只是有所不同


我知道Racket不仅仅是一种语言,它是一个语言平台。但我指的是主要的Racket方言。

举个大例子,Racket列表在默认情况下是不可变的,而Scheme是可变的。Racket还包括许多其他方案所没有的标准库(如Web服务器)。

如上文所述,它包含不可变列表。它还包含一个比R6RS记录系统更干净的结构系统。它有一个面向对象的类和对象系统。它支持按合同设计。它有一个让人想起ML模块系统的单元系统,以及一个与R6RS模块系统非常相似的模块系统。我肯定我已经忘记了我提到的那么多事情


我不确定这个名字除了作为一个营销噱头之外是否有用,但racket绝对是这个计划的一种独特方言

Racket最终基于R5R,而不是R6R,也不是这两者的严格超集。我不认为它可以被称为“Scheme”,因为它与任何Scheme标准都不向后兼容

大多数实现都提供扩展,但在其他方面是向后兼容的,当然,Racket附带的编译器也可以在R5RS或R6RS模式下运行。在racket模式下运行的有效R5/6RS方案可能会被拒绝,导致运行时错误,或者表现出与应有的不同。话虽如此,其不向后兼容的要点如下:

  • 球拍没有
    设置cdr
    设置车辆,而不是
    设置mcar仅对专门创建为可变的对有效
  • Racket调用的
    letrec
    在R6RS中称为
    letrec*
    ,在R5RS中不存在,R5RS和R6RS调用的
    letrec
    在Racket中不存在
  • 在Racket中,很多事情都是自我评估,这会在R5R中产生错误,最重要的是空列表
  • Racket区分大小写,但R6RS也区分大小写
  • Racket将
    (…)
    […]
    视为等价物,R5RS没有,但R6RS有

可能还有更多,但在大多数其他部分,racket是Scheme的超集。

讨论了从PLT Scheme到racket的名称更改的基本原理。

racket包含了许多R6RS Scheme中未包含的非常好的语言结构,类似。

方案编程语言的语言规范R5RS基于多个方案实现者之间的共识。这意味着语言非常稳定。它还意味着许多有用的特性不是R5RS标准的一部分

球拍已经建立在R5R的基础上,并大大扩展了它。有些扩展被定义为宏,但有些功能需要运行时系统的支持

Racket中的功能不能单独由宏实现:

  • 分隔的连续体(比call/cc更通用)
  • 连续标记
  • 线程
  • 地点
  • 外国金融机构
模块和宏系统比RnRS规范更通用。 与
#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提供的一个非常好的、与众不同的特性。例如,像