LISP 中的循环
循环允许在某些条件为真时重复执行一组指令。 LISP 提供以下类型的循环:
1. dotimes 循环:
dotime 循环允许以固定次数执行指令。
句法:
(dotimes( variableName numberOfIterations ) (
expressions
))
在哪里,
- variableName =>变量名,可用于获取当前迭代次数
- numberOfIterations =>总迭代次数
- 表达式=>要在每次迭代中执行的语句
例子:
Lisp
(dotimes (a 4)
(print a))
(write-line "")
Lisp
(dotimes (i 7)
(if (> i 5)
(return)
(print i))
)
(write-line "")
Lisp
(defvar n 3)
(loop
(print n)
(setq n (+ n 1))
(when (> n 6) (return n))
)
(write-line "")
Lisp
; initialize x=12, execute instructions,
; increment it by 3 and perform iteration until it is less than 25
(loop for x from 12 to 25 by 3 do
(print x)
)
(write-line "")
Lisp
(do ((a 0 (+ 2 a))
(b 20 ( - b 2)))
((= a b)(- a b))
(format t "~% a = ~d b = ~d" a b)
)
(write-line "")
Lisp
(defvar nums `(9 5 2 3))
(dolist (item nums)
(print item)
)
(write-line "")
输出:
如果满足某个条件,您也可以从循环中返回
Lisp
(dotimes (i 7)
(if (> i 5)
(return)
(print i))
)
(write-line "")
在这里,循环设置为迭代 7 次,但是,当值变得超过 5 时,循环会因为满足条件而停止。
输出:
2.循环:
循环结构允许重复执行一些语句,直到找到返回语句。
句法:
( loop
(expressions)
( when (condition) (return returnValue))
)
在哪里,
- 表达式=>要在每次迭代中执行的语句
- 条件=>指定何时退出循环的条件
- returnValue =>要返回的值
例子:
Lisp
(defvar n 3)
(loop
(print n)
(setq n (+ n 1))
(when (> n 6) (return n))
)
(write-line "")
这里,n 被打印并递增,直到它大于 6。
输出:
3.循环:
for 结构的循环类似于Java、c++ 等流行语言中的 for 循环。它也可以用于遍历列表和其他数据结构。
句法:
( loop for variableName from startValue to endValue by changeValue do
(expressions)
)
在哪里,
- variableName =>变量名,可用于获取当前迭代中变量的值。
- startValue =>变量的初始值
- endValue =>变量的结束值(上次迭代后)
- changeValue =>指定每次迭代后增加或减少多少值
- 表达式 =>要在每次迭代中执行的语句
例子:
Lisp
; initialize x=12, execute instructions,
; increment it by 3 and perform iteration until it is less than 25
(loop for x from 12 to 25 by 3 do
(print x)
)
(write-line "")
输出:
4. 做:
do 构造允许结构化形式的迭代。
句法:
(do ((variable_1 value_1 updated-value_1)
(variable_2 value_2 updated-value_2)
(variable_3 value_3 updated-value_3)
...)
(test return_value)
(s-expressions)
)
在哪里,
- variable_1 =>第一个变量
- value_1 =>第一个变量的初始值
- updated-value_1 =>指定每次迭代后如何更新 variable_1。
- variable_2 =>第二个变量
- value_2 =>第二个变量的初始值
- updated-value_2 =>指定每次迭代后如何更新 variable_2。 ... 类似直到variable_n
- 测试 =>指定何时停止循环的条件
- 返回值 =>迭代结束时返回的值
- 表达式 =>要在每次迭代中执行的其他语句
评估每个变量的初始值并将其绑定到相应的变量。每个子句中的更新值与一个可选的更新语句有关,该语句指示如何在每次迭代中更新变量。
每次迭代都会执行测试,如果测试表达式的结果为非空或真值,则计算并返回返回值。
如果指定了最后一个可选的 s-expression(s),则它们在每次迭代时执行,而测试表达式结果为真。
例子:
Lisp
(do ((a 0 (+ 2 a))
(b 20 ( - b 2)))
((= a b)(- a b))
(format t "~% a = ~d b = ~d" a b)
)
(write-line "")
输出:
5. 列表:
dolist 结构提供了一种遍历列表的简单方法。
句法:
(dolist (listItemVariable list)
(expressions)
)
在哪里,
- listItemVariable =>在每次迭代期间保存每个列表项的值
- list =>要遍历的列表
- 表达式 =>要在每次迭代中执行的语句
例子:
Lisp
(defvar nums `(9 5 2 3))
(dolist (item nums)
(print item)
)
(write-line "")
输出:
参考:
- LISP 中循环的官方文档