Hey Jim, what do you think of something like this? (defmacro infix->prefix [form] (loop [[a op b & more :as form] form] (if (not op) a (recur (cons (list op a b) more)))))
This transforms the list by plucking off three items at a time, rearranging them into prefix notation then popping them back onto the list in the recursion. When only one form's left inside the list, the macro returns that form, passing it into the compiler. Here's an example expansion: user> (infix->prefix (1 * 2 + 3 - 6)) (1 * 2 + 3 - 6) ((* 1 2) + 3 - 6) ((+ (* 1 2) 3) - 6) ((- (+ (* 1 2) 3) 6)) -1 On Wed, May 2, 2012 at 1:24 PM, Jim - FooBar(); <jimpil1...@gmail.com>wrote: > Hey everyone, > > I've been trying all morning (more than 3 hours) to improve my macro but > with little success...basically what I had before i started fiddling with > it was a macro which would take an expression of the form (1 + 4 * 5 - 1 / > 2) and would return the expression in prefix form: (/ (- (* (+ 1 4) 5) 1) > 2)...it would not handle nested parens and no operator precedence...This is > it: > ------------------------------**------------------------------** > ------------------------------**------------------------------** > --------------- > (defmacro functionize [macro] > `(fn [& args#] (eval (cons '~macro args#)))) > > (defmacro infix-to-prefix [expr] > (if-not (empty? (filter #(list? %)) '~expr)) > (infix-to-prefix > (map #(if (list? %) > (apply (functionize infix-to-prefix) %) %) 'expr)) > `(loop [ > ops# (filter #(not (number? %)) '~expr) > args# (filter #(number? %) '~expr) > ] > (if (empty? ops#) (first args#) > (let [[a# b# & more#] args#] > (recur > (rest ops#) > (conj more# > (list (first ops#) a# b#)))))))) > > ;;usage : (infix-to-prefix (1 + 4 * 6)) > ;;=> (* (1 + 4) 6) > ------------------------------**------------------------------** > ------------------------------**------------------------------** > -------------- > I know for a fact that the bit after the back-quote works exactly as > explained above...all the new code is above the back-quoted loop - recur > form. all i'm trying to do is replace all the parens at each level with > values calculated recursively using eval on the returned > expression....However i can't seem to go any further...I am literally about > to give up...I know this may not be necessarily the best approach but i 've > worked hard on this and i want to see it succeed! > > Any help is greatly appreciated... > > Jim > > > > > -- > 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+unsubscribe@**googlegroups.com<clojure%2bunsubscr...@googlegroups.com> > For more options, visit this group at > http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=en> -- Sam Ritchie, Twitter Inc 703.662.1337 @sritchie09 (Too brief? Here's why! http://emailcharter.org) -- 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