跨越边界: Lisp之美 - 编程入门网
跨越边界: Lisp之美时间:2011-07-25 IBM Bruce TateLisp 长久以来一直被视为伟大的编程语言之一。其漫长的发展过程(接近五十年)中引发的追随狂潮 表明:这是一门非同凡响的语言。在 MIT,Lisp 在所有程序员的课程中占了举足轻重的地位。像 Paul Graham 那样的企业家们将 Lisp 卓越的生产力用作他们事业成功起步的推动力。但令其追随者懊恼万分 的是,Lisp 从未成为主流编程语言。作为一名 Java™ 程序员,如果您花一点时间研究 Lisp 这座 被人遗忘的黄金之城,就会发现许多能够改进编码方式的技术。 我最近第一次完成了马拉松赛跑 ,我发现跑步比我预想的更有价值。我跑了 26.2 英里,通过该步骤,我开始认为这是对身体非常有益的 简单活动。一些语言给了我类似的感觉,如 Smalltalk 和 Lisp。对 Smalltalk 来说,引发类似感觉的 是对象;Smalltalk 中的一切内容都是在处理对象和消息传递。对于 Lisp 来说,这个至为重要的步骤更 为简单。这门语言完全由列表组成。但不要被这个简单的假相所欺骗。这门有着 48 年历史的语言具有难 以置信的强大功能和灵活性,这是 Java 语言所不能企及的。 第一次和 Lisp 打交道时,我还是 在校大学生,但这次不是很顺利。因为我拼命地想把 Lisp 编入到熟悉的过程化范例中,而不是在 Lisp 的函数结构下工作。尽管 Lisp 并不是一门严格的函数语言(因为一些特性,它不符合最严格的术语定义 ),但 Lisp 的许多习语和特性有着很强的函数风格。从那以后,我学会了利用列表和函数式编程。 本期的跨越边界 将重拾这份遗失的财富。我会带您简单地领略一下 Lisp 的基本构造,然后快速 的扩展开来。您将学到 Lambda 表达式、递归和宏。这份简单的向导会让您对 Lisp 的高效性和灵活性有 所理解。 入门 本文使用 GNU 的 GCL,它针对许多操作系统都有免费下载。但稍作修改, 就能使用任何版本的 Common Lisp。请参见 参考资料 获取可用 Lisp 版本的详细说明。 和学习大多数其他语言一样,学习 Lisp 最好的方法就是实践。打开您的解释程序,和我一起编码。 Lisp 基本上是一门编译好的语言,通过直接键入命令,就可以轻松地用它进行编程。 列表语言 基本上,Lisp 是一门关于列表的语言。Lisp 中的一切内容(从数据到组成应用程序的代码)都是列 表。每个列表都由一些原子 和列表组成。数字就是原子。键入一个数字仅仅会返回该数字作为结果: 清单 1. 简单原子 如果键入一个字母,解释程序会报错,如清单 1 所示。字母是变量,所以使用之前必须先为其赋值。 如果想要引用一个字母或词语而不是变量,请使用引号将其括起来。在变量前加单引号告诉 Lisp 延迟对 后续列表或原子进行求值,如清单 2 所示: 清单 2. 延迟求值和引用 请注意 Lisp 把 a 大写为 A。lisp 假设您希望使用 A 作为符号,因为它没有加括号。后面会讨论赋 值,但先要让列表来完成这一任务。简单地讲,Lisp 列表是加了括号并使用空格隔开的原子序列。尝试 如清单 3 所示键入一个列表。这个列表是无效的,除非在列表前面加上 ''。 清单 3. 键入一个简单列表 除非在列表前加上 '',否则 Lisp 会像对函数求值那样对每个列表求值。第一个原子是运算符,列表 中其余的原子是参数。Lisp 有数目众多的原语函数,正如您预料的那样,其中包括许多数学函数,例如 ,+、* 和 sqrt。(+ 1 2 3) 返回 6,(* 1 2 3 4) 返回 12。 操纵列表的有两类函数:构造函数 和选择函数。构造函数构建列表,选择函数分解列表。first 和 rest 是核心选择函数。first 选择函数返回列表 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |