Like some people mentioned, you can use a parsing library, but often times I don't think that's necessary if you are just creating a DSL. There are a couple of other strategies.
One is you can use a series of nested macros that expand into a data structure. In this way your DSL will sort of auto-transform into a nested data structure that you can then just operate on like regular data. Here's what I mean, using a mini database DSL as an example: (defmacro table [name & body] `{:type :table :name (str (quote ~name)) :cols [...@body]}) (defmacro col [name type] `{:type :col :name (str (quote ~name)) :data-type ~type}) ; Allowing for specifications like this: (table users (col email :string) (col password :string)) (Note: You can run this code to see the data structure it produces...) Alternatively, if you want to get rid of parenthesis or introduce new semantics, then you'll need to process the tokens yourself with some logic. At a larger scale this is better done with a parser, but if you just need to support a special keyword here or there, it's pretty easy to include some simple logic in a macro to look at a symbol and do something different depending on what it is. In general I try to keep the semantics inside normal function definitions though, and just use macros for restructuring. -Jeff On Jul 8, 8:52 pm, Nicolas Oury <nicolas.o...@gmail.com> wrote: > Dear all, > > I am trying to write a small Domain Specific Language using macro, and I > want the syntax of the args of the macro to be somehow "parsed" and > transformed. > > So, I have two questions: > > - Does anybody else does that? (except the infix calculus) Is there a > generic method for doing it? Or even better a library? > - I want to report syntax error from my macro expansion. Is there a way to > get the line (or even better the line/file and character) of the usage of a > macro being expanded? > That way I could have helpful error message.... > > Best regards, > > Nicolas. -- 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