鉴于此代码:
#lang racket/base
(module+ test
(require rackunit rackunit/text-ui)
(provide suite)
(define suite
(test-suite
"test tests"
(test-equal? "test string test"
"string"
"string")))
(run-tests suite))
;(require 'test)
;(suite)
如果留下最后两行,并且文件以raco test test.rkt
运行,则会输出
raco test: (submod "test.rkt" test)
1 success(es) 0 failure(s) 0 error(s) 1 test(s) run
0
1 test passed
预期。
如果文件只是作为脚本运行而不是raco
运行,我如何让文件运行?
我认为最后两条注释行会做我想要的:导入子模块然后调用函数,
(require 'test)
(suite)
但我得到了:
$ racket test.rkt
require: unknown module
module name: #<resolved-module-path:'test>
context...:
standard-module-name-resolver
Learn Racket in Y Minutes似乎说'test
作为'symbol
用于子模块,但可能不是。
答案 0 :(得分:2)
使用module+
和module*
声明的子模块在其包含模块中不可用于require
,因为它们可以依赖于它们的包含模块,并且模块依赖关系图中的循环不是&n #39;允许。 (相反,使用module
声明的子模块不能依赖于它们的包含模块,但它们的包含模块可以require
它们。)
尝试添加main
子模块;应该在文件作为脚本运行时运行:
(module+ main
(require (submod ".." test))
(run-tests suite))
BTW,Racket约定是test
子模块运行测试,而不仅仅是定义它们。添加main
子模块可能会使raco test
停止为您的脚本工作;修复方法是将(run-tests suite)
调用转移到test
子模块。