條件構造

在 Common Lisp 中,if 是最簡單的條件構造。它具有 (if test then [else]) 的形式,如果 test 為真,則評估為 then,否則評估為 else。else 部分可以省略。

(if (> 3 2)
    "Three is bigger!"
    "Two is bigger!")
;;=> "Three is bigger!"

Common Lisp 中的 if 和許多其他程式語言中的 if 之間的一個非常重要的區別是 CL 的 if 是一個表示式,而不是一個語句。因此,if 形成返回值,可以將其分配給變數,在引數列表中使用等:

;; Use a different format string depending on the type of x
(format t (if (numberp x)
              "~x~%"
              "~a~%")
           x)

Common Lisp 的 if 可以被認為等同於三元運算子?: 在 C#和其他大括號語言中。

例如,以下 C#表示式:

year == 1990 ? "Hammertime" : "Not Hammertime"

等效於以下 Common Lisp 程式碼,假設 year 包含一個整數:

(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) "Three is bigger than four!")
      ((> 3 3) "Three is bigger than three!")
      ((> 3 2) "Three is bigger than two!")
      ((> 3 1) "Three is bigger than one!"))
;;=> "Three is bigger than two!"

要提供一個 default 子句來評估是否有其他子句的計算結果為 t,你可以使用 t 新增一個預設為 true 的子句。這在概念上與 SQL 的 CASE...ELSE 非常相似,但它使用文字布林值而不是關鍵字來完成任務。

(cond
    ((= n 1) "N equals 1")
    (t "N doesn't equal 1")
)

if 構造可以寫成 cond 構造。(if test then else)(cond (test then) (t else)) 是等價的。

如果你只需要一個子句,請使用 whenunless

(when (> 3 4)
  "Three is bigger than four.")
;;=> NIL

(when (< 2 5)
  "Two is smaller than five.")
;;=> "Two is smaller than five."

(unless (> 3 4)
  "Three is bigger than four.")
;;=> "Three is bigger than four."

(unless (< 2 5)
  "Two is smaller than five.")
;;=> NIL