15

我有一堆想要在 Racket Scheme IDE 中运行的“遗留”Guile Scheme 代码。似乎有足够的差异使这成为一项重要的练习。(我的 Scheme 知识水平是完成 The Little Schemer 的水平)。

我的问题是:

  1. Guile 方案和标准方案(在 Racket IDE 中)有什么区别?
  2. 鉴于这些差异,一般来说,我需要采取哪些步骤将一些 Guile 方案代码转换为标准方案?

附加:(对 Racket Scheme 和 R5RS/R6RS 之间的分歧感到高兴)-我想要的是在 Racket IDE 中运行“某些东西”-而不是在 Racket 语言中运行。

4

1 回答 1

7

如果通过“标准方案(在 Racket IDE 中)”,您的意思是 Racket 语言,即,当您在代码前加上前缀时会得到什么,#lang racket,那么要注意的前四个差异是:

  • 不同的模块系统
  • 不同的宏系统(取决于您的代码的年龄)
  • 不可变的 cons-cells(除非你导入可变的)
  • Racket 中没有单臂 ifs(使用when

要将代码从 Guile 移植到 Racket,请找出哪些文件位于您的依赖项的“底部”,即找到不依赖于其他文件的文件。在 Racket 中打开这样的文件,在顶部添加 #lang racket 行,然后尝试运行它。

您很可能会遇到一些“未绑定标识符”错误。如果幸运的话,该功能存在于 Racket 中,但不包含在“racket”语言中。在 Racket 文档中搜索名称,如果找到,则使用 (require ...) 将名称导入程序。

然后再次运行程序,发现下一个错误。

某些函数在 Guile 和 Racket 中的命名不同,因此请在 Guile 文档中查找名称并查看它的作用。然后打开关于同一主题的 Racket 文档,并查看它在 Racket 中的名称。

在某些情况下,您可能需要进行更大的更改。如果您在 Racket 文档中找不到某些功能,请尝试询问邮件列表。可能是它只是有一个不同的名称,或者有人实现了它并将它放在PLaneT上(因此在你安装包之前它不会出现在文档中)。


将 srfi/1 导入 R5RS 语言的示例。

#lang r5rs
(#%require srfi/1)
(xcons 1 2)

R4RS 代码与现代 Scheme 的区别?

需要注意的一件事是,在 R4RS 中,空列表 '() 算作假,而不是被解释为真。

有关更多需要注意的事项,请参阅此问题:

运行基于 SICP 模式匹配规则的替换代码

另请参阅 R5RS 标准 的更改列表:从 R4RS 到 R5RS 的更改列表

于 2012-05-17T13:29:27.470 回答