跨越边界: Lisp之美 - 编程入门网
的第一个原子,rest 选择函数返回除第一个原子外的整 个列表。清单 4 显示了这两个选择函数:
清单 4. 基本 Lisp 函数 这两个选择函数都获取整个列表,返回列表的主要片断。稍后,您将了解递归如何利用这些选择函数 。 跨越边界: 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 与 first、rest 一起用时可以构建任何列表。list 和 append 运算符只是为了方便,但经 常会用到它们。事实上,可以使用 cons、first 和 rest 来构建任何列表,或返回任何列表片段。例如 ,要获取列表的第二或第三个元素,应该获取 rest 中的 first,或 rest 中的 rest 中的 first,如清 单 6 所示。或者,若要构建包含两个或三个元素的列表,可以将 cons 和 first、rest 一起使用,来模 拟 list 和 append。 清单 6. 构建第二个元素、第三个元素,然后模拟 list 和 append
这些示例也许无法引起您的兴趣,但在如此简单的原语之上构建一门简洁优美的语言,其中的原理让 一些程序员激动不已。这些由列表构建的简单指令构成了递归、高阶函数,甚至是闭包和 continuation 之类高级抽象的基础。因此下面将研究高级抽象。 构建函数 可以猜到,Lisp 函数声明为列表。清单 7 构建了一个返回列表第二个元素的函数,展示了函数声明 的形式: 清单 7. 构建第二个函数 defun 是用于定义自定义函数的函数。第一个参数是函数名,第二个参数是参数列表,第三个参数是 希望执行的代码。可以看出,所有 Lisp 代码都表述为列表。借助这项灵活和强大的功能,就可以像操纵 其他任何数据一样操纵应用程序。稍后将看到一些示例使代码和数据之间的区别变得模糊。 Lisp 也处理条件结构,如 if 语句。格式为 (if condition_statement then_statement else_statement)。清单 8 是一个简单的 my_max 函数,用于计算两个输入变量中的最大值: 清单 8. 计算两个整数中的最大值 下面回顾一下到目前为止看到的内容: Lisp 使用列表和原子来表示数据和程序。 对列表求值时将第一个元素看作列表函数,将其他元素看作函数参数。 Lisp 条件语句将 true/false 表达式和代码一起使用。 跨越边界: Lisp之美(3)时间:2011-07-25 IBM Bruce Tate递归 Lisp 提供用于迭代的编码结构,但递归是更受欢迎的列表遍历方式。使用 first 和 rest 组合实现 递归效果很好。清单 9 中的 total 函数显示了其运行原理: 清单 9. 使用递归计算列 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |