There are also peek and pop functions in core that you could you to convey the semantics of using the cons list as a stack.
As far as performance is on the table, I'm not sure whether of cons'ing over lists or conj'ing over vectors would have the better performance (maybe it's just comparable ! :-) 2009/7/2 Mark Volkmann <r.mark.volkm...@gmail.com>: > > On Thu, Jul 2, 2009 at 2:04 PM, Laurent PETIT<laurent.pe...@gmail.com> wrote: >> >> Hi, >> >> I think you could use recur instead of the direct recursive call, > > Great idea! Simply changing "helper" to "recur" works. > >> 2009/7/2 Mark Volkmann <r.mark.volkm...@gmail.com>: >>> >>> There is a challenge on the blog of Tony Morris at >>> http://dibblego.wordpress.com/2008/09/05/haskell-scala-java-7-functional-java-java/#comment-2460. >>> It's a parsing problem for which he compares solutions in Haskell, >>> Scala and Java. I added a Clojure solution. I don't know if this is >>> the "best" way to solve this with Clojure, but it certainly works. >>> Here's my code, including unit tests. >>> >>> (use 'clojure.test) >>> >>> (defn- match [prev-char next-char] >>> (condp = prev-char >>> \( (= next-char \)) >>> \[ (= next-char \]) >>> false)) >>> >>> ; Need a better name for this function. >>> (defn- helper [s stack] >>> (if (empty? s) >>> (empty? stack) >>> (let [c (first s) >>> top (first stack) >>> stack (if (match top c) (next stack) (cons c stack))] >>> (helper (next s) stack)))) >>> >>> (defn balanced? [s] (helper s '())) >>> >>> (doseq [arg *command-line-args*] >>> (println (balanced? arg))) >>> >>> (deftest match-test >>> (is (match \( \))) >>> (is (match \[ \])) >>> (is (not (match \( \{)))) >>> >>> (deftest balanced-test >>> (is (balanced? "()")) >>> (is (balanced? "[]")) >>> (is (balanced? "([])")) >>> (is (balanced? "[()]")) >>> (is (balanced? "[]()")) >>> (is (balanced? "[][[([])]]")) >>> (is (not (balanced? "("))) >>> (is (not (balanced? ")"))) >>> (is (not (balanced? "["))) >>> (is (not (balanced? "]"))) >>> (is (not (balanced? "]["))) >>> (is (not (balanced? ")("))) >>> (is (not (balanced? "( )"))) >>> (is (not (balanced? "([)"))) >>> (is (not (balanced? "[)]"))) >>> (is (not (balanced? "([)]"))) >>> (is (not (balanced? "({})"))) >>> (is (not (balanced? "[())]")))) >>> >>> (run-tests) > > -- > R. Mark Volkmann > Object Computing, Inc. > > > > --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---