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