Книга: Practical Common Lisp
COND
COND
Another time raw IF
expressions can get ugly is when you have a multibranch conditional: if a do x, else if b do y; else do z. There's no logical problem writing such a chain of conditional expressions with just IF
, but it's not pretty.
(if a
(do-x)
(if b
(do-y)
(do-z)))
And it would be even worse if you needed to include multiple forms in the then clauses, requiring PROGN
s. So, not surprisingly, Common Lisp provides a macro for expressing multibranch conditionals: COND
. This is the basic skeleton:
(cond
(test-1 form*)
.
.
.
(test-N form*))
Each element of the body represents one branch of the conditional and consists of a list containing a condition form and zero or more forms to be evaluated if that branch is chosen. The conditions are evaluated in the order the branches appear in the body until one of them evaluates to true. At that point, the remaining forms in that branch are evaluated, and the value of the last form in the branch is returned as the value of the COND
as a whole. If the branch contains no forms after the condition, the value of the condition is returned instead. By convention, the branch representing the final else clause in an if/else-if chain is written with a condition of T
. Any non-NIL
value will work, but a T
serves as a useful landmark when reading the code. Thus, you can write the previous nested IF
expression using COND
like this:
(cond (a (do-x))
(b (do-y))
(t (do-z)))
- 8.5.2 Typical Condition Variable Operations
- 1. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- Assembly language, the second generation language
- Conditional Statements
- Conditionals and Looping
- 17.4.8. Debugging Deadlock Conditions
- Terms and Conditions for Copying, Distribution and Modification
- 3.3.2 Waiting on a condition variable
- Configuring a secondary DNS server
- Notifying secondaries of changes
- Unconditional Execution
- 8.5 Condition Variables