首页 文章

Racket与Scheme有何不同?

提问于
浏览
157

Racket是Scheme的后代 . Racket与R6RS有何不同?它添加或带走了什么,或者只是不同?

据我所知,Racket不仅仅是一种语言,它还是一种语言平台 . 但我指的是主要的球拍方言 .

6 回答

  • 11

    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的超集 .

  • 19

    它包含不可变列表,如上所述 . 它还包含一个比R6RS记录系统更清洁的结构系统 . 它有一个面向对象的类和对象系统 . 它通过 Contract 对设计进行原生支持 . 它具有让人联想到ML模块系统的单元系统,以及与R6RS模块系统非常相似的模块系统 . 我确信我已经忘记了我提到过的很多东西 .

    我不确定重命名是否比营销噱头更有用,但球拍绝对是一种独特的方案方言 .

  • 31

    从PLT Scheme到Racket的名称变更的理由被讨论on the Racket site .

  • 14

    Racket包含很多非常好的语言结构,不包括在R6RS方案中,如"match" .

  • 9

    Scheme编程语言的语言规范R5RS基于多个Scheme实现者之间的共识 . 这意味着语言非常稳定 . 它还意味着许多有用的功能不属于R5RS标准 .

    Racket以R5RS为基础并进行了大量扩展 . 某些扩展定义为宏,但某些功能需要运行时系统的支持 .

    Racket中的功能无法单独由宏实现:

    • 分隔的延续(比call / cc更通用)

    • 继续标记

    • 个帖子

    • 个地方

    • ffi

    模块和宏系统比RnRS规范更通用 . 与 #lang 阅读器/语言规范一起,可以定义自定义语言(使用自定义语法)并将其与普通的Racket程序一起使用 .

    在少数情况下,Racket的构造行为与R5RS不同 . 最明显的一个是使 cons 构造一个不可变对( mcons 构造一个可变对) . 具有不可变对的一个优点是 length 现在在O(1)摊销时间内运行 .

  • 114

    举一个很好的例子,默认情况下,Racket列表是不可变的,而Scheme是可变的 . Racket还包括许多标准库(例如Web服务器),而其他方案则没有 .

相关问题