scheme - Guile 方案和标准方案之间的区别(在 Racket IDE 中)?

标签 scheme racket guile r6rs r5rs

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

我的问题是:

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


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

    最佳答案

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

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

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

    您很可能会遇到一些“未绑定(bind)标识符”错误。
    如果幸运的话,该功能存在于 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

    关于scheme - Guile 方案和标准方案之间的区别(在 Racket IDE 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10636331/

    相关文章:

    scheme - 诡计多端的循环列表

    scheme - (define (add x y) (+ x y)) 和 (define add (lambda (x y) (+ x y))) 有什么区别?

    scheme - 如何在 Scheme 中列出评估的所有中间步骤

    racket - 使用模式匹配程序定义语法类

    scheme - 在方案中构建哈夫曼树

    scheme - 将通用 Racket 头加载到当前顶层

    scheme - 如何检查符号是否是过程

    canvas - 在 canvas% 元素上绘图

    binding - 如何刷新、重制 lambda 上的词法绑定(bind)?

    scheme - 如何评估从 Scheme 中的函数返回的符号?