【问题标题】:Differences between Guile Scheme and Standard Scheme (in Racket IDE)?Guile 方案和标准方案之间的区别(在 Racket IDE 中)?
【发布时间】:2012-05-25 01:34:56
【问题描述】:

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

我的问题是:

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

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

【问题讨论】:

  • 如果您一直严格遵守 R5RS 和 R6RS 标准,那么 Racket 内置的兼容性语言可能会有所帮助。见:docs.racket-lang.org/guide/standards.html
  • 您能否指定您在 DrRacket (R5RS/racket/etc) 中声明的语言?你能举例说明代码在哪里被破坏了吗?
  • @oobivat 我故意在网上大肆扫荡——我的问题背后的问题是“什么是诡计计划中的非标准内容”。如果它使问题更容易回答 - 那么我会将其表述为“在设置为 R5RS 的 Racket 中运行时,我 1994 年的诡计方案代码可能会出现什么问题 - 我该如何解决?”
  • 好吧,我对球拍的 R5RS 实现做的不多,但是从稍微玩弄一下,它似乎缺少 SRFI 中实现的大多数东西。例如,没有random 程序。根据this 页面,您似乎可以加载您想要的任何功能。不幸的是,我找不到类似 to 语言之间的差异。
  • @oobivat 如果你需要 srfi-1 函数,你可以使用 #%require 来导入它。请参阅下面答案中的示例(在 cmets 中删除了换行符)。

标签: scheme racket guile r6rs r5rs


【解决方案1】:

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

  • 不同的模块系统
  • 不同的宏系统(取决于您的代码的年龄)
  • 不可变的 cons-cell(除非您导入可变的)
  • 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 中,空列表 '() 算作假,而不是被解释为真。

查看此问题了解更多需要注意的事项:

Running SICP Pattern Matching Rule Based Substitution Code

另请参阅 R5RS 标准的更改列表: List of changes from R4RS to R5RS

【讨论】:

  • 我怀疑发帖者可能一直在询问 DrRacket 中的 R5RS 或 R6RS 语言。
  • 感谢山姆 - 我正在网上搜索所有可能的信息。我认为您是说上面的评论是特定于球拍的 - 不适用于 R5RS。
猜你喜欢
  • 2010-10-30
  • 2019-04-19
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 2011-03-06
  • 2018-10-08
  • 1970-01-01
相关资源
最近更新 更多