LISP - 循环
可能有一种情况,当需要执行代码块多次。循环语句可以让我们执行一个语句或语句组多次,下面是在大多数编程语言中的循环语句的一般形式为:
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