Go to the previous, next section.

Recursion Example Using  cond

The version of  triangle-recursively described earlier is written with the  if special form. It can also be written using another special form called  cond . The name of the special form  cond is an abbreviation of the word `conditional'.

Although the  cond special form is not used as often in the Emacs Lisp sources as  if , it is used often enough to justify explaining it.

The template for a  cond expression looks like this:


where the body is a series of lists.

Written out more fully, the template looks like this:

 ((first-true-or-false-test first-consequent)
  (second-true-or-false-test second-consequent)
  (third-true-or-false-test third-consequent)

When the Lisp interpreter evaluates the  cond expression, it evaluates the first element (the CAR or true-or-false-test) of the first expression in a series of expressions within the body of the  cond .

If the true-or-false-test returns  nil the rest of that expression, the consequent, is skipped and the true-or-false-test of the next expression is evaluated. When an expression is found whose true-or-false-test returns a value that is not  nil , the consequent of that expression is evaluated. The consequent can be one or more expressions. If the consequent consists of more than one expression, the expressions are evaluated in sequence and the value of the last one is returned. If the expression does not have a consequent, the value of the true-or-false-test is returned.

If none of the true-or-false-tests test true, the  cond expression returns  nil .

Written using  cond , the  triangle function looks like this:

(defun triangle-using-cond (number)
  (cond ((<= number 0) 0)
        ((= number 1) 1)
        ((> number 1)
         (+ number (triangle-using-cond (1- number))))))

In this example, the  cond returns 0 if the number is less than or equal to 0, it returns 1 if the number is 1 and it evaluates  (+ number (triangle-using-cond (1- number))) if the number is greater than 1.

Go to the previous, next section.