1

如何创建一个名为 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 模块”找到了这个。它不适用于 r6rs 方案,但它提供的功能基本上正是我正在寻找的。provide all-from-except在 r6rs 方案中我该怎么做?

4

1 回答 1

2

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

myrnrs.sls

(library
 (myrnrs)

 (export set!)

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

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

测试.scm

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

不幸的是,没有什么能像我们在 Racket 中所拥有的那样。因此您可以创建一个重新定义 set! 的库,但是除了重新定义 set! 之外,您还必须导入 rnrs 然后输入所有这些绑定的导出。你在这里阅读更多信息;具有讽刺意味的是,我也想创建一个没有设置的库!

于 2010-07-22T18:35:16.520 回答