球拍与计划有什么不同?
球拍是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没有。