Hello, I'm pleased to announce the initial release of *Template Macros*, a Racket library that dramatically simplifies the generation of meta-program code.
https://github.com/dedbox/racket-template Template macros infiltrate the spaces under-served by Racket's existing pattern-based and procedural macros, such as the insides of literal data, > (with-template ([X 1] [Y 2]) (values XY3 "YX0" #rx"^X+Y$")) > 123 > "210" > #rx"^1+2$" > or in the various quoted forms; > (begin-template #'(untemplate (build-list 10 values))) > #<syntax:stdin::5095 (0 1 2 3 4 5 6 7 8 9)> > and when one template macro is used by another, the results are spliced in place automatically. > (begin-template (list (for/template ([K (in-range 10)]) K))) > '(0 1 2 3 4 5 6 7 8 9) > Template macros eliminate common technical barriers to advanced Racket meta-programming techniques by preempting the default macro expander. The current API offers a lot more than I could jam into a release announcement, and it's still evolving! In the coming weeks and months, I'll try to post some topic-focused tutorials that highlight the wealth of functionality template macros provide to the practicing language-oriented Racket programmer. But the next time you trip on a missing syntax-local-introduce, > (define-template (urlang-js modpath) > (let () > (local-require (only-in modpath the-javascript)) > (the-javascript))) > or find yourself facing a wall of format-id's, > (for*/template ([M (in-range 1 6)] > [N (in-range 1 6)]) > (define idMxN '((for/template ([I (in-range 1 (add1 M))]) > (vector (for/template ([J (in-range 1 (add1 N))]) > (if-template (= I J) 1 0)))))) > (when-template (= M N) > (define idM idMxN))) > > id5 > '((vector 1 0 0 0 0) > (vector 0 1 0 0 0) > (vector 0 0 1 0 0) > (vector 0 0 0 1 0) > (vector 0 0 0 0 1)) > or struggle to interleave a medley <http://www.greghendershott.com/fear-of-macros/pattern-matching.html#%28part._.Another_example%29> of functions with "syntax" in their names, > (define-template (hyphen-define* Names Args Body) > (define > #,(string->symbol (string-join (map symbol->string 'Names) "-")) > (λ Args Body))) > > (hyphen-define* (foo bar baz) (v) (* 2 v)) > > (foo-bar-baz 50) > 100 > give template macros a try and let me know how it goes! Eric -- 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 [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/CAORuSUyQ0mU_GR4JgS%3De6Sh9W_Uefk_FxxZn2Z6whb6YyjwYPg%40mail.gmail.com.

