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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
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
-~----------~----~----~----~------~----~------~--~---