Scheme和Racket有什么不同?如果有,是什么?

11

我注意到人们在Stack Overflow(以及其他网站上)经常将Scheme和Racket视为同一种语言。例如,关于Scheme的问题通常会在Racket中得到解决。如果您查看标记为的问题,您会发现其中有一半答案以#lang racket开头。

这两种语言是否真的如此相似,可以被认为是相等的? Racket只是Scheme的扩展(即,在Racket解释器上始终可以运行Scheme代码)吗?

我想强调的是,这不是一个争论,只是一个正在学习Scheme编程语言的人的问题。


@Lord Torgamus:非常感谢您的编辑 :) 这正是我想说的! - Aslan986
2
Racket和Scheme有何不同? - Janus Troelsen
可能是如何区分Racket和Scheme?的重复问题。 - Alex M.
2个回答

15

Racket非常接近Scheme,实际上直到两年前它还被称为PLT Scheme。

然而,在Racket中使用的默认语言在一些地方与Scheme有所不同(最显著的是它具有不可变的对)。这并不是什么新鲜事:当它被称为PLT Scheme时,它就有类似的差异。这也不是Racket独有的:Scheme标准非常简约,定义的语言是不实用的,这意味着所有 Scheme实现都会添加自己的扩展。Racket案例中另一个重要点是定义新方言非常容易 - Racket 实现了一个严格的R5RS方言(由于其严格性,它并不是很有用),同时它也实现了一个R6RS方言。


1
此外,请注意,Scheme 语言的本质意味着“语言扩展”和“附加便利库”的区别非常模糊,其中包括语法宏等。 - ithisa

6
不,它们并不相等。然而,Racket实现可以运行标准的Scheme代码。Scheme由标准定义,而Racket没有。如果您需要可移植性,可以编写R6RS代码并使用Racket执行。
Racket不是Scheme的超集或子集。

1
“解释器”在多个层面上都是虚假的。 - Eli Barzilay
1
@EliBarzilay 你更想看到哪个词? - Janus Troelsen
5
Racket是一个编译器。它将Racket代码编译成字节码,然后使用JIT编译器将字节码编译成机器码。但是,“解释器”和“编译器”的区别在现在已经没什么意义了。 - Eli Barzilay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接