在r6rs中重新定义语法关键字

时间:2010-07-21 16:58:15

标签: scheme r6rs

如何创建一个名为rnrs-modified的库,它将使以下代码显示“Hello,world!”......?

#!r6rs
(import (rnrs-modified))
(display set!)

甚至这样做会很好(实际上可能更好):

#!r6rs
(import (rnrs) (modified)) ;or (import (modified) (rnrs))
(display set!)

基本上我希望能够在库中重新定义语法关键字(let,lambda,set!等),然后将该库导入另一个库或顶级程序并使用这些重新定义的关键字。

但是我一直这样说:

module: identifier already imported from a different source in:
  set!
  (lib "rnrs/main.ss")
  (lib "rnrs-modified/main.ss")

我用于rnrs-modified的代码是:

#!r6rs
(library (rnrs-modified)
         (export (rename (f set!)))
         (import (rnrs))
         (define f "Hello, world!"))

有什么想法吗?


更新:我找到了'{mzscheme modules'this。这不是r6rs方案,但它提供的功能基本上正是我正在寻找的。如何在r6rs计划中进行provide all-from-except

1 个答案:

答案 0 :(得分:2)

R6RS通过识别您要自定义的库,不包括您要自定义的部分,然后在您自己的库中定义这些部分,更有助于实现您的目标。这是一个例子:

<强> myrnrs.sls

(library
 (myrnrs)

 (export set!)

 (import
  (except (rnrs) set!)
  (rename (rnrs) (set! rnrs-set!)))

 (define set! "Hello, world."))

<强> test.scm

(import
 (except (rnrs) set!)
 (myrnrs))
 (display set!)(newline)    

不幸的是,除了像我们在Racket中一样,没有什么比这更好了。所以你可以创建一个重新定义set!的库,但你必须导入rnrs然后输入所有这些绑定的导出以及重新定义set!。您阅读了有关here的更多信息;具有讽刺意味的是,我也想创建一个没有set!的库。