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 racket-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/CAORuSUyQ0mU_GR4JgS%3De6Sh9W_Uefk_FxxZn2Z6whb6YyjwYPg%40mail.gmail.com.

Reply via email to