快速业务通道

跨越边界: Lisp之美 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
的第一个原子,rest 选择函数返回除第一个原子外的整 个列表。清单 4 显示了这两个选择函数:

清单 4. 基本 Lisp 函数> (first ''(lions tigers bears)) LIONS > (rest ''(lions tigers bears)) (TIGERS BEARS)

这两个选择函数都获取整个列表,返回列表的主要片断。稍后,您将了解递归如何利用这些选择函数 。

跨越边界: Lisp之美(2)

时间:2011-07-25 IBM Bruce Tate

如果希望构建列表而不是将其分开,就需要构造函数。与在 Java 语言中一样,构造函数构建新元素 :在 Java 语言中为对象,在 Lisp 中即为列表。cons、list 和 append 是构造函数示例。核心构造函 数 cons 带有两个参数:一个原子和一个列表。cons 将该原子作为第一个元素添加到该列表。如果对 nil 调用 cons,Lisp 将 nil 作为空列表对待,并构建一个含一个元素的列表。append 连接两个列表。 list 包含一个由所有参数组成的列表。清单 5 显示了这些构造函数的实际应用:

清单 5. 使用构造函数> (cons ''lions ''(tigers bears)) (LIONS TIGERS BEARS) > (list ''lions ''tigers ''bears) (LIONS TIGERS BEARS) > (append ''(lions) ''(tigers bears)) (LIONS TIGERS BEARS)

将 cons 与 first、rest 一起用时可以构建任何列表。list 和 append 运算符只是为了方便,但经 常会用到它们。事实上,可以使用 cons、first 和 rest 来构建任何列表,或返回任何列表片段。例如 ,要获取列表的第二或第三个元素,应该获取 rest 中的 first,或 rest 中的 rest 中的 first,如清 单 6 所示。或者,若要构建包含两个或三个元素的列表,可以将 cons 和 first、rest 一起使用,来模 拟 list 和 append。

清单 6. 构建第二个元素、第三个元素,然后模拟 list 和 append

>(first (rest ''(1 2 3))) 2 >(first (rest (rest ''(1 2 3)))) 3 >(cons ''1 (cons ''2 nil)) (1 2) >(cons ''1 (cons ''2 (cons ''3 nil))) (1 2 3) >(cons (first ''(1)) ''(2 3)) (1 2 3)

这些示例也许无法引起您的兴趣,但在如此简单的原语之上构建一门简洁优美的语言,其中的原理让 一些程序员激动不已。这些由列表构建的简单指令构成了递归、高阶函数,甚至是闭包和 continuation 之类高级抽象的基础。因此下面将研究高级抽象。

构建函数

可以猜到,Lisp 函数声明为列表。清单 7 构建了一个返回列表第二个元素的函数,展示了函数声明 的形式:

清单 7. 构建第二个函数(defun my_second (lst)   (first (rest lst)) )

defun 是用于定义自定义函数的函数。第一个参数是函数名,第二个参数是参数列表,第三个参数是 希望执行的代码。可以看出,所有 Lisp 代码都表述为列表。借助这项灵活和强大的功能,就可以像操纵 其他任何数据一样操纵应用程序。稍后将看到一些示例使代码和数据之间的区别变得模糊。

Lisp 也处理条件结构,如 if 语句。格式为 (if condition_statement then_statement else_statement)。清单 8 是一个简单的 my_max 函数,用于计算两个输入变量中的最大值:

清单 8. 计算两个整数中的最大值(defun my_max (x y)   (if (> x y) x y) ) MY_MAX (my_max 2 5) 5 (my_max 6 1) 6

下面回顾一下到目前为止看到的内容:

Lisp 使用列表和原子来表示数据和程序。

对列表求值时将第一个元素看作列表函数,将其他元素看作函数参数。

Lisp 条件语句将 true/false 表达式和代码一起使用。

跨越边界: Lisp之美(3)

时间:2011-07-25 IBM Bruce Tate

递归

Lisp 提供用于迭代的编码结构,但递归是更受欢迎的列表遍历方式。使用 first 和 rest 组合实现 递归效果很好。清单 9 中的 total 函数显示了其运行原理:

清单 9. 使用递归计算列

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号