在Common Lisp中,if是最简单的条件构造。它的形式(if test then [else])和被评估then,如果test是真实的,else否则。其他部分可以省略。
(if (> 3 2) "三个更大!" "两个更大!") ;;=> "三个更大!"
ifCommon Lisp和if许多其他编程语言之间的一个非常重要的区别是,CLif是表达而不是陈述。因此,if表单返回值可以分配给变量,也可以在参数列表等中使用:
;; Use a different format string depending on the type of x (format t (if (numberp x) "~x~%" "~a~%") x)
if在C#和其他“花括号”语言中,可以将Common Lisp视为等效于三元运算符?:。
例如,以下C#表达式:
year == 1990 ? "Hammertime" : "Not Hammertime"
假定year保存一个整数,它等效于以下Common Lisp代码:
(if (eql year 1990) "Hammertime" "Not Hammertime")
cond是另一个条件构造。它有点类似于一条if语句链,其形式为:
(cond (test-1 consequent-1-1 consequent-2-1 ...) (test-2) (test-3 consequent-3-1 ...) ... )
更确切地说,cond具有零个或多个子句,并且每个子句都有一个测试,后跟零个或多个结果。整个cond构造选择测试不评估的第一个子句,nil并按顺序评估其结果。它返回结果中最后一个表单的值。
(cond ((> 3 4) "三个大于四个!") ((> 3 3) "三个大于三个!") ((> 3 2) "三个大于两个!") ((> 3 1) "三大于一!")) ;;=> "三个大于两个!"
要提供默认子句以评估是否没有其他子句求和t,您可以使用添加默认情况下为true的子句t。这在概念上与SQL非常相似CASE...ELSE,但是它使用文字布尔值true而不是关键字来完成任务。
(cond ((= n 1) "N equals 1") (t "N doesn't equal 1") )
一个if结构可以写成一个cond结构。(if test then else)和(cond (test then) (t else))等价。
如果只需要一个子句,请使用when或unless:
(when (> 3 4) "三大于四。") ;;=> NIL (when (< 2 5) "二小于五。") ;;=> "二小于五。" (unless (> 3 4) "三大于四。") ;;=> "三大于四。" (unless (< 2 5) "二小于五。") ;;=> NIL