球拍是Scheme的后代。球拍和R6RS有什么不同?它增加了什么,拿走了什么,还是只是不同?
我知道球拍不仅仅是一门语言,它还是一个语言平台。但我指的是球拍族的主要方言。
球拍是Scheme的后代。球拍和R6RS有什么不同?它增加了什么,拿走了什么,还是只是不同?
我知道球拍不仅仅是一门语言,它还是一个语言平台。但我指的是球拍族的主要方言。
如上所述,它包含不可变列表。它还包含一个结构系统,比R6RS记录系统更清晰一些。它有一个面向对象的类和对象系统。它具有契约式设计的本机支持。它有一个类似ML模块系统的单元系统,也有一个类似R6RS模块系统的模块系统。我肯定我忘记了我提到的很多事情。
我不确定这个名字除了营销噱头之外还有什么用处,但球拍绝对是一种独特的方案方言。
球拍最终基于R5RS,而不是R6RS,也不是严格的R6RS超集。我不认为它可以被称为“Scheme”,因为它不向后兼容任何Scheme标准。
大多数实现提供了扩展,但在其他方面是向后兼容的,当然,球拍附带的编译器也可以在R5RS或R6RS模式下运行。在球拍模式下运行的有效R5/6RS方案可能会被拒绝,导致运行时错误,或表现与应有的不同。话虽如此,它不向后兼容的主要点是:
Racket has no set-cdr! and set-car!, rather set-mcar! which only works on pairs specifically created as mutable. What Racket calls letrec is called letrec* in R6RS and doesn't exist in R5RS, what R5RS and R6RS call letrec doesn't exist in Racket. In Racket, a lot of things are self-evaluating which would raise an error in R5RS, most importantly the empty list. Racket is case sensitive, though R6RS is also case sensitive Racket treats ( ... ) and [ ... ] as equivalent, R5RS does not, but R6RS does.
可能还有更多,但在大多数其他部分,球拍是Scheme的超集。
Scheme编程语言的语言规范R5RS基于多个Scheme实现者之间的共识。这意味着语言是非常稳定的。这也意味着许多有用的特性不是R5RS标准的一部分。
球拍在R5RS的基础上进行了很大的扩展。有些扩展被定义为宏,但有些特性需要运行时系统的支持。
球拍中不能单独通过宏实现的特性:
带分隔符的延续(比call/cc更通用) 延续标记 线程 的地方 ffi
模块和宏系统比RnRS规范更通用。 与#lang阅读器/语言规范一起,可以定义自定义语言(使用自定义语法),并将它们用于正常的球拍程序。
在少数情况下,球拍有行为偏离R5RS的构造。最明显的一个是让cons构造一个不可变对(mcons构造一个可变对)。拥有不可变对的一个好处是,长度现在在O(1)平摊时间内运行。