`
阿尔萨斯
  • 浏览: 4205756 次
社区版块
存档分类
最新评论

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个方法调用的结果。

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



分享到:
评论

相关推荐

    AutoCAD完全应用指南—AutoLISP DCL Visual LISP程序设计篇(随书光盘)

    还介绍了autocad activex对象控制以及visual lisp在e2d、3d、文字编辑、图层管理、块与属性管理、options选项控制、excel及word中的应用;最后介绍了visual lisp应用程序的创建与维护。  《autocad完全应用指南....

    autocad完全应用指南.autolisp+dcl+visuallisp程序设计篇(2011年4月第一版).part1.rar

    还介绍了autocadactivex对象控制以及visuallisp在e2d、3d、文字编辑、图层管理、块与属性管理、options选项控制、excel及word中的应用;最后介绍了visuallisp应用程序的创建与维护。 《autocad完全应用指南.autolisp...

    autocad完全应用指南.autolisp+dcl+visuallisp程序设计篇(2011年4月第一版).part4.rar

    还介绍了autocadactivex对象控制以及visuallisp在e2d、3d、文字编辑、图层管理、块与属性管理、options选项控制、excel及word中的应用;最后介绍了visuallisp应用程序的创建与维护。 《autocad完全应用指南.autolisp...

    autocad完全应用指南.autolisp+dcl+visuallisp程序设计篇(2011年4月第一版).part2.rar

    还介绍了autocadactivex对象控制以及visuallisp在e2d、3d、文字编辑、图层管理、块与属性管理、options选项控制、excel及word中的应用;最后介绍了visuallisp应用程序的创建与维护。 《autocad完全应用指南.autolisp...

    autocad完全应用指南.autolisp+dcl+visuallisp程序设计篇(2011年4月第一版).part3.rar

    还介绍了autocadactivex对象控制以及visuallisp在e2d、3d、文字编辑、图层管理、块与属性管理、options选项控制、excel及word中的应用;最后介绍了visuallisp应用程序的创建与维护。 《autocad完全应用指南.autolisp...

    pic:用 Common Lisp 编写的 8 位 PIC 微控制器的本地编译器

    PIC - PIC 是 8 位 PIC 微控制器的编译器用 Common Lisp 编写的 8 位 PIC 微控制器的本地编译器。 宿主语言是类 ML 语言的一个很小的子集,目标语言是 8 位 PIC 微控制器汇编。 Common Lisp 是编译器语言。用法以下...

    Ruby 小白入门指南理解 Ruby 及其特点.txt

    一、理解 Ruby 及其特点 Ruby 是一种简单快捷的面向对象脚本语言,由日本人松本行弘(Yukihiro ...条件语句和循环:Ruby 使用 if...else、case、while、for 等条件语句和循环语句来控制程序的流程。你需要理解这些语

    matlab代码影响-learning-julia:通过复制Schelling的隔离动态模型学习Julia

    matlab代码影响在Julia中复制Schelling的隔离动态模型 此存储库通过复制来引入。 陪同职位 ...我没有讨论概念(类型,循环,控制语句等),而是采用了问题驱动的方法-给定一个特定的问题,我们如何使用J

    我的编程感悟(中文PDF)(共37M二分卷)分卷二

    6.2.5 避免过大的循环 144 6.3 汇编和C/C++的混合编程 146 6.3.1 使用外置的汇编编译器 146 6.3.2 使用内嵌汇编 148 6.3.3 C++的函数调用规则 150 6.3.4 寄存器的使用 152 6.3.5 _declspec(naked) 152 6.4 指令使用...

    我的编程感悟(中文PDF)(共37M二分卷)分卷一

    6.2.5 避免过大的循环 144 6.3 汇编和C/C++的混合编程 146 6.3.1 使用外置的汇编编译器 146 6.3.2 使用内嵌汇编 148 6.3.3 C++的函数调用规则 150 6.3.4 寄存器的使用 152 6.3.5 _declspec(naked) 152 6.4 指令使用...

    《你必须知道的495个C语言问题》

    C是一门简洁精妙的语言,掌握基本语法容易,真正能够自如运用,就不那么简单了。你难免会遇到各种各样的问题,有些可能让你百思不得其解,甚至翻遍图书馆,也找不到问题的答案。 《你必须知道的495个C语言问题》的...

    你必须知道的495个C语言问题

    3.5 可否用显式括号来强制执行我所需要的计算顺序并控制相关的副作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 3.6 可是&&和||操作符呢?我看到过类似while((c=getchar())!=EOF&&c!='\n')的代码……...

    游戏之旅--我的编程感悟【有目录】

    比编程语言本身更为蜇要C 语言 只是工具,算法才是灵魂。这里 简单介绍了数据结构的基本知 识、算法放率的评估方法、几种 NP 问题的定义。 这里对游戏中最常用的搜索 算法问题之一寻路问题做了些许 探讨,并展开介绍...

    C语言FAQ 常见问题列表

    能否关掉填充, 或者控制结构域的对齐方式? o 3.11 为什么 sizeof 返回的值大于结构的期望值, 是不是尾部有填充? o 3.12 如何确定域在结构中的字节偏移? o 3.13 怎样在运行时用名字访问结构中的域? o 3.14 程序...

    你必须知道的495个C语言问题(PDF)

    2.4 在C 语言中实现抽象数据类型什么方法最好? . . . . . . . . . . . 7 2.5 在C 中是否有模拟继承等面向对象程序设计特性的好方法? . . . 7 i 目录ii 2.6 我遇到这样声明结构的代码: struct name f int namelen; ...

Global site tag (gtag.js) - Google Analytics