- 浏览: 237584 次
文章分类
最新评论
-
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 9859环境: windows xp emacs 23 自已编译的cv ... -
Emacs Lisp中的hash table
2008-03-10 16:30 2323(defun zj-hash-test () "h ... -
Emacs Lisp与Shell的交互
2008-03-10 16:27 4595一直以来对于w3m、tramp、dired等与shell关系 ... -
Programming in Emacs Lisp笔记(十八) 终结
2007-07-20 11:34 2726笔记连载完毕。感谢大家的支持! 离线版本可以从这里下载。 -
Programming in Emacs Lisp笔记(十七) 调试
2007-07-20 11:11 5479调试 GNU Emacs中有两个高度器,debug和edeb ... -
Programming in Emacs Lisp笔记(十六).emacs文件
2007-07-20 11:10 6541.emacs文件 Emacs的缺省 ... -
Programming in Emacs Lisp笔记(十五)准备图表
2007-07-19 16:36 2446准备图表 我们的目标 ... -
Programming in Emacs Lisp笔记(十四)统计defun中的单词数量
2007-07-19 16:36 2907统计defun中的单词数量 我们的下一个计划是统计函数定义中 ... -
Programming in Emacs Lisp笔记(十三)计数:重复和正则表达式
2007-07-19 16:28 2675计数:重复和正则表达 ... -
Programming in Emacs Lisp笔记(十二)正则表达式查询
2007-07-19 16:26 4590正则表达式查询 在Emacs中正则表达式查询使用得很广泛。在 ... -
Programming in Emacs Lisp笔记(十一)循环和递归
2007-07-04 18:18 3601循环和递归 Emacs Lisp有 ... -
Programming in Emacs Lisp笔记(十)Yanking Text Back
2007-07-04 17:59 2982Yanking Text Back 当使用'kill'命令剪 ... -
Programming in Emacs Lisp笔记的离线版本(2007年7月20日更新,完整版)
2007-07-03 15:45 5249使用muse生成了这个笔记的html版本。里面有带链接的索引, ... -
Programming in Emacs Lisp笔记(八)剪切和存储文本
2007-07-02 12:04 2747剪切和存储文本 当使用'kill'命令剪切文本时,Emacs ... -
Programming in Emacs Lisp笔记(七)基础函数:car, cdr, cons
2007-06-29 10:09 3837基础函数:car, cdr, cons Lisp中car,c ... -
Programming in Emacs Lisp笔记(六) Narrowing and Widening
2007-06-28 10:41 2346Narrowing and Widening Narrowi ... -
Programming in Emacs Lisp笔记(五)一些更复杂的函数
2007-06-27 13:04 2743一些更复杂的函数 copy-to-buffer的函数定义 ... -
Programming in Emacs Lisp笔记(四)与缓冲区有关的函数
2007-06-26 13:38 3221部分与缓冲区有关的函数 查找更多信息 可以通过C-h f查看 ... -
Programming in Emacs Lisp笔记(三)编写函数
2007-06-25 15:01 4196编写函数 关于基本函数 ... -
Programming in Emacs Lisp笔记(二)实践
2007-06-25 15:01 2440实践 执行代码 通过C-x C-e执行代码 缓冲区名称 b ...
相关推荐
Programming in Emacs Lisp英文版
- **标题**:“An Introduction to Programming in Emacs Lisp”(Emacs Lisp编程入门) - **描述**:该资源是基于Emacs官方文档的重编版本,旨在提供更易阅读的字体样式。 #### 知识点详解 ##### 1. Emacs Lisp...
- **标题**:“An Introduction to Programming in Emacs Lisp Second Edition” - **描述**:本书是关于Emacs Lisp编程的入门教程,被誉为“经典中的经典”。 该书由Robert J. Chassell撰写,由自由软件基金会出版...
### Robert Chassell:An Introduction to Programming in Emacs Lisp #### 知识点概览 - **Lisp Lists**: 介绍Lisp列表的概念及其在Emacs Lisp中的应用。 - **Lisp Atoms**: 解释Lisp原子的基本概念以及它们在...
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
本书不仅详细介绍了Emacs Lisp编程的基础知识,如变量的定义、函数的创建、数据类型的处理等,还深入讲解了如何通过Emacs Lisp来扩展和定制Emacs编辑器的功能,实现个性化的编辑体验。此外,书中还包含了大量实用的...
在“Atom-language-emacs-lisp.zip”这个压缩包中,主要关注的是对Emacs Lisp的支持。Emacs Lisp是一种用于扩展和定制GNU Emacs编辑器的Lisp方言。它提供了丰富的API和交互式编程环境,使得开发者可以编写自定义的...
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
本书的英文版原名是《Programming in Emacs Lisp: An Introduction》,由自由软件基金会出版,享有复制与分发的权限。机械工业出版社在2001年5月出版了中文版,ISBN为7-111-08862-6。书籍的定价为38.00元,并承诺如...
函数是Emacs Lisp中实现复杂数字逻辑的关键工具。这部分内容不仅介绍了如何定义和调用函数,还包括了如何使用参数、返回值以及异常处理等内容。 #### 13. 宏 宏是Emacs Lisp中的一个重要特性,可以用来创建自定义的...
通过深入学习Emacs Lisp,你可以充分利用Emacs的强大功能,从简单的快捷键绑定到复杂的编辑器扩展,都可以通过编写Elisp代码来实现。"GNU Emacs Lisp编程入门.pdf"这本书将是一个很好的起点,带领你探索这个充满可能...