On Fri, Feb 13, 2009 at 11:17 PM, samppi <[email protected]> wrote:
>
> I'm trying to write a macro that expands from this:
>
> (product-context [n rule0, m rule1)]
> (rule-maker2 (+ n m)) rule3))
>
> Into this (assume that conc-fn and conc-products are functions):
>
> (fn [tokens]
> (if-let [[remainder# n m] (conc-products [rule0 rule1] tokens)]
> (conc-fn [(rule-maker2 (+ n m)) rule3] remainder#)))
> ...but I can't figure out how to change [n rule0 m rule1] to (if-let
> [[remainder# n m] (conc-products [rule0 rule1] tokens)] ...).
Try working it out outside of the macro context.
(def bindvec '[n rule0, m rule1])
Now you've got something to work with. There are plenty of acceptible
answers. Maybe you want to think of the vector as key/value pairs:
(apply array-map bindvec) ==> {n rule0, m rule1}
(keys (apply array-map bindvec)) ==> (n m)
(vals (apply array-map bindvec)) ==> (rule0 rule1)
Or just use some seq function:
(take-nth 2 bindvec) ==> (n m)
(take-nth 2 (rest bindvec)) ==> (rule0 rule1)
Once you've got the pieces you need, try sticking them into a
syntax-quote:
user=> `(if-let [[r# ~(take-nth 2 bindvec)] (cp ~(take-nth 2 (rest
bindvec)))] ...)
(clojure.core/if-let [[r__215__auto__ (n m)] (user/cp (rule0 rule1))] ...)
Well, that's close by there are extra parens around (n m) and you want
a vector not a list for the rules. So play with it until it looks
right:
user=> `(if-let [[r# ~@(take-nth 2 bindvec)] (cp ~(vec (take-nth 2
(rest bindvec))))] ...)
(clojure.core/if-let [[r__219__auto__ n m] (user/cp [rule0 rule1])] ...)
Then you're ready to build the macro:
(defmacro product-context [bindvec & body]
`(fn [tokens#]
(if-let [[remainder# ~@(take-nth 2 bindvec)]
(conc-products [~@(take-nth 2 (rest bindvec))] tokens#)]
(conc-fn [...@body] remainder#))))
--Chouser
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---