可能有一種情況,當需要執行程式碼塊多次。迴圈語句可以讓我們執行一個語句或語句組多次,下面是在大多數程式設計語言中的迴圈語句的一般形式為:
LISP提供的結構來處理迴圈要求以下型別。點選以下連結,檢視其詳細資訊。
Construct | 描述 |
---|---|
loop | 迴圈loop結構是疊代通過LISP提供的最簡單的形式。在其最簡單的形式,它可以重複執行某些語句(次),直到找到一個return語句。 |
loop for | loop結構可以實現一個for迴圈疊代一樣作為最常見於其他語言。 |
do | do 結構也可用於使用LISP進行疊代。它提供了疊代的一種結構形式。 |
dotimes | dotimes構造允許迴圈一段固定的疊代次數。 |
dolist | dolist來構造允許疊代通過列表的每個元素。 |
迴圈loop結構是疊代通過LISP提供的最簡單的形式。在其最簡單的形式,它可以重複執行某些語句(次),直到找到一個return語句。
它的語法如下:
(loop (s-expressions))
例子
建立一個名為main.lisp一個新的原始碼檔案,並在其中輸入如下程式碼:
(setq a 10) (loop (setq a (+ a 1)) (write a) (terpri) (when (> a 17) (return a)))
當執行的程式碼,它返回以下結果:
11 12 13 14 15 16 17 18
請注意,沒有return語句,迴圈巨集會產生一個無限迴圈。
loop結構可以實現一個for迴圈疊代一樣作為最常見於其他語言。
它可以
設定為疊代變數
指定表示式(s)表示,將有條件終止疊代
對於執行某些任務在每次疊代中指定表示式的結果,
做一些任務而退出迴圈之前指定表示式(s)和表示式
在for迴圈的結構如下幾種語法:
(loop for loop-variable in <a list> do (action)) (loop for loop-variable from value1 to value2 do (action))
範例1
建立一個名為main.lisp一個新的原始碼檔案,並在其中輸入如下程式碼:
(loop for x in '(tom dick harry) do (format t " ~s" x) )
當單擊Execute按鈕,或按下Ctrl+ E,LISP立即執行它,返回的結果是:
TOM DICK HARRY
範例2
建立一個名為main.lisp一個新的原始碼檔案,並在其中輸入如下程式碼:
(loop for a from 10 to 20 do (print a) )
當單擊Execute按鈕,或按下Ctrl+ E,LISP立即執行它,返回的結果是:
10 11 12 13 14 15 16 17 18 19 20
範例3
建立一個名為main.lisp一個新的原始碼檔案,並在其中輸入如下程式碼:
(loop for x from 1 to 20 if(evenp x) do (print x) )
當單擊Execute按鈕,或按下Ctrl+ E,LISP立即執行它,返回的結果是:
2 4 6 8 10 12 14 16 18 20
do結構也可用於使用LISP進行疊代。它提供了疊代的一種結構形式。
do語句的語法:
(do (variable1 value1 updated-value1) (variable2 value2 updated-value2) (variable3 value3 updated-value3) ... (test return-value) (s-expressions))
每個變數的初始值的計算和結合到各自的變數。每個子句中更新的值對應於一個可選的更新語句,指定變數的值將在每次疊代更新。
每次疊代後,將測試結果進行評估計算,並且如果它返回一個nil 或 true,則返回值被求值並返回。
最後一個S-表示式(s)是可選的。如果有,它們每一次疊代後執行,直到測試返回true值。
範例
建立一個名為main.lisp一個新的原始碼檔案,並在其中輸入如下程式碼:
(do ((x 0 (+ 2 x)) (y 20 ( - y 2))) ((= x y)(- x y)) (format t "~% x = ~d y = ~d" x y))
當單擊Execute按鈕,或按下Ctrl+ E,LISP立即執行它,返回的結果是:
x = 0 y = 20 x = 2 y = 18 x = 4 y = 16 x = 6 y = 14 x = 8 y = 12
dotimes構造允許迴圈一段固定的疊代次數。
範例,
建立一個名為main.lisp一個新的原始碼檔案,並在其中輸入如下程式碼:
(dotimes (n 11) (print n) (prin1 (* n n)))
當單擊Execute按鈕,或按下Ctrl+ E,LISP立即執行它,返回的結果是:
0 0 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 10 100
dolist來構造允許疊代通過列表的每個元素。
範例,
建立一個名為main.lisp一個新的原始碼檔案,並在其中輸入如下程式碼:
(dolist (n '(1 2 3 4 5 6 7 8 9)) (format t "~% Number: ~d Square: ~d" n (* n n)))
當單擊Execute按鈕,或按下Ctrl+ E,LISP立即執行它,返回的結果是:
Number: 1 Square: 1 Number: 2 Square: 4 Number: 3 Square: 9 Number: 4 Square: 16 Number: 5 Square: 25 Number: 6 Square: 36 Number: 7 Square: 49 Number: 8 Square: 64 Number: 9 Square: 81
退出塊
塊返回,從允許從正常情況下的任何錯誤的任何巢狀塊退出。
塊功能允許建立一個包含零個或多個語句組成的機構命名塊。語法是:
(block block-name( ... ... ))
返回 - 從函式接受一個塊名稱和可選(預設為零)的返回值。
下面的例子演示了這一點:
範例
建立一個名為main.lisp一個新的原始碼檔案,並在其中輸入如下程式碼:
(defun demo-function (flag) (print 'entering-outer-block) (block outer-block (print 'entering-inner-block) (print (block inner-block (if flag (return-from outer-block 3) (return-from inner-block 5)) (print 'This-wil--not-be-printed))) (print 'left-inner-block) (print 'leaving-outer-block) t)) (demo-function t) (terpri) (demo-function nil)
當單擊Execute按鈕,或按下Ctrl+ E,LISP立即執行它,返回的結果是:
ENTERING-OUTER-BLOCK ENTERING-INNER-BLOCK ENTERING-OUTER-BLOCK ENTERING-INNER-BLOCK 5 LEFT-INNER-BLOCK LEAVING-OUTER-BLOCK