【问题标题】:Redefining syntactic keywords in r6rs在 r6rs 中重新定义语法关键字
【发布时间】:2010-07-21 16:58:15
【问题描述】:

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

【问题讨论】:

    标签: scheme r6rs


    【解决方案1】:

    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 中那样的 all-from-except ;因此您可以创建一个重新定义 set! 的库,但是除了重新定义 set! 之外,您还必须导入 rnrs 然后输入所有这些绑定的导出。您阅读了有关here 的更多信息;具有讽刺意味的是,我也想创建一个没有 set! 的库。

    【讨论】:

    • +1,感谢您的回答-我担心可能是这种情况:(。这种情况很糟糕。您认为为所有其他绑定添加导出的选项有多有效?我可以可能通过解析文档或其他东西来自动化任务,所以这是可能的。但根据我的经验,像这样的硬编码解决方案通常很糟糕,而且很容易破坏。你怎么看?另外,知道为什么选择这样一个限制性的库系统r6rs? 编辑:我实际上是在早些时候做研究时跑过那个链接的。小世界:P
    • 1. R6RS 标准不会改变;所以一旦你得到正确的出口,你就会终身受益。 2.我不知道为什么会这样。从一个角度来看,R6RS 的目标是为当今不同 Scheme 系统中发现的共同特征定义一个标准,那么这些可能是常见的模块特征的子集?在我查看的最后一个 R6RS 代码中,作者痛苦地手动导出加载和加载他自己的函数。 all-from-* 似乎很容易。
    猜你喜欢
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多