LISP - 決策


決策結構需要程式員指定一個或多個條件由程式進行評估或測試,以及要執行的語句或語句如果條件被確定為true,如果條件被確定為false那麼選擇要執行其他語句。

下面是在大多數程式設計語言中一個典型的決策結構的一般形式為:

Decision making constructs

LISP提供了以下型別的決策構造。點選以下連結,檢視其詳細資訊。

Construct 描述
cond 這個結構是用於用於檢查多個測試行動作條件。它可以巢狀if或其他程式設計語言語句。
if if結構有多種形式。在最簡單的形式,它後面跟著一個測試條,測試操作和一些其它相應措施(次)。如果測試子句的值為true,那麼測試的動作被執行,否則,由此產生的子句求值。
when 在最簡單的形式,它後面跟著一個測試條和測試操作。如果測試子句的值為true,那麼測試的動作被執行,否則,由此產生的子句求值。
case 這種結構實現了像cond 構造多個測試行動語句。但是,它會評估的關鍵形式,並允許根據該鍵的形式評價多個行動語句。

LISP的cond特殊構造

在LISP語言中cond結構是最常用的,以允許分支。

cond的語法是:

(cond   (test1    action1)
        (test2    action2)
	     ...
	    (testn   actionn))

在cond 語句中每個子句包含一個條件測試,並要執行的動作。

如果第一次測試下面的芯線,為test1,被評估為true,那麼相關的行動的一部分, action1執行,返回它的值,及本子句的其餘部分被跳過。

如果test1的計算結果是nil,然後控制移動到第二個子句,而不執行action1,和相同的流程進行後續處理。

如果沒有試驗條件計算結果為真,那麼cond語句返回nil。

範例

建立一個名為main.lisp一個新的原始碼檔案,並在其中輸入如下程式碼:

(setq a 10)
(cond ((> a 20)
    (format t "~% a is less than 20"))
(t (format t "~% value of a is ~d " a)))

當單擊Execute按鈕,或按下Ctrl+ E,LISP立即執行它,返回的結果是:

value of a is 10

請注意,第二個子句中t保證的是,如果沒有其他的將最後完成的動作。

if結構

如果該巨集後跟一個測試子句計算為 t 或nil。如果測試子句計算到t,然後按照測試子句的動作被執行。如果它是零,那麼下一個子句進行評估計算。

if的語法:

(if (test-clause) (<action1) (action2))

範例1

建立一個名為main.lisp一個新的原始碼檔案,並在其中輸入如下程式碼:

(setq a 10)
(if (> a 20)
    (format t "~% a is less than 20"))
(format t "~% value of a is ~d " a)

當單擊Execute按鈕,或按下Ctrl+ E,LISP立即執行它,返回的結果是:

value of a is 10

範例2

if子句後面可以跟一個可選的then子句:

建立一個名為main.lisp一個新的原始碼檔案,並在其中輸入如下程式碼:

(setq a 10)
(if (> a 20)
    then (format t "~% a is less than 20"))
(format t "~% value of a is ~d " a)

當您單擊Execute按鈕,或按下Ctrl+ E,LISP立即執行它,返回的結果是:

a is less than 20
value of a is 10 

範例 3

還可以建立使用if子句的if-then-else型別宣告。

建立一個名為main.lisp一個新的原始碼檔案,並在其中輸入如下程式碼:

(setq a 100)
(if (> a 20)
   (format t "~% a is greater than 20") 
    (format t "~% a is less than 20"))
(format t "~% value of a is ~d " a)

當單擊Execute按鈕,或按下Ctrl+ E,LISP立即執行它,返回的結果是:

a is greater than 20
value of a is 100  

when構造,

該when巨集,後面跟著一個測試子句計算為t或為零。如果測試條被評估計算為nil,則任何形式的評估及nil返回,但是它的測試結果為t,則下面的測試條的動作被執行。

when巨集的語法:

(when (test-clause) (<action1) )

範例

建立一個名為main.lisp一個新的原始碼檔案,並在其中輸入如下程式碼:

 (setq a 100)
(when (> a 20)
   (format t "~% a is greater than 20"))
(format t "~% value of a is ~d " a)

當您單擊Execute按鈕,或按下Ctrl+ E,LISP立即執行它,返回的結果是:

a is greater than 20
value of a is 100 

case構造

case結構實現像cond結構多個測試動作語句。但是,它會評估的鍵形式,並允許根據該鍵的形式評價多個動作語句。

該case巨集的語法是:

The template for CASE is:

(case  (keyform)
((key1)   (action1   action2 ...) )
((key2)   (action1   action2 ...) )
...
((keyn)   (action1   action2 ...) ))

範例

建立一個名為main.lisp一個新的原始碼檔案,並在其中輸入如下程式碼:

(setq day 4)
(case day
(1 (format t "~% Monday"))
(2 (format t "~% Tuesday"))
(3 (format t "~% Wednesday"))
(4 (format t "~% Thursday"))
(5 (format t "~% Friday"))
(6 (format t "~% Saturday"))
(7 (format t "~% Sunday")))

當您單擊Execute按鈕,或按下Ctrl+ E,LISP立即執行它,返回的結果是:

Thursday