文档详情

lisp入门答案.doc

发布:2017-03-22约9.87千字共10页下载文档
文本预览下载声明
lisp入门(一) lisp是一门历史悠久的语言,全名叫list processor,也就是“表处理语言”,它是由john mccarthy于1958年就开始设计的一门语言。和lisp同时期甚至更晚出现的许多语言如algo等如今大多已经消亡,又或者仅仅在一些特定的场合有一些微不足道的用途,到现在还广为人知的恐怕只剩下了fortran和cobol。但唯独lisp,不但没有随着时间而衰退,反倒是一次又一次的焕发出了青春,从lisp分支出来的scheme、ml等语言在很多场合的火爆程度甚至超过了许多老牌明星。那么这颗常青树永葆青春的奥秘究竟在哪里呢? 如果你只接触过c/c++、pascal这些“过程式语言”的话,lisp可能会让你觉得十分不同寻常,首先吸引你眼球(或者说让你觉得混乱的)一定是lisp程序中异常多的括号,当然从现在的角度来讲,这种设计的确对程序员不大友好,不过考虑到五六十年代的计算机处理能力,简化语言本身的设计在那时算得上是当务之急了。 lisp的基本语法很简单,它甚至没有保留字(有些语言学家可能对这一点有异议,别怕,我听你们的),它只有两种基本的数据,仅有一种基本的语法结构就是表达式,而这些表达式同时也就是程序结构,但是正如规则最简单的围棋却有着最为复杂的变化一样,lisp使用最基本的语言结构定义却可以完成其它语言难于实现的、最复杂的功能。 废话少说,现在我们就来看看lisp语言中的基本元素。 lisp的表达式是一个原子(atom)或表(list),原子(atom)是一个字母序列,如abc;表是由零个或多个表达式组成的序列,表达式之间用空格分隔开,放入一对括号中,如: abc () (abc xyz) (a b (c) d) 最后一个表是由四个元素构成的,其中第三个元素本身也是一个表。 正如算数表达式1+1有值2一样,lisp中的表达式也有值,如果表达式e得出值v,我们说e返回v。如果一个表达式是一个表,那么我们把表中的第一个元素叫做操作符,其余的元素叫做自变量。 正如欧几里德的几何世界中有五个公理一样,我们在这里给出lisp世界中的7个公理(基本操作符): (quote x)返回x,我们简记为x (atom x)当x是一个原子或者空表时返回原子t,否则返回空表()。在lisp中我们习惯用原子t表示真,而用空表()表示假。 (atom a) t (atom (a b c)) () (atom ()) t 现在我们有了第一个需要求出自变量值的操作符,让我们来看看quote操作符的作用——通过引用(quote)一个表,我们避免它被求值。一个未被引用的表达式作为自变量,atom将其 视为代码,例如: (atom (atom a)) t 反之一个被引用的表仅仅被视为表 (atom (atom a)) () 引用看上去有些奇怪,因为你很难在其它语言中找到类似的概念,但正是这一特征构成了lisp最为与众不同的特点——代码和数据使用相同的结构来表示,而我们用quote来区分它们。 (eq x y)当x和y的值相同或者同为空表时返回t,否则返回空表() (eq a a) t (eq a b) () (eq () ()) tlisp入门(二) 上一集我们讲了lisp世界七个公理的前三个,这一集我们接着讲剩下的四个。 首先是三个表操作 (car x)要求x是一个表,它返回x中的第一个元素,例如: (car (a b)) a (cdr x)同样要求x是一个表,它返回x中除第一个元素之外的所有元素组成的表,例如: (cdr (a b c)) (b c) (cons x y)要求y是一个表,它返回一个表,这个表的第一个元素是x,其后是y中的所有元素,例如: (cons a (b c)) (a b c) (cons a (cons b (cons c ()))) (a b c) 看到这里大家可能会问,为什么没有取表中除开头外其它某个位置上的元素的操作符,别急,等我们讲到地球人都知道的函数和递归你就知道该怎么办了,也许你现在已经想得差不多了? 接下来要介绍给大家的是构成程序逻辑的一个基本功能……条件分支,在lisp中,它是由cond操作符完成的,cond是七个公理中最后一个也是形式最复杂的一个(欧几里德的最后一个公理也如是): (cond (p1 e1) (p2 e2)...(pn en)) p1到pn为条件,e1到en为结果,cond操作符依次对p1到pn求值,直到找到第一个值为原子t(还记得吗?)的p,此时把对应的e作为整个表达式的值返回,例如: (cond ((eq a b) first) ((atom a) second)) second 好了,至此我们已经有了lisp
显示全部
相似文档