Scheme和Racket的#lang指令之间的区别

25

我猜想 #lang racket 是 Scheme 的一种方言,有更多预设的结构和常用函数,或许更适合教学。相比 #lang scheme,#lang racket 有哪些优势呢?

使用 #lang scheme 在 racket 中,是否最好(甚至可行)来跟进《计算机程序的构造和解释》或者《如何设计程序》的内容。HtDP 是 #lang racket 特定的吗?

#lang scheme 写的代码只要没有引入库,在 chicken scheme 或其他主要解释器中都可以使用吗?

提前致谢。


1
可能是重复的问题:Racket和Scheme有何不同? - Alex M.
1个回答

35
  1. 是的,#lang racket 是 Racket 的默认语言方言,并且有很多扩展功能。

  2. 两个地方不是扩展功能: if 必须有 else 分支,以及对偶(pair)是不可变的(没有 set-car!set-cdr!)。

  3. #lang scheme 在名称更改之前一段时间内使用过,现在已经一致使用 #lang racket。但我们为了兼容性仍然保留了 #lang scheme(以及各种 scheme/--- 库,这些库有时可能与 racket/--- 对应物不同)。在新代码中没有理由使用 #lang scheme

  4. 要遵循SICP,请不要使用任何这些内容 - 有一个可用的SICP语言 (可以使用 #lang sicp),最初由Neil Van Dyke编写,但现在由Racket社区维护。

  5. 要遵循HtDP,请不要使用任何这些内容,使用学生语言。还有新的基于 #lang 的变体,如 #lang htdp/bsl,但它们尚未成熟。(而 HtDP 不是特定于 #lang racket)。

  6. 不,Racket 与 Chicken Scheme 非常不同。您可能能够在两者中运行一些代码,但那可能只是一些微小的玩具示例。


非常感谢您提供的信息,Eli。鉴于教学目的,我将完全使用Racket,而Chicken Scheme的很酷的一部分是编译为C。 - orlybg
使用Racket编程语言时,没有太多必要将代码编译成C语言——它使用即时编译器表现良好。如果你更关心创建独立的可执行文件而不是速度,那么也有方法可以实现——请参考raco exeraco distribute命令。 - Eli Barzilay
5
这里需要强调一件事情:#lang scheme 几乎与 #lang racket 完全相同,它与 Chicken Scheme、SICP 或 HtDP 的相似程度并不比 #lang racket 更高。 - Sam Tobin-Hochstadt

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