球拍与计划有什么不同?

球拍是Scheme的后裔。 Racket与R6RS有什么不同? 它增加了什么,或带走了什么,或者只是不同?

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

球拍最终基于R5RS,而不是R6RS,也不是严格的超集。 我不认为它可以被称为“计划”,因为它不符合任何计划标准。

大多数实现提供扩展,但是向后兼容,当然,Racket自带的编译器也可以在R5RS或R6RS模式下运行。 在球拍模式下运行的有效R5 / 6RSscheme可能会被拒绝,导致运行时错误,或者行为不同。 有了这个说法,它不是向后兼容的要点是:

  • 球拍没有set-cdr!set-car! ,而不是set-mcar! 这只适用于专门创build为可变的配对。
  • Racket调用的letrec在R6RS中称为letrec* ,在R5RS中不存在,R5RS和R6RS调用letrec在Racket中不存在。
  • 在Racket中,很多事情都是自我评估,这会在R5RS中产生一个错误, 最重要的是空列表
  • 球拍区分大小写,但R6RS也是区分大小写的
  • 球拍对待( ... )和等效,R5RS不,但R6RS的确如此。

可能还有更多,但是大部分其他部分的球拍是Scheme的超集。

它包含不可变列表,如上所述。 它还包含一个比R6RSlogging系统更清洁的结构系统。 它有一个面向对象的类和对象系统。 它有合同devise的本地支持。 它有一个让人想起ML模块系统的单元系统,以及与R6RS模块系统非常类似的模块系统。 我确定我已经忘记了我刚刚提到的许多事情。

我不确定这个重新命名是否有用,除了营销噱头之外,但是拍子肯定是一个独特的scheme。

球拍网站上讨论了从PLTscheme到球拍名称的理由。

球拍包括许多R6RSscheme中没有包含的非常好的语言结构,比如“match” 。

Scheme编程语言中的语言规范R5RS基于多个Scheme实现者之间的一致意见。 这意味着这个语言非常稳定。 这也意味着许多有用的function不是R5RS标准的一部分。

球拍已经build立在R5RS上,并且得到了极大的扩展。 一些扩展被定义为macros,但是某些function需要运行时系统的支持。

球拍中的function不能由macros单独实施:

  • 定界延续(比call / cc更一般)
  • 连续标记
  • 线程
  • 地方
  • FFI

模块和macros系统比RnRS规范更普遍。 与#lang读取器/语言规范一起,可以定义自定义语言(使用自定义语法),并将其用于正常的球拍程序。

在一些情况下,球拍具有其行为偏离R5RS的构造。 最明显的一点就是把cons构造成一个不可变对( mcons构造一个可变对)。 具有不可变对的一个优点是length现在运行在O(1)摊销时间。

举一个大的例子,默认情况下球拍列表是不可变的,而Scheme是可变的。 球拍还包括很多标准库(如Web服务器),其他scheme没有。