ELisp编程九:循环

来源:互联网 发布:网络大电影市场收益 编辑:程序博客网 时间:2024/06/10 12:00

while函数原型

(while TEST BODY...)



比如:

(setq i 0)(while (< i 10)  (message "i = %d" i)  (incf i))


结果是在*Message* buffer中

i = 0i = 1i = 2i = 3i = 4i = 5i = 6i = 7i = 8i = 9


message函数负责将结果写入到*Message* buffer,并且支持C函数format的格式, %d就是可以将整数打印出来

(incf i) 每次对i加1

遍历list

下面的这个例子的代码演示了如何遍历list中的每个元素,并打印:

(setq animals '(gazelle giraffe lion tiger))(defun print-elements-of-list (list)       "Print each element of LIST on a line of its own."       (while list         (print (car list))         (setq list (cdr list))))(print-elements-of-list animals)

car函数返回list中的第一个元素

cdr函数将list中第二个元素开始的元素作为一个新的list返回


中断循环

如果我们要实现常见的break跳出循环,比如像下面的JavaScript代码:

var x = total = 0;while (true) {  total += x;  if (x++ > 10) {    break;  }}

eLisp中应该这样写:

(setq x 0 total 0)(catch 'break  (while t    (incf total x)    (if (> (incf x) 10)        (throw 'break total))))

catch函数获取到里面throw函数返回的total,当然也可不必返回有效值,用nil即可。

(throw 'break nil)


跳过本次循环

用throw/catch 实现continue

(setq x 0 total 0)(while (< x 100)  (catch 'continue    (incf x)    (if (zerop (% x 5))        (throw 'continue nil))    (incf total x)))



原创粉丝点击