ELisp编程九:循环

while函数原型

(while TEST BODY...)



比如:

(setq i 0)

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


结果是在*Message* buffer中

i = 0
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 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)))



你可能感兴趣的:(JavaScript,编程,list,each)