Racket与Scheme有何不同?

mud*_*dge 174 lisp scheme racket

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

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

Zor*_*orf 125

Racket最终基于R5RS,而不是R6RS而不是两者的严格超集.我不认为它可以称为'Scheme',因为它不会向后兼容任何Scheme标准.

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

  • 球拍没有set-cdr!set-car!,而set-mcar!后者只能在作为可变专门创建对.
  • 什么球拍电话letrecletrec*在R6RS和R5RS,什么R5RS和R6RS通话不存在letrec不存在球拍.
  • 在Racket中,很多东西都是自我评估的,这会引起R5RS的错误,最重要的是空列表.
  • Racket区分大小写,但R6RS也区分大小写
  • 球拍对待( ... )[ ... ]等效,R5RS没有,但R6RS确实如此.

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

  • 在Racket中`()`无效,不能自我评估.此外,Racket*确实*具有更受限制的`letrec` - 例如,`r5rs`语言中的那个; 在默认语言中使用`letrec*`-like版本是一种有意的选择. (23认同)
  • @Eli,哎呀,你是对的,在Swindle模式下运行的球拍似乎在考虑`()`自我评估,我对那个混淆了.我从来没有真正理解为什么`()`不能在Scheme中自我评估,因为它在Common Lisp中. (8认同)
  • 这个答案应该更新。Racket 的功能集远远超过现在的 Scheme,包括模块和语言定义等。 (3认同)
  • @Zorf它可以通过重载“#%app”轻松更改,但是:“#langracket(require(rename-inracket[#%appold]))(define-syntax#%app(syntax-rules()[ (_) '()] [(_ . 休息) (旧 . 休息)])) (null? ()) ;; =>#t` (2认同)

dei*_*nst 35

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

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

  • 我认为重命名是因为他们不想成为Scheme的一些方言,带有一堆非标准的附加内容 - 他们希望成为一种基于Scheme的语言,其中包含更多标准的东西.将PLT Scheme分类为"只是"Scheme的一种方言就像将Ruby归类为Mirah的一种方言 - 它并不是不准确的,但它有点淡化了语言的优点. (20认同)
  • 我认为使用不同的名称是一个明智的决定:对于具有共同起源的不同语言使用相同的名称是IMO令人困惑的.我会更改名称,即使语言包含Scheme作为子集但包含如此多的附加内容,它会鼓励一种非常不同的编程风格. (4认同)

Nor*_*ray 21

从PLT Scheme到Racket的名称更改的理由在Racket网站上进行了讨论.


Gau*_*tam 17

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

  • 为什么“匹配”会是一个不错的功能?至少,当您表达意见时,您应该对其做一个简短的解释,以便对Racket不熟悉的人可以理解为什么“匹配”在理论上是有益的。 (2认同)
  • 模式匹配是许多具有函数式编程背景的语言真正需要的功能,不幸的是,默认情况下甚至 R6RS 或 Common Lisp 都没有实现这一点,所以是的,这是 Racket 提供的一个非常好的差异化功能。例如 Haskell、Elixir、Rust 和 F# 等语言提供了这种类型的结构并且被大量使用。我个人主要在 Common Lisp 中进行 Lisp 编程,并且在很多情况下我怀念缺乏模式匹配实现。 (2认同)
  • `match` 非常好,但幸运的是它只是一个宏,所以它可以很容易地添加到没有它的 Lisps 中。Common Lisp 可以通过 `destructuring-bind` 对列表进行光模式匹配。基于它编写一个 `destructuring-case` 宏很简单,很多人都有。对于 Scheme,有可移植的 `match` 库。Clojure 有 `core.match`。 (2认同)

soe*_*ard 14

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

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

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

  • 分隔的延续(比呼叫/ cc更通用)
  • 继续标记
  • 线程
  • 地方
  • FFI

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

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

  • ...但它使 O(1) 列表附加不可能。 (4认同)

Chu*_*uck 10

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