Как требовать внутри Racket макрос? - PullRequest
1 голос
/ 20 октября 2019

В настоящее время я помещаю модульные тесты внизу файла, над которым я работаю, например:

(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 Ответ

4 голосов
/ 20 октября 2019

Для макроса test вы уверены, что вам нужно сгенерировать require из макроса? Вы можете сделать так, чтобы макрос test генерировал использование pretty-print, если racket/pretty требуется в файле, который определяет test, и тогда не имеет значения, есть ли потребность в файле, который использует test.

Например, если у вас есть два файла macro.rkt и use.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)))))

file 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 получает область действия от сайта определения макроса, а не от сайта использования.

Работает ли это для вашей проблемы?

...