在第一种形式中,它使用一个数字计数器,var最初被赋予expr1的值,并在每次循环执行结束时由expr3递增,直到它达到一个大于expr2的值。如果没有给出expr3,则默认值为1。此时可以选择使用local语句将var创建为函数的局部变量。注意expr1、expr2和expr3(它们可能是任意的代数表达式)在循环开始时计算;在循环中重新定义它们的组件变量对循环执行的次数没有影响。Var是单个整型变量;它可以在循环内的表达式中使用(如果它是一个全局变量,甚至可以在循环内调用的函数中使用),甚至可以重新定义。下面的代码片段演示了该表单的基本用法,即对指定值以下的所有整数求和。
fish define sum(n)
local s = 0
loop local i (1,n)
s += i
endloop
sum = s
end
[s = sum(10)]
list @s
fish define sum_even(n)
local s = 0
loop local i (0,n,2)
s += i
endloop
sum_even = s
end
[s2 = sum_even(10)]
list @s2
对于n=10,函数的最终结果是@s = 55和@s2 = 30。注意,循环值可以是整数,也可以是实数,通过对expr3使用负值,它可以从一个较大的值变为一个较小的值。
形式2
在循环结构的第二种形式中,当测试条件为真时,执行循环体;否则,控制将传递到endloop语句之后的下一行。检验的形式与if语句所描述的形式相同。表达式可能包括浮点变量和整数;在适用于if语句的相同条件下,也允许使用布尔值、字符串和指针。下面的代码片段演示了这种形式的基本用法,即对指定值以下的所有偶数求和。
fish define sum_even(n)
local s = 0
local i = 0
loop while i <= n
s += i
i +=2
endloop
sum_even = s
end
[s2 = sum_even(10)]
list @s2当n = 10时,总和的最终结果是30。
下面的代码片段演示了这种形式的基本用法,即对指定值以下的所有奇整数求和。
fish define sum_odd(n)
local s= 0
loop for (local i=1, i <=n, i+=2)
s += i
endloop
sum_odd = s
end
[s_odd = sum_odd(10)]
list @s_odd
当n = 10时,总和的最终结果是25。
循环语句的前三种形式可以进行对比。在第一个循环中,测试是在循环结束时完成的(所以至少要通过一次循环);在第二个和第三个循环中,测试是在循环开始时完成的(所以如果测试一开始是假的,循环将被绕过)。
形式4
循环语句的第四种形式是一种专门的语法,允许遍历给定容器内的所有对象。在这种情况下,expr1必须返回一个指向列表的指针,或者一个对象容器。例如,用户定义标量列表中的所有标量都由FISH固有的user.scalar.list返回。与第一个循环形式一样,可以在var前面加上local语句,表示要创建一个局部变量而不是全局变量。Var将被赋值为连续指向列表中每个对象的指针。如果在循环处理过程中删除var,则只要删除后var不在同一个循环中再次引用,循环就会正常继续。如果容器中的其他项被删除(例如,如果调用一个删除容器内容的函数),那么循环可能会提前退出。
fish define scalar_location
loop foreach local pnt data.scalar.list
io.out(data.scalar.pos(pnt))
endloop
end
循环可以嵌套到任何深度。在循环中,exit loop语句可用于跳出循环并在endloop语句之后继续处理。此外,continue语句可用于停止处理当前循环并继续执行下一个循环。