如何在Racket巨集内要求?

时间:2019-10-20 15:01:26

标签: racket metaprogramming

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

(provide foo)
(define (bar x) (+ 1 x))

;; unit tests
(module+ test
  (require racket/pretty)
  (define testcases '(2 3 4))
  (for ([test testcases])
    (pretty-print (bar test))))

这可行,但是我想避免对所有模块重复样板单元测试代码。之前从未在Racket中编写宏,所以我不确定如何将各个部分组合在一起。

我想将以下代码扩展到上述样板版本:

(provide foo)
(define (bar x) (+ 1 x))

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

1 个答案:

答案 0 :(得分:4)

对于test宏,您确定需要从宏中生成require吗?如果在定义test的文件中需要pretty-print,则可以使racket/pretty宏生成test的使用,然后在其中是否有需求都没关系使用test的文件。

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

文件macro.rkt

#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)))))

文件use.rkt

#lang racket
(require "macro.rkt")
(provide foo)
(define (foo x) (+ 1 x))

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

然后,对pretty-print的引用即使在use.rkt中通常不可用,也可以在宏的输出中使用。之所以有效,是因为pretty-print是从宏定义站点(而不是使用站点)获取范围的。

这对您的问题有用吗?