【发布时间】:2018-07-05 16:42:43
【问题描述】:
我目前正在努力通过“漂亮的球拍”,尝试编写单元测试。
对宏进行单元测试的最佳方法是什么?例如,如果我有一个宏 infix:
(define-macro (infix [A B C]) #'(B A C))
测试模式匹配和转换的最明智的方法是什么?我想做类似的事情:
(check equal? (infix '(3 - 2)) '(- 3 2))
【问题讨论】:
-
我知道有两种策略。 (1) 测试它作为输出生成的代码的行为,而不是输出本身。这看起来像
(check-equal? (infix [3 - 2]) 1)。 (2) 对宏的大部分复杂度使用辅助函数,并测试辅助函数。这看起来像(define-macro (infix infix-expr) (process-infix #'infix-expr)),您可以在其中编写像(begin-for-syntax (check-stx-equal? (process-infix #'[3 - 2]) #'(- 3 2)))这样的测试。 -
只是出于兴趣,我对 (2) 进行了快速操作,但无法得到任何合理的工作 - 我在定义宏时收到
process-infix: unbound identifier错误。 -
您是否将
process-infix的定义放在begin-for-syntax块内?查看Calling other functions in macros 的答案,了解如何操作。
标签: unit-testing racket