便携式加载/包含R5RS Scheme中的define-syntax?

时间:2014-02-24 15:38:57

标签: racket r5rs gambit

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

我遇到的问题是Gambit中的(load "foo.scm")无法加载define-syntax - 块。在Gambit中使用(include "foo.scm")可以正常工作,但当然会导致DrRacket中出现语法错误。

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

我尝试过的事情:

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

2 个答案:

答案 0 :(得分:2)

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

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

Gambit支持SRFI 0.Racket支持SRFI 7.

答案 1 :(得分:2)

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

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

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