了解了Lisp语言的条件判断,让我们看看Lisp语言的循环控制。对于稍有编程经验的人来说,循环是比较容易理解的,一般语言里面的循环无外乎for循环,while循环,do until循环等,有些语言的循环稍微复杂一点,也不过是一些变化形式。而Lisp语言里的循环却不是这么简单,查找Lisp中loop的使用就可以发现一系列的资料,有关于loop的简单使用的,有关于loop的高阶使用的,仔细看起来会觉得学习loop的使用都像是在学习一门语言,而不是某中语言的一个关键字。究其根源,loop其实是一个宏,是Lisp自我扩展的结果。有关于宏的深入了解不是短短一篇文章可以完成的,也不是本文的目的,这里暂时不作讨论。

在不讨论宏的情况下,我们可以用一种简单的方法来学习Lisp中的循环,就是列出一些常用的,容易理解的loop循环,直接当标准语法记住,就如同我们记住其它语言的for循环一样。

Lisp中的for循环使用样例如下:

1. (defun looptest1 ()  
2.         (loop for i from 1 to 10  do  
3.                 (format *query-io* "*"))  
4. )

上面循环语句的作用类似于c语言的for (i=1 ;i < = 10 ;i++)。

执行的结果是循环输出*号。

Lisp中还用一种常用的loop循环是遍历一个列表,样例如下:

1. (defun looptest2 ()  
2.         (setq i-list '(a b c d e f g))  
3.         (loop for i in i-list  do  
4.                 (format *query-io* "~a  " i))  
5. )

上面的Lisp语句设置变量i-list的值为列表(a b c d e f g),注意列表前面的单引号',这个符号表明后面的列表不要进行计算,这样这个列表才能保持原样赋予变量i-list。否则运行时Clisp会尝试执行( a b c d e f g),认为a是一个函数,就会报错。

然后loop循环会遍历i-list这个列表,将i-list列表中的每一个值赋予变量i,然后进入循环体,以上语句会依次输出“ A  B  C  D  E  ” 

以上两种loop循环都是由Lisp语言来控制循环的,开发人员不需要考虑步长,循环条件等因素,只需要考虑循环体内完成的工作就可以了。 

下面两种循环稍微麻烦一点,需要开发人员控制循环条件,就像平时我们使用while循环和do until循环一样,需要在循环体内修改变量,使循环条件在某种情况下不满足,从而退出循环。 

下面的循环是while循环,循环条件是i 小于10,在循环体内对i进行累加,当i大于等于10的时候就会退出循环:

1. (defun looptest3 ()  
2.         (setq i 1)  
3.         (loop while (< i 10) do  
4.                 (format *query-io* "*")  
5.                 (setq i (+ i 1)))  
6. )

而下面这种是do until循环,循环一直执行直到i大于10,同样在循环体内对i进行累加,使i最终满足大于10的条件:

    1. (defun looptest4 ()  
    2.         (setq i 1)  
    3.         (loop until (> i 10) do  
    4.                 (format *query-io* "*")  
    5.                 (setq i (+ i 1)))  
    6. )

    下面是程序执行过程的截图,列出上面4个方法调用的结果。

    细心的读者可以数一数其中的星号个数,想一想为什么几个方法输出的星号个数会不同。


    subprocess 重复利用 lisp重复执行_Lisp