球拍与Scheme有何不同?


183

球拍是Scheme的后代。球拍与R6RS有何不同?它增加了什么或带走了什么,或者只是有所不同?

我知道Racket不仅仅是一种语言,它还是多种语言的平台。但我指的是主要的Racket方言。

Answers:


131

球拍最终基于R5RS,而不是R6RS,也不是两者的严格超集。我不认为它可以称为“方案”,因为它与任何Scheme标准都不向后兼容。

大多数实现都提供了扩展,但是向后兼容,当然,Racket附带的编译器也可以在R5RS或R6RS模式下运行。在球拍模式下运行的有效R5 / 6RS方案可能会被拒绝,导致运行时错误或行为与预期不同。话虽如此,它不向后兼容的要点是:

  • Racket没有no set-cdr!set-car!,而set-mcar!只适用于专门创建为可变的对。
  • Racket调用在R6RS中letrec被调用letrec*,而在R5RS中不存在,R5RS和R6RS调用letrec在Racket中不存在。
  • 在Racket中,很多事情都是自我评估的,这会引起R5RS中的错误,最重要的是,空列表
  • 球拍区分大小写,尽管R6RS也区分大小写
  • 球拍对待( ... )[ ... ]等效,R5RS不会,但R6RS会。

可能还有更多,但在大多数其他部件上,球拍是Scheme的超集。


23
在「球拍」()中无效,无法自我评估。此外,球拍确实有更多的限制letrec-例如,一个在r5rs语言; 最好使用letrec*默认语言的-like版本。
Eli Barzilay

8
@ Eli,哎呀,你是对的,以骗子模式运行的球拍似乎正在考虑()自我评估,我对此感到困惑。我从来没有真正()理解为什么不像Common Lisp那样对Scheme进行自我评估。
佐夫

@Zorf但是,可以通过重载轻松更改它 #%app#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
SuzanneDupéron16年

1
该答案应进行更新。球拍的功能集远远超过了Scheme的功能,包括模块和语言定义等
。– CinchBlue

@VermillionAzure您的意思是,像Scheme的任何实际实现的功能集超过标准Scheme一样吗?
马里·里莫克

36

如上所述,它包含不可变列表。它还包含一个比R6RS记录系统更干净的结构系统。它具有面向对象的类和对象系统。它具有按合同设计的本地支持。它具有一个使人联想起ML模块系统的单元系统,以及一个类似于R6RS模块系统的模块系统。我敢肯定我已经忘记了很多我提到的事情。

我不确定重命名是否可以用作营销技巧之外的其他任何东西,但是球拍绝对是计划的独特方言。


23
我认为重命名是因为他们不想成为一堆带有非标准添加内容的Scheme方言-他们想成为一门基于Scheme的语言,具有更多东​​西标准。将PLT Scheme归类为Scheme的方言就像将Ruby归类为Mirah的方言一样-并不准确,但是有点低估了该语言的优势。
Chuck

5
我认为使用不同的名称是一个明智的决定:对于具有共同起源的不同语言使用相同的名称会使IMO感到困惑。即使该语言将Scheme作为子集包含在内,但如果添加的语言过多,我仍会更改其名称,以至于鼓励使用一种截然不同的编程风格。
乔治


17

Scheme编程语言的语言规范R5RS基于多个Scheme实现者之间的共识。这意味着该语言非常稳定。它还暗示许多有用的功能不是R5RS标准的一部分。

Racket建立在R5RS的基础上并对其进行了扩展。一些扩展定义为宏,但是某些功能需要运行时系统的支持。

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

  • 定界的延续(比call / cc更笼统)
  • 延续标记
  • 线程数
  • 地方
  • ffi

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

在某些情况下,Racket具有其行为不同于R5RS的构造。最明显的一个是使cons构造成为不可变对(mcons构造可变对)。具有不可变对的一个优点是,length现在可以在O(1)摊销时间内运行。


2
...但是它使O(1)列表无法追加。
内斯

16

Racket包含许多R6RS方案中未包含的非常好的语言构造,例如“ match”


2
为什么“匹配”会是一个不错的功能?至少,当您发表意见时,您应该对其做一个简短的解释,以便对Racket不熟悉的人可以理解为什么“匹配”在理论上是有益的。
nbro

1
模式匹配是许多具有功能编程背景的语言中真正需要的功能,不幸的是,默认情况下甚至R6RS或Common Lisp都不实现该功能,因此,这是Racket提供的一个非常好的差异化功能。例如,诸如Haskell,Elixir,Rust和F#之类的语言提供了这种类型的构造,并且被大量使用。我个人主要在Common Lisp中进行Lisp编程,在很多情况下,我想念缺少模式匹配实现的情况。
Manoel Vilela

match非常好,但是幸运的是,它只是一个宏,因此可以轻松将其添加到没有它的Lisps中。Common Lisp可以通过进行列表上的灯光模式匹配destructuring-binddestructuring-case基于它编写宏很简单,很多人都有。对于Scheme,有可移植的match库。Clojure有core.match
拉西

宏通常具有特殊的语义,因此可能会使代码难以阅读,因此该语言应始终标准化所有通用宏,以便每个人都不必构建自己的宏。模式匹配应该是默认值,就像在Arc&Clojure&Racket&Ocaml&Haskell中一样,因为它更直接指定意图。Caddr级别太低。
aoeu256

11

举一个大例子,球拍列表默认情况下是不可变的,而Scheme则是可变的。Racket还包括许多其他Scheme所没有的标准库(例如Web Server)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.