Hmm, it does look neater with destructuring i have to admit, but it won't handle nested parens will it? basically we 're doing the same thing - mine is just more verbose and self-explanatory. what to do next though? how do you expose all nested parens to the reader and feed the result value back to the list in order to get the effect of 'parenthesis first'?

Jim

ps: btw thanks for your time :)


On 02/05/12 23:14, Sam Ritchie wrote:
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 <mailto: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
    <mailto: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
    <mailto:clojure%2bunsubscr...@googlegroups.com>
    For more options, visit this group at
    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

--
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