分享
 
 
 

Lisp入门(四)

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

地方数千里,兵精足用,英雄乐业,当横行天下

——《资治通鉴》

Lisp的语法元素在前几集中已经基本讨论完毕,相比C#或Java数百页的Specification,它可能简单的让你有些惊讶,不过,伟大的东西总是简单的,不是吗?现在让我们来回顾一下上一集中提到的内容,首先提几个问题:

既然cond在概念上相当于过程式语言中的if语句,那么与if相对的else分支在cond表达式中应该如何描述? 在(我们已经学过的)Lisp中如何表达“重复”这个语义?或者你能写一个foreach循环函数? (注:不要问输入输出函数或算术逻辑运算在哪儿之类的问题,它们都是微不足道的事……)

这一集中,我们将描述几个常用的函数,并给出它们的简单实现

首先解答在第一集中提出的问题:如何取一个表中的第二个、第三个或第n个元素?

可能有些读者已经想到了,取第二个元素可以采用如下形式:

(car (cdr x))

同理,取第三个元素是这样的:

(car (cdr (cdr x)))

事实上,这种组合在Lisp中经常要用到,为了方便,Lisp提供了一个通用模式——cxr,其中x为a或d的序列,来简记car和cdr的组合,例如:

> (cadr '((a b) (c d) e))

(c d)

> (caddr '((a b) (c d) e))

e

> (cdar '((a b) (c d) e))

(b)

另外,使用(list e1 e2 ... en)来表示

(cons e1 (cons e2 (... (cons en '())...)))

> (cons 'a (cons 'b (cons 'c '())))

(a b c)

> (list 'a 'b 'c)

(a b c)

现在我们定义一些新的常用函数,我建议你先自己想一想,不要急着看我给出的实现。

(注:某些函数在Common Lisp中已经存在,所以如果你想试验一下,给它们换个名字)

(null x),测试x是否为空表。例如:

> (null 'a)

()

> (null '())

t (and x y),逻辑与,当且仅当x和y都不是空表时返回't,否则返回空表。

> (and 'a 'b)

t

> (and (atom 'a) (eq 'b 'c))

() (not x),逻辑非,当x是空表时返回't,否则返回空表。(有人问我or在哪儿?)例如:

> (not 'a)

()

> (not (eq 'a 'b))

t (append x y),连接两个表x和y,注意它与cons和list之间的不同之处。例如:

> (append '(a b) '(c d))

(a b c d)

> (append? '() '(x y))

(x y) (pair x y),这里x和y是两个长度相同的表,pair生成一个表,其中每个元素是x和y中相应位置上的元素组成的一个元素对,这个函数的返回值类似于其它语言中的map或dictionary的概念。例如:

> (pair '(a b c) '(x y z))

((a x) (b y) (c z)) (assoc x y),其中x是一个原子,y是一个形如pair所返回的表,assoc在y中查找第一个左元素为x的元素对并返回。例如:

> (assoc 'a '((a x) (b y)))

x

> (assoc 'a '((a (foo bar)) (b y) (c z)))

(foo bar) (subst x y z),在表z中将任意层次上出现的原子y都替换为表达式x。例如:

> (subst '(x y) 'b '(a b (a b c) d))

(a (x y) (a (x y) c) d) 下面我们给出这些常用函数的简单实现:

(defun null (x)

(eq x '())) (defun and (x y)

(cond (x (cond (y 't) ('t '())))

('t '()))) (defun not (x)

(cond (x '())

('t 't))) (defun append (x y)

(cond ((null x) y)

('t (cons (car x) (append (cdr x) y))))) (defun pair (x y)

(cond ((and (null x) (null y)) '())

((and (not (atom x)) (not (atom y)))

(cons (list (car x) (car y))

(pair (cdr) (cdr y)))))) (defun assoc (x y)

(cond ((eq (caar y) x) (cadar y))

('t (assoc x (cdr y))))) (defun subst (x y z)

(cond ((atom z)

(cond ((eq z y) x)

('t z)))

('t (cons (subst x y (car z))

(subst x y (cdr z)))))) 如果看到这里你还没有晕菜,说明你的神经的确很坚强。注意在这些例子中是如何表达“重复”这个概念的,在Lisp中,最常用的重复其实并不是真正意义上的重复,而是递归,这也是绝大多数函数式语言的一个共同特征——函数的嵌套和递归,构成了整个程序逻辑。

这一部分内容可以让你真正感受到Lisp的特色,与编写过程式语言的程序相比,编写Lisp程序需要一种完全不同的思维方式,也许这正是Lisp语言几十年来长盛不衰的真正原因吧。

理解了这一部分,下一集中我们将领教一下Lisp的威力,我们将用Lisp编写一个Lisp解释器。如果你以前没有见过这个程序,我保证它一定会让你吃惊。

Lisp入门(一)

Lisp入门(二)

Lisp入门(三)

广告之后我们再回来…………

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有