找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5313|回复: 7

[他山之石] 理解lisp中的cons

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-5-8 17:32:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×


理解lisp中的cons  


       列表是Lisp的核心数据结构及语法。在Lisp里面,列表的存储方式比较特别,一个列表通常由1个或N个cons来组成的。那个list又与cons是什么关系呢?搞清楚之前,我混乱了许久,读过很多文档及实作才豁然开朗,概要记录一下,看似内容不多,但要理解的东西多了去,整理出来的文字比起之前做的笔记要少多了 :)

关于Cons

cons是一种简单的数据结构,一个cons是由头尾两个元素构成:如下创建一个cons对象:
> (setf x (cons 1 2) )
> x
(1 . 2 )

这创建了一个头是1,尾是2的cons对象。
对cons的操作有两个,car及cdr,分别是读取cons的头和尾元素:

> (car x)
1
> (cdr x)
2
cons的元素可以是任意类型的,当元素也是cons时:

> (setf y (cons 1 (cons 2 (cons 3 4))))
> y
(1 2 3 . 4)


y值可以这样理解:它由三个(点之前的元素个数)cons组成,最后一个元素是4

> (car y)
1
> (cdr y)
(2 3 . 4)


Cons与List

我们再来创建一个特别的cons:
> (setf z (cons 1 (cons 2 (cons 3 (cons 4 nil)))))
> z
(1 2 3 4)

z值可以这样理解:它由4个cons组成,最后一个元素是nil

z也等价于:
> (list 1 2 3 4)
1、像y这样的列表,我们称之为点列表,其特征是cons的最后元素是一个原子,非nil,非空列表。

2、而像z这样的列表,我们称之为真列表(list) ,其特重是cons的最后元素是nil,即空列表。真列表打印输出时,会隐藏掉最后的nil值及点。

3、所以,list是一种特殊的cons,即真列表是一种特殊的点列表。

4、真列表(list)是可以使用append函数的,而点列表不行:

> (append z 5)
(1 2 3 4 5)
> (append y 5)
*** Eval error ***  Wrong type argument: listp, 4
错误指出,4(y中的最后一个元素) 不是一个list,所以不能append。
真列表(list) 最后的元素是nil,即空列表,所以是可以加进新元素。
说起来简单,实际上要真理解的确是得费点工夫和心思。

Cons与其他数据结构

cons除了可以表示list,还可以表示其他复杂的数据结构,如树,栈等,这就留待后面再做功课了。

原文地址 http://www.jeffkit.info/2012/06/1028/

评分

参与人数 1D豆 +1 收起 理由
ScmTools + 1 好主题奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1632个

财富等级: 堆金积玉

发表于 2013-5-8 20:15:04 | 显示全部楼层
希望再接再励,贴子越来越来精彩
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6468个

财富等级: 富甲天下

发表于 2013-5-21 00:41:59 | 显示全部楼层
解释的比书中要祥细,也很好理解。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 449个

财富等级: 日进斗金

发表于 2013-5-21 10:53:21 | 显示全部楼层
支持。现在正在学习表函数!cons讲的很精彩!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-5-21 21:04:07 | 显示全部楼层
学习了,这句最精彩
(setf z (cons 1 (cons 2 (cons 3 (cons 4 nil)))))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 685个

财富等级: 财运亨通

发表于 2013-6-5 22:52:55 | 显示全部楼层
新手支持~~~~~~~学习了~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-6 16:53:01 | 显示全部楼层
多看看有好的处。理解学习下
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-24 23:24:09 来自手机 | 显示全部楼层
讲的很好,解决了我的困惑。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-19 02:03 , Processed in 0.463861 second(s), 50 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表