- 浏览: 234178 次
文章分类
最新评论
-
sunyukun8888:
多谢啦!
重新整理后的Oracle OAF学习笔记——离线版本 -
singlespider:
很不错啊,谢楼主
重新整理后的Oracle OAF学习笔记——离线版本 -
000fuli:
000fuli 写道请问各位学长:你们可以下载吗?能下载的烦请 ...
重新整理后的Oracle OAF学习笔记——离线版本 -
000fuli:
请问各位学长:你们可以下载吗?能下载的烦请发一份到fuli.w ...
重新整理后的Oracle OAF学习笔记——离线版本 -
goodscript:
确实是不错的好文章!
重新整理后的Oracle OAF学习笔记——离线版本
List的实现
Lisp中list使用了连续的指针对来保存数据,指针对的第一个指针指向一个原子或者另一个list,指针对的第二个指针指向另一个指针对,或者指向nil,以表明list的结束。
List图示
举例来说,list(rose violet buttercup)有3个元素,rose,violet和buttercup。在计算机中,rose的地址被保存在计算机内存中,通过这个地址可以知道 原子violet被分配在了哪个位置;通过这个地址又可以知道原子buttercup的地址。
听起来比较复杂,看图就简单多了:
___ ___ ___ ___ ___ ___这个图中,每个方框代表一个保存了Lisp对象的内存块,这通常是一个内存地址。在方框中的地址是成对的。每个箭头指向了这个地址的内容,它可能是一个原 子也可能是另一个地址对。第一个方框是rose的地址;第二个方框保存了下一个方框对的地址,这个地址的第一个部分指向violet第二个部分指向下一个 方框对。最后一个方框指向符号nil,标明list的结束。
|___|___|--> |___|___|--> |___|___|--> nil
| | |
| | |
--> rose --> violet --> buttercup
当执行一个设置函数时比如setq,它将第一个方框的地址保存到变量中。比如:
(setq bouquet '(rose violet buttercup))产生的情况如下:
bouquet在这个例子中符号bouquet保存了第一个方框对的地址。
|
| ___ ___ ___ ___ ___ ___
--> |___|___|--> |___|___|--> |___|___|--> nil
| | |
| | |
--> rose --> violet --> buttercup
同样,list也可以被成有序的方框:
bouquet(符号是由地址组成的。实际上bouquet包含了一组地址,一个地址指向可打印的单词bouquet,第二个是地址绑定到该符号上的函数定 义(如果存在),第三个地址是list(rose violet buttercup)的第一个地址对的地址,等等。这里只显示了第三个地址的情况。)
|
| -------------- --------------- ----------------
| | car | cdr | | car | cdr | | car | cdr |
-->| rose | o------->| violet | o------->| butter- | nil |
| | | | | | | cup | |
-------------- --------------- ----------------
如果符号指向list的CDR部分,这个list本身不会改变;符号将拥有从那个位置开始的list。(CAR和CDR是'non-destructive'的)因此执行下面的语句:
(setq flowers (cdr bouquet))将产生下面的结果:
bouquet flowers
| |
| ___ ___ | ___ ___ ___ ___
--> | | | --> | | | | | |
|___|___|----> |___|___|--> |___|___|--> nil
| | |
| | |
--> rose --> violet --> buttercup
flowers的值是(violet buttercup),这就是说符号flowers拥有了一个地址对的地址。
这种地址对被称为cons cell或者dotted pair。
函数cons添加一个新的地址对到一连串地址对的前面。例如,执行下面的语句:
(setq bouquet (cons 'lily bouquet))产生的效果如下:
bouquet flowers而这并不会改变flowers的值,你可以看到:
| |
| ___ ___ ___ ___ | ___ ___ ___ ___
--> | | | | | | --> | | | | | |
|___|___|----> |___|___|----> |___|___|---->|___|___|--> nil
| | | |
| | | |
--> lily --> rose --> violet --> buttercup
(eq (cdr (cdr bouquet)) flowers)将返回t。
到现在为止,flowers的值仍是(violet buttercup);它拥有violet的cons cell地址。这也不会改变任何之前的cons cells;他们仍然在那里。
就这样,在Lisp里获取list的CDR,将获取到连续的cons cell串中的第二个;获取list的CAR,将得到第一个。将cons将一个新元素连接到list上,你将会把新元素的cons cell添加到list的前面。
cons cell串的最后一个指向什么?它指向空list,nil。
把符号看作抽屉柜
前面章节曾提示过把符号(symbol)想像成抽屉柜。函数定义放到一个抽屉里,变量放到了另一个,等等。
实际上放在各个抽屉里的是值或函数定义的地址。
(另外,符号有一个抽屉存放属性列表(property list),它用于记录其它信息。)
Chest of Drawers Contents of Drawers
__ o0O0o __
/ \
---------------------
| directions to | [map to]
| symbol name | bouquet
| |
+---------------------+
| directions to |
| symbol definition | [none]
| |
+---------------------+
| directions to | [map to]
| variable value | (rose violet buttercup)
| |
+---------------------+
| directions to |
| property list | [not described here]
| |
+---------------------+
|/ \|
发表评论
-
emacs中使用semantic实现c代码自动完成功能
2008-11-25 16:29 9785环境: windows xp emacs 23 自已编译的cv ... -
Emacs Lisp中的hash table
2008-03-10 16:30 2243(defun zj-hash-test () "h ... -
Emacs Lisp与Shell的交互
2008-03-10 16:27 4524一直以来对于w3m、tramp、dired等与shell关系 ... -
Programming in Emacs Lisp笔记(十八) 终结
2007-07-20 11:34 2690笔记连载完毕。感谢大家的支持! 离线版本可以从这里下载。 -
Programming in Emacs Lisp笔记(十七) 调试
2007-07-20 11:11 5419调试 GNU Emacs中有两个高度器,debug和edeb ... -
Programming in Emacs Lisp笔记(十六).emacs文件
2007-07-20 11:10 6504.emacs文件 Emacs的缺省 ... -
Programming in Emacs Lisp笔记(十五)准备图表
2007-07-19 16:36 2347准备图表 我们的目标 ... -
Programming in Emacs Lisp笔记(十四)统计defun中的单词数量
2007-07-19 16:36 2815统计defun中的单词数量 我们的下一个计划是统计函数定义中 ... -
Programming in Emacs Lisp笔记(十三)计数:重复和正则表达式
2007-07-19 16:28 2618计数:重复和正则表达 ... -
Programming in Emacs Lisp笔记(十二)正则表达式查询
2007-07-19 16:26 4514正则表达式查询 在Emacs中正则表达式查询使用得很广泛。在 ... -
Programming in Emacs Lisp笔记(十一)循环和递归
2007-07-04 18:18 3547循环和递归 Emacs Lisp有 ... -
Programming in Emacs Lisp笔记(十)Yanking Text Back
2007-07-04 17:59 2944Yanking Text Back 当使用'kill'命令剪 ... -
Programming in Emacs Lisp笔记的离线版本(2007年7月20日更新,完整版)
2007-07-03 15:45 5213使用muse生成了这个笔记的html版本。里面有带链接的索引, ... -
Programming in Emacs Lisp笔记(八)剪切和存储文本
2007-07-02 12:04 2663剪切和存储文本 当使用'kill'命令剪切文本时,Emacs ... -
Programming in Emacs Lisp笔记(七)基础函数:car, cdr, cons
2007-06-29 10:09 3771基础函数:car, cdr, cons Lisp中car,c ... -
Programming in Emacs Lisp笔记(六) Narrowing and Widening
2007-06-28 10:41 2297Narrowing and Widening Narrowi ... -
Programming in Emacs Lisp笔记(五)一些更复杂的函数
2007-06-27 13:04 2638一些更复杂的函数 copy-to-buffer的函数定义 ... -
Programming in Emacs Lisp笔记(四)与缓冲区有关的函数
2007-06-26 13:38 3152部分与缓冲区有关的函数 查找更多信息 可以通过C-h f查看 ... -
Programming in Emacs Lisp笔记(三)编写函数
2007-06-25 15:01 4140编写函数 关于基本函数 ... -
Programming in Emacs Lisp笔记(二)实践
2007-06-25 15:01 2400实践 执行代码 通过C-x C-e执行代码 缓冲区名称 b ...
相关推荐
Programming in Emacs Lisp英文版
An Introduction to Programming in Emacs Lisp Second Edition 经典中的经典!
Robert Chassell:An Introduction to Programming in Emacs Lisp
emacs官网上的那个字体太不好了,这是用源文件重编的,看起来不错
An Introduction to Programming in Emacs Lisp, 3rd Edition
An Introduction to Programming in Emacs Lisp [3.10].chm
Programming in Emacs Lisp: An Introduction (美)Robert J.Chassell 著 毛文涛、吕芳 译 洪峰 审校 本书的作者罗伯特·卡塞尔是自由软件基金会的合创人之一,也是理查德·斯托曼博士青年时期结交的挚友,他...
GNU Emacs Lisp编程入门(清晰版) 英文名:An Introduction to Programming in Emacs Lisp
GNU emacs Lisp manual This is a very interesting text, useful to write and program in several languages. Emacs is a editor made in Lisp, a artificial intelligence language.
GNU EMACS lisp编程入门.djvuGNU EMACS lisp编程入门.djvuGNU EMACS lisp编程入门.djvuGNU EMACS lisp编程入门.djvuGNU EMACS lisp编程入门.djvuGNU EMACS lisp编程入门.djvuGNU EMACS lisp编程入门.djvu
Atom-language-emacs-lisp.zip,emacs lisp和yasnippet支持atom和github。Emacs Lisp支持,atom是一个用web技术构建的开源文本编辑器。
gnu emacs lisp 编程指南, 很好的一本书
emacs lisp 函数手册,emacs 24.3版本
GNU Emacs Lisp Reference Manual For Emacs Version 22.1 Revision 2.9, April 2007
GNU Emacs Lisp Reference Manual 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开
学习 EMACS 和 LISP 极好的入门教材,这可是好东西
强大的emacs lisp编程 不仅仅适用于初学者
emacs-lisp-intro emacs-lisp-intro