Conditional expressions can be done with ~[
and ~]
. The clauses of the expression are separated using ~;
.
By default, ~[
takes an integer from the argument list, and picks the corresponding clause. The clauses start at zero.
(format t "~@{~[First clause~;Second clause~;Third clause~;Fourth clause~]~%~}"
0 1 2 3)
; First clause
; Second clause
; Third clause
; Fourth clause
The last clause can be separated with ~:;
instead to make it the else-clause.
(format t "~@{~[First clause~;Second clause~;Third clause~:;Too high!~]~%~}"
0 1 2 3 4 5)
; First clause
; Second clause
; Third clause
; Too high!
; Too high!
; Too high!
If the conditional expression starts with ~:[
, it will expect a generalized boolean instead of an integer. It can only have two clauses; the first one is printed if the boolean was NIL
, and the second clause if it was truthy.
(format t "~@{~:[False!~;True!~]~%~}"
t nil 10 "Foo" '())
; True!
; False!
; True!
; True!
; False!
If the conditional expression starts with ~@[
, there should only be one clause, which is printed if the input, a generalized boolean, was truthy. The boolean will not be consumed if it is truthy.
(format t "~@{~@[~s is truthy!~%~]~}"
t nil 10 "Foo" '())
; T is truthy!
; 10 is truthy!
; "Foo" is truthy!