common-lisp 条件构造

示例

在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