Answers:
球拍最终基于R5RS,而不是R6RS,也不是两者的严格超集。我不认为它可以称为“方案”,因为它与任何Scheme标准都不向后兼容。
大多数实现都提供了扩展,但是向后兼容,当然,Racket附带的编译器也可以在R5RS或R6RS模式下运行。在球拍模式下运行的有效R5 / 6RS方案可能会被拒绝,导致运行时错误或行为与预期不同。话虽如此,它不向后兼容的要点是:
set-cdr!
和set-car!
,而set-mcar!
只适用于专门创建为可变的对。letrec
被调用letrec*
,而在R5RS中不存在,R5RS和R6RS调用letrec
在Racket中不存在。( ... )
并[ ... ]
等效,R5RS不会,但R6RS会。可能还有更多,但在大多数其他部件上,球拍是Scheme的超集。
()
自我评估,我对此感到困惑。我从来没有真正()
理解为什么不像Common Lisp那样对Scheme进行自我评估。
#%app
:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
如上所述,它包含不可变列表。它还包含一个比R6RS记录系统更干净的结构系统。它具有面向对象的类和对象系统。它具有按合同设计的本地支持。它具有一个使人联想起ML模块系统的单元系统,以及一个类似于R6RS模块系统的模块系统。我敢肯定我已经忘记了很多我提到的事情。
我不确定重命名是否可以用作营销技巧之外的其他任何东西,但是球拍绝对是计划的独特方言。
在Racket网站上讨论了将名称从PLT计划更改为Racket的理由。
Scheme编程语言的语言规范R5RS基于多个Scheme实现者之间的共识。这意味着该语言非常稳定。它还暗示许多有用的功能不是R5RS标准的一部分。
Racket建立在R5RS的基础上并对其进行了扩展。一些扩展定义为宏,但是某些功能需要运行时系统的支持。
Racket中的功能无法单独通过宏实现:
模块和宏系统比RnRS规范更通用。结合#lang
阅读器/语言规范,可以定义自定义语言(具有自定义语法)并将其与普通的Racket程序一起使用。
在某些情况下,Racket具有其行为不同于R5RS的构造。最明显的一个是使cons
构造成为不可变对(mcons
构造可变对)。具有不可变对的一个优点是,length
现在可以在O(1)摊销时间内运行。
Racket包含许多R6RS方案中未包含的非常好的语言构造,例如“ match”。
match
非常好,但是幸运的是,它只是一个宏,因此可以轻松将其添加到没有它的Lisps中。Common Lisp可以通过进行列表上的灯光模式匹配destructuring-bind
。destructuring-case
基于它编写宏很简单,很多人都有。对于Scheme,有可移植的match
库。Clojure有core.match
。
()
中无效,无法自我评估。此外,球拍确实有更多的限制letrec
-例如,一个在r5rs
语言; 最好使用letrec*
默认语言的-like版本。