Racket 如何要求在球拍宏中使用?

Racket 如何要求在球拍宏中使用?,racket,metaprogramming,Racket,Metaprogramming,我目前将单元测试放在我正在处理的文件的底部,如下所示: (提供foo) (定义(x条)(+1 x)) ;; 单元测试 (模块+测试 (需要球拍/漂亮) (定义测试用例’(2 3 4)) (对于([测试用例]) (漂亮的印花(条形测试))) 这是可行的,但我希望避免对所有模块重复样板单元测试代码。由于以前从未在Racket中编写过宏,我不确定如何将各个部分装配在一起 我希望将以下代码扩展到上述样板文件版本: (提供foo) (定义(x条)(+1 x)) ;; 单元测试 (测试食物’(2 3 4)

我目前将单元测试放在我正在处理的文件的底部,如下所示:

(提供foo)
(定义(x条)(+1 x))
;; 单元测试
(模块+测试
(需要球拍/漂亮)
(定义测试用例’(2 3 4))
(对于([测试用例])
(漂亮的印花(条形测试)))
这是可行的,但我希望避免对所有模块重复样板单元测试代码。由于以前从未在Racket中编写过宏,我不确定如何将各个部分装配在一起

我希望将以下代码扩展到上述样板文件版本:

(提供foo)
(定义(x条)(+1 x))
;; 单元测试
(测试食物’(2 3 4))

对于
测试
宏,您确定需要从宏生成
要求
?如果定义
test
的文件中需要
racket/pretty
,则可以让
test
宏生成
pretty print
的用法,然后使用
test
的文件中是否有require并不重要

例如,如果您有两个文件
macro.rkt
use.rkt

文件
macro.rkt

文件
使用.rkt

然后,对
pretty print
的引用在宏的输出中起作用,即使它在
use.rkt
中通常不可用。它之所以有效,是因为
pretty print
的作用域来自宏定义站点,而不是使用站点


这能解决您的问题吗?

对于
测试
宏,您确定需要从宏生成
要求
?如果定义
test
的文件中需要
racket/pretty
,则可以让
test
宏生成
pretty print
的用法,然后使用
test
的文件中是否有require并不重要

例如,如果您有两个文件
macro.rkt
use.rkt

文件
macro.rkt

文件
使用.rkt

然后,对
pretty print
的引用在宏的输出中起作用,即使它在
use.rkt
中通常不可用。它之所以有效,是因为
pretty print
的作用域来自宏定义站点,而不是使用站点


这能解决您的问题吗?

如果我能生成
所需的
,那就太理想了。将require放入
(模块+测试…
)的一个原因(我没有提到)是它似乎减少了编译时间。如果我能生成
require
,那将是理想的。将require放入
(模块+测试…
的一个原因(我没有提到)是它似乎减少了编译时间。
#lang racket
(provide test)
(require racket/pretty
         syntax/parse/define)

(define-simple-macro (test fn:id args:expr)
  (module+ test
    (define testcases args)
    (for ([test testcases])
      (pretty-print (fn test)))))
#lang racket
(require "macro.rkt")
(provide foo)
(define (foo x) (+ 1 x))

;; unit tests
(test foo '(2 3 4))