Something I discovered about Clojure's cond recently.
It usually looks likethis:
(cond (< a b) (println "a < b")
(> a b) (println "a > b")
:else (println "a = b"))
I thought the :else had to be :else, but it only needs to be truthy, so it can be anything that isn't false or nil (which makes sense as you want it to always execute that form if no others match).
So this is just the same:
(cond (< a b) (println "a < b")
(> a b) (println "a > b")
:hotdog (println "a = b"))
Probably obvious to everyone else but it was a bit of a "duh, of course!" moment for me.
In traditional Lisp and common Lisp, and similar dialects, the symbol t is customarily used as the catch all last case.
There is an interesting situation is in the case family of constructs which match an input value against keys, in Common Lisp.
Inspired by cond, the t symbol also serves as the fallback in case when the key doesn't match the other cases. So that is to say:
(case (expr)
(a ...)
(b ...)
(42 ...)
(t ...)) ;; <-- this isn't matching on the t symbol!
Common Lisp also supports the symbol otherwise in place of t.
But the programmer may also sometimes have the t symbol as a specific key value; or likewise the otherwise symbol. That requirement is handled by putting the key into a list:
(case (expr)
(a ...)
...
((t) ...)) ;; <- match on t
It usually looks likethis:
I thought the :else had to be :else, but it only needs to be truthy, so it can be anything that isn't false or nil (which makes sense as you want it to always execute that form if no others match).So this is just the same:
Probably obvious to everyone else but it was a bit of a "duh, of course!" moment for me.