3

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

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

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

我尝试过的事情:

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

2 回答 2

3

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

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

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

于 2014-02-25T12:34:09.100 回答
2

编写一个与 Gambit 和 Racket 兼容的模块非常困难。

确实有一些方法可以测试特定的实现并有条件地定义事物。事实上,有两个系统可以做到这一点:SRFI 0SRFI 7大多数实现都支持其中一种。支持两者的人并不多。

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

于 2014-02-24T16:24:20.603 回答