gpt4 book ai didi

scheme - 需要 Racket 中的模块未提供的标识符

转载 作者:行者123 更新时间:2023-12-02 07:09:54 26 4
gpt4 key购买 nike

假设我有一些文件a.rkt:

#lang racket
(define a 12)

我现在想使用需要 a.rkt 的文件 b.rkt 编写一些测试用例:

#lang racket
(require "a.rkt")
a

有什么方法可以让b.rkt识别a.rkt中定义的标识符,而不必从提供它第一个文件? (理想情况下根本不需要更改第一个文件。)

我没有立即在 the documentation for require/provide 中看到任何内容.

最佳答案

正如 Leif 提到的,RackUnit 的 require/expose 允许在其他模块中使用未提供的标识符,但是 its own documentation不 promise 非常有力的保证:

Note that require/expose can be a bit fragile, especially when mixed with compiled code. Use at your own risk!

另一种方法是使用 submodules ,它可以有效地提供一种受认可的方式来导出私有(private) API 以用于测试或其他方式。

例如,考虑一个实现函数来测试字符串是否包含单个单词的模块:

#lang racket

(provide word?)

(define (word? str)
(not (ormap space? (string->list str))))

(define (space? c)
(eq? c #\space))

(这也许不是最现实的例子,但请耐心听我说。)

测试 space? 函数以确保其正常工作可能很有用,但它可能不应该成为公共(public) API 的一部分。要创建“逃生舱口”,可以定义导出此绑定(bind)的子模块:

(module+ for-testing
(provide space?))

名称for-testing是任意的——它可以是任何东西。无论哪种方式,现在都可以要求另一个模块中的子模块来访问私有(private)绑定(bind):

#lang racket

(require rackunit
(submod "a.rkt" for-testing))

(check-true (space? #\space))
(check-false (space? #\a))

这是一种更安全的方式来公开模块中的标识符,而不会将它们公开给所有使用者。

关于scheme - 需要 Racket 中的模块未提供的标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34122505/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com