On Sep 22, 2011, at 10:25 AM, Michael Jaaka wrote:

> Hi!
> 
> I would like to change behavior/semantic for my DSL. So instead of typing 
> this:
> 
>  (constraints (where-and (where :field > 123123) (where :field < 3242432)))
> 
> I could type this:
> 
>  (where (and (:field > 123123) (:field < 3242432)))
> 
> The catch is that macro "where" shouldn't interpret its content but define in 
> its scope "and" function and change behavior of invocation of all keywords.
> Is it possible? Motivation is that it is always easier to modify/maintenance 
> changed behavior than to program interpreter and then write behavior with it 
> and finally modify/maintenance it.

Sure, it's possible.  `where` can go tree-walking, replacing all `and` symbols 
and keywords in function position with a symbol naming whatever function or 
macro you'd like to take their place.

Just be as aware of macros' tradeoffs when considering their power.  In this 
case for example, it can be quite difficult to ensure that tree-walking macros 
compose well with the use of other macros.  Maybe that's an acceptable tradeoff 
your users can live with, maybe not.

FWIW, you don't need to use a macro to provide a succinct query expressions.  
In rummage (my stab at a Clojure library for Amazon's SimpleDB), queries are 
specified using data structures; from the project's README:[1]

(query config '{select [:key] from demo where (and (like ::sdb/id "ba%")
                                                   (< :key 70))})

The advantages here are many: you can generate query maps at runtime, you can 
use syntax-quote and unquote to fully control evaluation of expressions in 
query, and — if you really needed it — you could use the function(s) that 
implemented the interpretation of such query maps as the basis for all sorts of 
macros (either to front-load interpretation costs at compile-time or to provide 
a higher-level "DSL").

Cheers,

- Chas

[1] https://github.com/cemerick/rummage

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to