Not exactly the same problem, but you might like to see an infix implementation 
from “The Joy of Clojure” by Fogus and Chouser.

http://fogus.me/fun/unfix/infix-src.html

The “Joy” code makes intermediate calculations as it goes.  I tweaked it a bit 
to make a data-reader that only does the infix to prefix transformation.  
That’s probably closer to what you want.

https://gist.github.com/miner/5224709

Note: the “Joy” code uses vector notation for grouping.  You would have to 
adapt it to use lists.

Here’s the relevant code from my gist, leaving out the data-reader part:

(def && #(and % %2))
(def || #(or  % %2))

(def ops '[- + * / < > && || =])
(def rank (zipmap ops (iterate inc 1)))
(def op? rank)

(defn infix
  [[a b & [c d e & m]]]
  (cond
   (vector? a) (recur (list* (infix a) b c d e m))
   (vector? c) (recur (list* a b (infix c) d e m))
   (op? b) (if (and d (< (rank b 0) (rank d 0)))
             (recur (list a b (infix (list* c d e m))))
             (recur (list* (list b a c) d e m)))
   :else a))

;; example
(infix '[1 + 3 * 4 - 5])
;=> (+ 1 (- (* 3 4) 5))


> On Jun 24, 2016, at 2:28 PM, Botond Balázs <balazsbot...@gmail.com> wrote:
> 
> Hi,
> 
> I'm working through Clojure for the Brave and True and there's a little 
> exercise at the end of Chapter 7:
> 
> Create an infix function that takes a list like (1 + 3 * 4 - 5) and 
> transforms it into the lists that Clojure needs in order to correctly 
> evaluate the expression using operator precedence rules.
> 
> I ended up implementing the shunting yard algorithm in Clojure to solve it 
> (65 lines, many functions), but I have the suspicion that this exercise isn't 
> meant to be this complicated and that I'm missing a very obvious and elegant 
> solution. What do you think?
> 
> Thanks,
> Botond

-- 
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 unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to