使用 while 循环

只要 while 表达式的 true-or-false-test 在评估时返回真值,就会重复评估主体。这个过程称为循环,因为Lisp解释器一遍又一遍地重复相同的操作,就像一架飞机做环形飞行一样。当评估 true-or-false-test 的结果为假时,Lisp解释器将不再评估 while 的其余部分并退出循环。

显然,如果通过评估 while 的第一个参数返回的值始终为真,那么接下来的主体将一遍又一遍地被评估……而且永远都是如此。相反,如果返回的值从不为真,主体中的表达式将永远不会被评估。编写 while 循环的技巧在于选择一种机制,使得 true-or-false-test 仅在您希望后续表达式被评估的次数返回真,然后使测试返回假。

通过评估 while 的返回值是 true-or-false-test 的值。这样做的一个有趣的结果是,如果 while 循环评估成功且没有错误,它将始终返回 nil 或 false,无论它循环了1次还是100次,甚至一次都没有循环。成功评估的 while 表达式永远不返回真值!这意味着 while 总是被评估为其副作用,也就是评估循环体内表达式的后果。这是有道理的。人们追求的不仅仅是循环的行为,更是循环体内表达式反复评估时产生的后果。