Lisp语言:循环控制

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

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


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

(defun looptest1 ()
        (loop for i from 1 to 10  do
                (format *query-io* "*"))
)
上面循环语句的作用类似于c语言的for (i=1 ;i < = 10 ;i++)。


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



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

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


上面的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的时候就会退出循环:

(defun looptest3 ()
        (setq i 1)
        (loop while (< i 10) do
                (format *query-io* "*")
                (setq i (+ i 1)))
)


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

(defun looptest4 ()
        (setq i 1)
        (loop until (> i 10) do
                (format *query-io* "*")
                (setq i (+ i 1)))
)


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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值