Lisp語言:條件判斷
阿新 • • 發佈:2019-02-16
學習了Lisp語言的控制檯輸出與輸入,讓我們來看看Lisp語言的條件判斷。
Lisp中的條件判斷看起來和其它語言差不多,學習起來還是比較簡單的。
1. 基本用法:
基本的用法像下面這個樣子:
我把其中的空間加長了,看起來比較清晰,反正Lisp對一個空格和多個空格的處理是一樣的。
按上面的用法,Lisp中實際使用if類似於下面這樣:
上面語句判斷3是否大於2,如果3大於2的話會返回“messagea”,否則會返回“messageb”
2. 省略第四個元素
條件判斷語句中的第四個元素是可以省略的,可以寫成下面這樣:
比如你可以將語句寫成這樣:
執行後會返回“messagea”
如果條件不成立,則CLisp會返回NIL
如下面這樣的語句會返回NIL
因為3<2這樣的條件不成立,所以CLisp會返回NIL
那麼,NIL是什麼呢?NIL是Lisp裡的“false”。
對應的,T是Lisp離得“true”。
所以下面第一個語句返回“message A”,而第二句語句返回的是“message B”。
4. 有關else if
其它語言裡的條件判斷語句都有if () else if ()這樣的用法,在第一個條件不滿足是進一步判斷第二個條件,在Lisp裡有沒有對應的用法呢?
在Lisp裡可以將第二個條件判斷巢狀到第一個條件判斷中來完成類似else if的判斷,像下面這樣:
實際的使用類似於這樣的:
有程式設計經驗的人可以從語句中清晰的看到程式執行的過程,該語句對a進行判斷,如果a小於10則返回“a小於10”,如果a大於等於10則開始計算後面的結果,而後面的語句本身又是一個if判斷,於是開始第二個條件判斷的計算,這時如果a小於20則返回“a大於等於10,不過小於20”,否則返回“a大於等於20”。
這裡面要注意的是後面的if是包含在一對括號裡的,形成了巢狀關係,如果不加括號,寫成下面這樣會報錯的:
現在讓我們在上一篇文章的main方法里加一些條件判斷,做個簡單的樣例。上一篇文章連結如下:
http://blog.csdn.net/keyboardota/article/details/7614545
修改後樣例希望使用者輸入一個數字,然後對數字進行判斷,看輸入的數字是小於10,還是大於等於10,如果是大於等於10則進一步判斷輸入的數字是否小於20.
樣例很簡單,不過需要先解決一個問題,就是將使用者輸入的文字轉換成數字,轉換使用的是parse-integer函式,同時使用了:junk-allowed T引數,允許輸入的文字不是數字,如果輸入的不是數字的話該函式會返回NIL。
另外一點是Clisp環境中可以支援中文顯示和中文變數名,寫出來的函式如下:(不過有個善意的提醒,除非有一定必要,否則不要使用中文變數名,應為全形半形之類的原因容易打錯,而且在VIM環境中輸入中文不方便。)
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”。
另外,在Clisp裡,除了NIL以為,其它所有合法的元素都被當作是T,比如下面的語句也會返回“message A”(if T “message A” "message B") (if NIL "message A" "messageB")
(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*)
)