Guile Scheme和标准Scheme(在Racket IDE中)之间的区别是什么?

15
我有一堆“遗留”的Guile Scheme代码,我想让它在Racket Scheme IDE中运行。这两种Scheme之间似乎存在足够的差异,使得这不是一项微不足道的任务。(我的Scheme知识水平是完成《小小的计算机科学》)。
我的问题是:
  1. Guile Scheme和标准Scheme(在Racket IDE中)之间有哪些差异?
  2. 考虑到这些差异,通常需要采取哪些步骤将一些Guile Scheme代码转换为标准Scheme?

补充说明:(不介意Racket Scheme和R5RS/R6RS之间的差异) - 我想要的是在Racket IDE中运行“某些东西”,而不是Racket语言。

2
如果您一直紧密遵循R5RS和R6RS标准,那么Racket内置的兼容性语言可能会有所帮助。请参见:http://docs.racket-lang.org/guide/standards.html - dyoo
1
你能指明在DrRacket中你声明的是哪种语言(R5RS/racket等)吗?你能举例说明代码出现错误的地方吗? - robbyphillips
如果您需要使用srfi-1函数,可以使用#%require导入它。请参见下面答案中的示例(注释中删除了换行符)。 - soegaard
@soegaard 是的,我知道。我在评论中链接的页面上有这些信息。我的想法是,迁移 OP 代码时遇到的困难之一将是 guile 原生实现的 SRFI,但这需要在 racket 中进行 #%require - robbyphillips
@oobivat 你好。我认为你所说的“...它似乎缺少SRFI实现中的大部分内容”是指Racket中没有实现SRFI。在Racket实现的R5RS中,它们不存在,因为它遵循标准的规定,没有任何额外的东西。如果我没记错的话,甚至不允许使用方括号。然而(如你所知),我们可以通过%require导入常见的扩展。一开始不清楚的是hawkeye是否正在移植R5RS代码(恰好在Guile中运行)还是移植Guile代码(使用Guile扩展)。我现在看到它是1994年的代码。 - soegaard
显示剩余3条评论
1个回答

7
如果您说的“标准方案(在Racket IDE中)”是指Racket语言,也就是在您的代码前缀中加上#lang racket时所使用的语言,那么需要注意的前四个不同之处如下:
  • 不同的模块系统
  • 不同的宏系统(取决于您的代码有多旧)
  • 不可变的cons单元(除非您导入了可变的单元)
  • Racket中没有单臂if(使用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)

现代Scheme与R4RS代码的不同之处?

需要注意的一点是,在R4RS中,空列表'()'被认为是false,而现在它被解释为true。

有关更多需要注意的内容,请参见此问题:

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

还可以查看从R4RS到R5RS标准的更改列表: 从R4RS到R5RS的更改列表


3
我猜想这个发帖者可能在询问DrRacket中的R5RS或R6RS语言。 - Sam Tobin-Hochstadt
谢谢Sam - 我在广泛搜索以获取所有可能的信息。我想你是说上面的评论是Racket特有的 - 并且不适用于R5RS。 - hawkeye

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