Here is a version that works, with explanation following: #lang racket
(require rackunit rackunit/text-ui (for-syntax syntax/parse)) (define-syntax gen-testsuite (syntax-parser [(_ n:exact-nonnegative-integer) #`(test-suite "Automated suite" #,@(for/list ([i-num (syntax->datum #'n)]) (with-syntax ([i (datum->syntax #'n i-num)]) #`(test-case (format "Test number ~a" i) (check = i i)))))])) (run-tests (gen-testsuite 100)) Your original code converted #'n the syntax object to a compile-time integer just fine. Here I've called the integer loop variable i-num for clarity. The step you're missing, as you recognize, is that you need to introduce i as a pattern variable bound to a syntax object: with-syntax does the binding, and datum->syntax turns the compile-time integer back into a syntax object. (I gave it the context from the original #'n, which I think handles some cases about #%datum transformers and other strange things nicely.) I also used syntax-parse to conveniently check that n really is a nonnegative integer literal, though of course you could write such a check with syntax-case if you really wanted to. Note that this generates quite a lot of code. I'm assuming there's a good reason you want to do this with a macro and not a function (perhaps using with-check-info to enhance failure reporting), but that's certainly something you'd want to consider if you haven't. -Philip On Fri, Feb 23, 2018 at 7:11 AM, 'Paulo Matos' via Racket Users < racket-users@googlegroups.com> wrote: > Hi, > > I am trying to get a macro working to generate an automatic testsuite. I > have shrank my example to: > #lang racket > > (define-syntax (gen-testsuite stx) > (syntax-case stx () > [(_ n) > #`(test-suite > "Automated suite" > #,@(for/list ([i (syntax->datum #'n)]) > #`(test-case > (format "Test number ~a" i) > (check = i i))))])) > > (require rackunit > rackunit/text-ui) > > (run-tests > (gen-testsuite 100)) > > This should generate a test-suite that can then be wrapped in run-tests. > It should example to something like: > (testsuite > "Automated suite" > (test-case "Test number 1" (check = 1 1)) > (test-case "Test number 2" (check = 2 2)) > (test-case "Test number 3" (check = 3 3)) > ...) > > This fails because the i in the body of the test case does not exist at > run-time. I understand why this is failing. However if I try to replace > the i by #,(syntax->datum #'i) it also fails. My feeling is that I need > to introduce a new template variable, which I would generally do with > with-syntax however I am not sure how to integrate this with the > for/list expression. > > Regards, > -- > Paulo Matos > > -- > You received this message because you are subscribed to the Google Groups > "Racket Users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to racket-users+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.