【问题标题】:Racket exn:fail? unbound球拍 exn:失败?未绑定
【发布时间】:2013-06-24 19:19:52
【问题描述】:

我一直在使用以下语言定义文件,eopl-printing.rkt

#lang 球拍
    (require (except-in eopl #%module-begin))
    (提供(全从外的 eopl))
    (提供#%module-begin)
正如DrRacket EOPL Scheme output 中所建议的那样。一切进展顺利,除非我尝试调用 exn 函数,如下所示:
#lang s-exp "eopl-printing.rkt"
(需要机架单元)
(检查-exn
   exn:失败?
   (拉姆达()
     (错误'嗨“那里”)))

我收到一条“exn:fail?: unbound identifier ...”消息,而不是按预期成功通过测试。我已经阅读了有关模块的文档并尝试了各种方法来尝试重新公开 Racket exn 定义,但没有任何运气。有什么建议吗?

【问题讨论】:

    标签: unit-testing exception module scheme racket


    【解决方案1】:

    eopl-printing.rkt 文件定义了一种语言,它只包含来自eopl 库的绑定加上来自racket#%module-begin,但没有其他内容。

    但您仍然可以轻松地将racket 绑定导入以eopl-printing.rkt 语言编写的任何文件中:

    #lang s-exp "eopl-printing.rkt"
    (require rackunit)
    (require racket)
    (check-exn
       exn:fail?
       (lambda ()
         (error 'hi "there")))
    

    或者,您可以让您的 eopl-printing.rkt 语言提供您想要的其他 racket 表单:

    #lang racket
    (require (except-in eopl #%module-begin))
    (provide (all-from-out eopl))
    (provide #%module-begin exn:fail? error)
    

    或者只是重新提供racket中的所有内容:

    #lang racket
    (require (except-in eopl #%module-begin))
    (provide (all-from-out eopl))
    (provide (all-from-out racket))
    

    【讨论】:

    • 谢谢,这是有道理的。在存在名称冲突的情况下,第一个和第三个选项是否会冒着覆盖 eopl 的风险?
    • 可能。我运行了eopl 测试套件,但没有遇到任何问题。 eopl 大多只是重新提供来自 racket 的东西。看起来它重新定义事物非常好,即eopl:printfeopl:error
    • 其实,划掉最后一条评论。我认为all-from-out 做了正确的事。如果有冲突就会出错。
    猜你喜欢
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多