Ah, :else is an unfortunate choice.  The cond macro keeps testing
clauses until it finds one that is true.  :else was chose because it
is simply not nil, and therefor always true.

I would re-write your fn like so:

(defn sign [x] (cond (> x 0) "Positive" (< x 0) "Negative" true
"Zero"))

Sean

On Dec 19, 10:22 pm, Mike K <mbk.li...@gmail.com> wrote:
> What, exactly, is a "clause" in clojure?  From seeing the term used in
> context, I inferred that it meant something along the lines of "a
> keyword which can optionally be used to change the semantics of a
> form".  Apparently, it means more than that.
>
> This is valid clojure:
>
> (defn sign [x] (cond (> x 0) "Positive" (< x 0) "Negative" :else
> "Zero"))
>
> I had no idea that I could use :else for the fallthrough case of a
> "cond", so I looked it up in the docs:
>
> user> (doc cond)
> -------------------------
> clojure.core/cond
> ([& clauses])
> Macro
>   Takes a set of test/expr pairs. It evaluates each test one at a
>   time.  If a test returns logical true, cond evaluates and returns
>   the value of the corresponding expr and doesn't evaluate any of the
>   other tests or exprs. (cond) returns nil.
>
> Apparently, each "test/expr pair" is a clause, or perhaps each test
> and each expression is a clause.  No mention of supporting an :else
> "clause" though.  Let's check out the source code:
>
> (defmacro cond
>   "Takes a set of test/expr pairs. It evaluates each test one at a
>   time.  If a test returns logical true, cond evaluates and returns
>   the value of the corresponding expr and doesn't evaluate any of the
>   other tests or exprs. (cond) returns nil."
>   [& clauses]
>     (when clauses
>       (list 'if (first clauses)
>             (if (next clauses)
>                 (second clauses)
>                 (throw (IllegalArgumentException.
>                          "cond requires an even number of forms")))
>             (cons 'clojure.core/cond (next (next clauses))))))
>
> I don't know much about macros, but it is clear that "cond" builds on
> "if".  However, the documentation for "if" mentions nothing
> about :else, and the source for "if" is not available, presumably
> because it's implemented in java.
>
> Is there a way to have discovered the existence of :else from the
> documentation alone?  Is this just an oversight in the docs, or is
> there a more general point concerning clauses that I'm missing?
>
>    Mike

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