LISP - 迴圈


可能有一種情況,當需要執行程式碼塊多次。迴圈語句可以讓我們執行一個語句或語句組多次,下面是在大多數程式設計語言中的迴圈語句的一般形式為:

Loop constructs

LISP提供的結構來處理迴圈要求以下型別。點選以下連結,檢視其詳細資訊。

Construct 描述
loop 迴圈loop結構是疊代通過LISP提供的最簡單的形式。在其最簡單的形式,它可以重複執行某些語句(次),直到找到一個return語句。
loop for loop結構可以實現一個for迴圈疊代一樣作為最常見於其他語言。
do do 結構也可用於使用LISP進行疊代。它提供了疊代的一種結構形式。
dotimes dotimes構造允許迴圈一段固定的疊代次數。
dolist dolist來構造允許疊代通過列表的每個元素。

迴圈loop結構

迴圈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構造

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 構造

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 構造

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