1. 程式人生 > >Lisp語言:條件判斷

Lisp語言:條件判斷

學習了Lisp語言的控制檯輸出與輸入,讓我們來看看Lisp語言的條件判斷。

Lisp中的條件判斷看起來和其它語言差不多,學習起來還是比較簡單的。

1. 基本用法:

基本的用法像下面這個樣子:

(if          條件判斷                條件成立時的結果           條件不成立時的結果)

我把其中的空間加長了,看起來比較清晰,反正Lisp對一個空格和多個空格的處理是一樣的。

按上面的用法,Lisp中實際使用if類似於下面這樣:

(if (> 3 2)  "messagea" "messageb")

上面語句判斷3是否大於2,如果3大於2的話會返回“messagea”,否則會返回“messageb”

3當然大於2啦,所以上面的語句會返回“messagea”,你可以啟動Clisp,輸入以上程式碼進行測試。


2. 省略第四個元素

條件判斷語句中的第四個元素是可以省略的,可以寫成下面這樣:

(if          條件判斷                條件成立時的結果 )

比如你可以將語句寫成這樣:

(if (> 3 2)  "messagea" )

執行後會返回“messagea”

如果條件不成立,則CLisp會返回NIL

如下面這樣的語句會返回NIL

(if (< 3 2)  "messagea" )

因為3<2這樣的條件不成立,所以CLisp會返回NIL

3. T 和 NIL


那麼,NIL是什麼呢?NIL是Lisp裡的“false”。

對應的,T是Lisp離得“true”。

所以下面第一個語句返回“message A”,而第二句語句返回的是“message B”。

(if T “message A” "message B")

(if NIL "message A" "messageB")
另外,在Clisp裡,除了NIL以為,其它所有合法的元素都被當作是T,比如下面的語句也會返回“message A”

(if   "just a string" “message A” "message B")



4. 有關else if

其它語言裡的條件判斷語句都有if () else if ()這樣的用法,在第一個條件不滿足是進一步判斷第二個條件,在Lisp裡有沒有對應的用法呢?

在Lisp裡可以將第二個條件判斷巢狀到第一個條件判斷中來完成類似else if的判斷,像下面這樣:

(if          第一個條件判斷                第一個條件成立時的結果           (if      第二個條件判斷     第二個條件成立時的結果      第二個條件不成立的結果))

實際的使用類似於這樣的:

(if          (<   a   10)        " a 小於10"        (  if     (<  a  20)   "  a 大於等於10,不過小於20"   "a 大於等於20"))

有程式設計經驗的人可以從語句中清晰的看到程式執行的過程,該語句對a進行判斷,如果a小於10則返回“a小於10”,如果a大於等於10則開始計算後面的結果,而後面的語句本身又是一個if判斷,於是開始第二個條件判斷的計算,這時如果a小於20則返回“a大於等於10,不過小於20”,否則返回“a大於等於20”。

這裡面要注意的是後面的if是包含在一對括號裡的,形成了巢狀關係,如果不加括號,寫成下面這樣會報錯的:

(if          (<   a   10)        " a 小於10"          if     (<  a  20)   "  a 大於等於10,不過小於20"   "a 大於等於20")


5. 簡單樣例


現在讓我們在上一篇文章的main方法里加一些條件判斷,做個簡單的樣例。上一篇文章連結如下:
http://blog.csdn.net/keyboardota/article/details/7614545

修改後樣例希望使用者輸入一個數字,然後對數字進行判斷,看輸入的數字是小於10,還是大於等於10,如果是大於等於10則進一步判斷輸入的數字是否小於20.

樣例很簡單,不過需要先解決一個問題,就是將使用者輸入的文字轉換成數字,轉換使用的是parse-integer函式,同時使用了:junk-allowed T引數,允許輸入的文字不是數字,如果輸入的不是數字的話該函式會返回NIL。

另外一點是Clisp環境中可以支援中文顯示和中文變數名,寫出來的函式如下:(不過有個善意的提醒,除非有一定必要,否則不要使用中文變數名,應為全形半形之類的原因容易打錯,而且在VIM環境中輸入中文不方便。)

(defun main ()

        (format *query-io* "請輸入一個數字:")
        (force-output *query-io*)
        (setq 輸入的內容 (read-line *query-io*))
        (setq 轉換結果 (parse-integer 輸入的內容 :junk-allowed T))
        (if 轉換結果
                (format *query-io* "~a ~a ~%" "你輸入的數字是:" 轉換結果)
                (format *query-io* "親!你輸入的不是一個數字oh!~%"))
        (if (< 轉換結果 10)
                (format *query-io* "輸入的數字小於10~%")
                (if (< 轉換結果    20)
                        (format *query-io* "輸入的數字大於等於10,不過小於20~%")
                        (format *query-io* "輸入的數字大於等於20~%")))
        (force-output *query-io*)

)