我想从列表中自动生成一堆测试函数。优点是我可以更改列表(例如,通过读取 CSV 数据表)并且程序将在下一次程序执行时自动生成不同的测试。
我的清单可能是这样的:
(define *oxyanion-tests*
; name cation
(list (list "aluminate" "Al")
(list "borate" "B")
(list "gallate" "Ga")
(list "germanate" "Ge")
(list "phosphate" "P")
(list "sulfate" "S")
(list "silicate" "Si")
(list "titanate" "Ti")
(list "vanadate" "V")
(list "stannate" "Sn")
(list "carbonate" "C")
(list "molybdate" "Mo")
(list "tungstate" "W")))
我有理由相信,如果括号内有一个阳离子后跟一个氧(例如“(CO3)”),或者如果该阳离子后跟两个或更多氧(例如“C O3")。请注意,这并不完美,因为它会遗漏次氯酸盐阴离子(例如“Cl O”),但对于我的应用来说已经足够了。
(define ((*ate? elem) s-formula)
(or (regexp-match? (regexp (string-append "\\(" elem "[0-9.]* O[0-9.]*\\)")) s-formula)
(regexp-match? (regexp (string-append "(^| )" elem "[0-9.]* O[2-9][0-9.]*")) s-formula)))
我想我需要一个宏来做到这一点,但我并不真正了解它们是如何通过阅读文档来工作的。我在这里问是为了让我有一个很好的例子来看看这对我来说立即有用。
这是我认为宏应该看起来的样子,但它不起作用,我真的没有一个心智模型来弄清楚如何修复它。
(require (for-syntax racket))
(define-syntax-rule (define-all/ate? oxyanion-tests)
(for ([test oxyanion-tests])
(match test
[(list name cation) (syntax->datum (syntax (define ((string->symbol (string-append name "?")) s-formula)
((*ate? cation) s-formula))))])))
感谢您能给我的任何指导!
PS这里有一些应该通过的测试:
(define-all/ate? *oxyanion-tests*)
(module+ test
(require rackunit)
(check-true (borate? "B O3"))
(check-true (carbonate? "C O3"))
(check-true (silicate? "Si O4")))