【问题标题】:Portable load/include of define-syntax in R5RS Scheme?R5RS 方案中定义语法的可移植加载/包含?
【发布时间】:2014-03-26 09:00:34
【问题描述】:

我正在尝试编写适用于 DrRacket/plt-r5rs 和 Gambit/gsi 的东西。

我遇到的问题是 Gambit 中的 (load "foo.scm") 没有加载 define-syntax-blocks。在 Gambit 中使用 (include "foo.scm") 是可行的,但在 DrRacket 中当然会导致语法错误。

有没有办法解决这个问题,以便我可以编写可移植的 R5RS 代码?

我尝试过的事情:

  • (include "foo.scm") 重新定义为(load "foo.scm"),反之亦然。问题:在 Gambit 中重新定义宏是非法的。
  • 将上述重新定义包装在(if gambit ...) 中。问题:在 if 中放置定义是非法的(除非在另一个定义中)。
  • 改为将带有文件名的字符串传递给库文件中的包含项。问题:Gambit 中的包含似乎发生在解释开始之前。

【问题讨论】:

    标签: racket r5rs gambit


    【解决方案1】:

    很难编写一个同时兼容 Gambit 和 Racket 的模块。

    确实有一些方法可以测试特定的实现并有条件地定义事物。事实上,有两个系统可以做到这一点:SRFI 0SRFI 7Most implementations support one or the other. Not very many support both.

    Gambit 支持 SRFI 0。Racket 支持 SRFI 7。

    【讨论】:

    • 致 Erik:你选择了这个作为最佳答案......那么你做了什么?
    • 我几乎放弃了让我正在编写的代码在 Gambit 和 Racket 之间移植,因为它并不是那个特定项目的真正要求,而只是一些很好的东西。尤其是当我弄清楚如何从 Racket 中的 Gambit 获得我想要的东西时(问题的答案是“这当前在终端中运行吗?”)。
    【解决方案2】:

    如果有帮助:在 Racket 中,您可以在 r5rs 文件中使用包含:

    #lang r5rs
    (#%require (only racket include))
    (include "foo.scm")
    

    如果您在 Gambit 中定义 #%require 不做任何事情,那么您可以在两个实现中使用相同的源文件。

    【讨论】:

    • 因为我遇到的部分问题是我不能只为其中一个重新定义一些东西,所以我看不到如何使用它。我错过了什么吗?
    • 当你调用 gsi 你可以给它一个文件列表。第一个可以包含 Gambit 特定的定义。
    • 据我记得球拍具有相同的功能,所以我可以在该文件中执行(define include load)。不喜欢对代码的运行方式做出假设,但我想这是我能得到的最接近的。
    猜你喜欢
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 2010-11-29
    • 2022-11-20
    • 1970-01-01
    • 2019-10-12
    相关资源
    最近更新 更多