Racket是Scheme的后代 . Racket与R6RS有何不同?它添加或带走了什么,或者只是不同?
据我所知,Racket不仅仅是一种语言,它还是一种语言平台 . 但我指的是主要的球拍方言 .
Racket最终基于R5RS,而不是R6RS而不是两者的严格超集 . 我不认为它可以称为'Scheme',因为它不会向后兼容任何Scheme标准 .
大多数实现都提供扩展,但在其他方面是向后兼容的,当然,Racket附带的编译器也可以在R5RS或R6RS模式下运行 . 在球拍模式下运行的有效R5 / 6RS方案可能会被拒绝,导致运行时错误,或者表现得与应有的不同 . 话虽如此,它不向后兼容的要点是:
球拍没有 set-cdr! 和 set-car! ,而是 set-mcar! ,它只适用于专门创建为可变对的对 .
set-cdr!
set-car!
set-mcar!
在R6RS中,Racket调用 letrec 被称为 letrec* ,在R5RS中不存在,R5RS和R6RS在Racket中不存在 letrec .
letrec
letrec*
在Racket中,很多东西都是自我评估的,这会引起R5RS的错误,最重要的是空列表 .
Racket区分大小写,但R6RS也区分大小写
球拍将 ( ... ) 和 [ ... ] 视为等效,R5RS不是,但R6RS确实如此 .
( ... )
[ ... ]
可能还有更多,但在大多数其他部分,球拍是Scheme的超集 .
它包含不可变列表,如上所述 . 它还包含一个比R6RS记录系统更清洁的结构系统 . 它有一个面向对象的类和对象系统 . 它通过 Contract 对设计进行原生支持 . 它具有让人联想到ML模块系统的单元系统,以及与R6RS模块系统非常相似的模块系统 . 我确信我已经忘记了我提到过的很多东西 .
我不确定重命名是否比营销噱头更有用,但球拍绝对是一种独特的方案方言 .
从PLT Scheme到Racket的名称变更的理由被讨论on the Racket site .
Racket包含很多非常好的语言结构,不包括在R6RS方案中,如"match" .
Scheme编程语言的语言规范R5RS基于多个Scheme实现者之间的共识 . 这意味着语言非常稳定 . 它还意味着许多有用的功能不属于R5RS标准 .
Racket以R5RS为基础并进行了大量扩展 . 某些扩展定义为宏,但某些功能需要运行时系统的支持 .
Racket中的功能无法单独由宏实现:
分隔的延续(比call / cc更通用)
继续标记
个帖子
个地方
ffi
模块和宏系统比RnRS规范更通用 . 与 #lang 阅读器/语言规范一起,可以定义自定义语言(使用自定义语法)并将其与普通的Racket程序一起使用 .
#lang
在少数情况下,Racket的构造行为与R5RS不同 . 最明显的一个是使 cons 构造一个不可变对( mcons 构造一个可变对) . 具有不可变对的一个优点是 length 现在在O(1)摊销时间内运行 .
cons
mcons
length
举一个很好的例子,默认情况下,Racket列表是不可变的,而Scheme是可变的 . Racket还包括许多标准库(例如Web服务器),而其他方案则没有 .
6 回答
Racket最终基于R5RS,而不是R6RS而不是两者的严格超集 . 我不认为它可以称为'Scheme',因为它不会向后兼容任何Scheme标准 .
大多数实现都提供扩展,但在其他方面是向后兼容的,当然,Racket附带的编译器也可以在R5RS或R6RS模式下运行 . 在球拍模式下运行的有效R5 / 6RS方案可能会被拒绝,导致运行时错误,或者表现得与应有的不同 . 话虽如此,它不向后兼容的要点是:
球拍没有
set-cdr!
和set-car!
,而是set-mcar!
,它只适用于专门创建为可变对的对 .在R6RS中,Racket调用
letrec
被称为letrec*
,在R5RS中不存在,R5RS和R6RS在Racket中不存在letrec
.在Racket中,很多东西都是自我评估的,这会引起R5RS的错误,最重要的是空列表 .
Racket区分大小写,但R6RS也区分大小写
球拍将
( ... )
和[ ... ]
视为等效,R5RS不是,但R6RS确实如此 .可能还有更多,但在大多数其他部分,球拍是Scheme的超集 .
它包含不可变列表,如上所述 . 它还包含一个比R6RS记录系统更清洁的结构系统 . 它有一个面向对象的类和对象系统 . 它通过 Contract 对设计进行原生支持 . 它具有让人联想到ML模块系统的单元系统,以及与R6RS模块系统非常相似的模块系统 . 我确信我已经忘记了我提到过的很多东西 .
我不确定重命名是否比营销噱头更有用,但球拍绝对是一种独特的方案方言 .
从PLT Scheme到Racket的名称变更的理由被讨论on the Racket site .
Racket包含很多非常好的语言结构,不包括在R6RS方案中,如"match" .
Scheme编程语言的语言规范R5RS基于多个Scheme实现者之间的共识 . 这意味着语言非常稳定 . 它还意味着许多有用的功能不属于R5RS标准 .
Racket以R5RS为基础并进行了大量扩展 . 某些扩展定义为宏,但某些功能需要运行时系统的支持 .
Racket中的功能无法单独由宏实现:
分隔的延续(比call / cc更通用)
继续标记
个帖子
个地方
ffi
模块和宏系统比RnRS规范更通用 . 与
#lang
阅读器/语言规范一起,可以定义自定义语言(使用自定义语法)并将其与普通的Racket程序一起使用 .在少数情况下,Racket的构造行为与R5RS不同 . 最明显的一个是使
cons
构造一个不可变对(mcons
构造一个可变对) . 具有不可变对的一个优点是length
现在在O(1)摊销时间内运行 .举一个很好的例子,默认情况下,Racket列表是不可变的,而Scheme是可变的 . Racket还包括许多标准库(例如Web服务器),而其他方案则没有 .