我想自动生成从列表一堆的测试功能。 其优点是我可以改变列表(通过在CSV数据表中读取EG),程序将自动生成的下一个程序执行不同的测试。
例如,假设我试图找出氧阴离子中含有的字符串化学式 。
我的列表可能是这样的:
(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")))
我有理由相信,化学式包含这些中的一个氧阴离子 ,如果有一个阳离子,接着通过氧括号内(例如,“(C O3)”),或者如果所述阳离子接着用2个或多个氧(例如“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")))