Macro de raquete para definir funções automaticamente com uma lista

Eu quero gerar automaticamente um monte de funções de teste de uma lista. A vantagem é que eu posso mudar a lista (por exemplo, lendo em uma tabela de dados CSV) e o programa irá gerar automaticamente testes diferentes na próxima execução do programa.

Por exemplo, digamos que estou tentando identificaroxianiões em uma string contendo umFórmula química.

Minha lista pode ser algo como:

(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")))

Estou razoavelmente confiante de que a fórmula química contém um dessesoxianiões se houver um catião seguido por um oxigénio entre parênteses (por exemplo "(C O3)"), ou se o catião for seguido por 2 ou mais oxigénios (por exemplo "C O3"). Note que isso não é perfeito, já que ele vai perder os ânions de hipoclorito (por exemplo, "Cl O"), mas é bom o suficiente para a minha aplicaçã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)))

Eu acho que preciso de uma macro para fazer isso, mas eu realmente não entendo como eles funcionam lendo a documentação. Estou perguntando aqui para que eu tenha um bom exemplo para ver que é imediatamente útil para mim.

Aqui está o que eu acho que a macro deve parecer, mas não funciona e eu realmente não tenho um modelo mental para descobrir como consertar isso.

(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))))])))

Obrigado por qualquer orientação que você pode me dar!

P.S. Aqui estão alguns testes que devem passar:

(define-all/ate? *oxyanion-tests*)
(module+ test
  (require rackunit)
  (check-true (borate? "B O3"))
  (check-true (carbonate? "C O3"))
  (check-true (silicate? "Si O4")))

questionAnswers(1)

yourAnswerToTheQuestion