- 浏览: 236986 次
文章分类
最新评论
-
sunyukun8888:
多谢啦!
重新整理后的Oracle OAF学习笔记——离线版本 -
singlespider:
很不错啊,谢楼主
重新整理后的Oracle OAF学习笔记——离线版本 -
000fuli:
000fuli 写道请问各位学长:你们可以下载吗?能下载的烦请 ...
重新整理后的Oracle OAF学习笔记——离线版本 -
000fuli:
请问各位学长:你们可以下载吗?能下载的烦请发一份到fuli.w ...
重新整理后的Oracle OAF学习笔记——离线版本 -
goodscript:
确实是不错的好文章!
重新整理后的Oracle OAF学习笔记——离线版本
基础函数:car, cdr, cons
Lisp中car,cdr和cons都是基础函数。cons用于构造lists,car和cdr用于分割lisp。
奇怪的命名
cons函数的名称并非没有含意:它是单词'construct'的缩写。car是短语'Contents of the Address part of the Register';cdr('could-er')是短语'Contents of the Decrement part of the Register'。这些短语说明了Lisp是在多么原始的机器上被开发的。
car和cdr
一个list的CAR是list中的第一个元素。(rose violet daisy buttercup)的CAR就是rose。
执行下面的代码:
(car '(rose violet daisy buttercup))执行这个语句后,回显区将显示rose。
有一个更合理的car函数:first。
car并不从list移除第一个元素;它只返回第一个元素。car执行完后list并没有发生改变。car是一个无害的函数('non-destructive')。
CDR是list中的其余部分,cdr函数返回list中首元素后面的其它元素。因此'(rose violet daisy buttercup)的CDR部分是(violet daisy buttercup)。
对:
(cdr '(rose violet daisy buttercup))求值将在回显区显示(violet daisy butercup)
cdr也不从列表中移除元素。
附带说明一下:在这个例子中list前面加了单引号。如果不加,Lisp解释器把rose当作函数执行。在这个例子中我们并不需要那样。
cdr的一个更合理的名称是:rest。
当car和cdr应用于符号组成的列表时,比如(pine fir oak maple),函数car将返回列表中的pine元素,并且pine不会被括号包含。这个list的CDR也是一个list,(fir oak maple)。
如果car和cdr应用于包含list的list,第一个元素也是list。car将返回list中的第一个list元素。
car和cdr是无害的,它们不修改list中的数据。这是非常重要的一点。
在第一章中曾说过:“在Lisp中某些原子类型,比如数组,可以被分隔成更小的部分;但这种机制与分割list的机制是不同的。这与Lisp的早期 概念有关,list中的原子是不可分隔的。”(car和cdr也并不修改list。)car和cdr是用于分割list的基础函数。但它们不能用于分割数 组或者访问数组中的一部分。数组被看作原子类型。另一个基础函数cons可以用于构造列表,但也不能用于数组。
cons
cons函数是构造list的函数。例:
(cons 'pine '(fir oak maple))在第一个例子中,()是一个空的list并且用空list和buttercup构造了一个list。可以看到空list并没有显示在被构造的list中。 只能看到(buttercup)。空list不会被当作一个list元素,因为空list中没有任何元素。空list是不可见的。
执行时回显区将显示(pine fir oak maple)。cons将新的元素放到列表的开头,它将新元素推入list中。
*** 构造一个list
cons函数必须要有一个可以被插入的list参数。构造一个list时,至少要提供一个空的list。下面是一些构造list的语句:
<src lang="lisp">
(cons 'buttercup ())
=> (buttercup)
(cons 'daisy '(buttercup))
=> (daisy buttercup)
(cons 'violet '(daisy buttercup))
=> (violet daisy buttercup)
(cons 'rose '(violet daisy buttercup))
=> (rose violet daisy buttercup)
</src>
检查list的长度:length
可以用函数length检查list中的元素数量:
(length '(buttercup))也可以将length应用于空list上:
=> 1
(length '(daisy buttercup))
=> 2
(length (cons 'violet '(daisy buttercup)))
=> 3
(length ())
=> 0
当调用length函数而不传递参数给它时:
(length)你将得到一个错误信息:
Wrong number of arguments: #<subr length="">, 0这表示函数接收到了错误的参数个数,0,函数需要一定数量的参数。在这里length需要一个参数,参数应该是一个list。(一个list也是一个参数而不管list中有多少元素)
</subr>
错误信息中的#是函数的名称。#
nthcdr
nthcdr是一个与cdr相关的函数。它用于多次获取list的CDR部分。
如果获取(pine fir oak maple)的CDR部分,将得到(fir oak maple)。如果在这个结果上再重复操作将得到(oak maple)。(如果你在原来的list上取CDR,将一直得到同样的结果,因为原来的list并没有被修改)如果继续下去,将得到一个空的list,这 时将不会显示为(),而是显示为nil。 例:
(cdr '(pine fir oak maple))或者用下面的方式:
=>(fir oak maple)
(cdr '(fir oak maple))
=> (oak maple)
(cdr '(oak maple))
=>(maple)
(cdr '(maple))
=> nil
(cdr 'nil)
=> nil
(cdr ())
=> nil
(cdr (cdr '(pine fir oak maple)))
=> (oak maple)
nthcdr函数与多次调用cdr类似。下面的例子中,参数2和一个list被传递给nthcdr,返回的值与原list相比,不含前面两个元素,相当于在list上执行了两次cdr。
(nthcdr 2 '(pine fir oak maple))
=> (oak maple)
;; Leave the list as it was.
(nthcdr 0 '(pine fir oak maple))
=> (pine fir oak maple)
;; Return a copy without the first element.
(nthcdr 1 '(pine fir oak maple))
=> (fir oak maple)
;; Return a copy of the list without three elements.
(nthcdr 3 '(pine fir oak maple))
=> (maple)
;; Return a copy lacking all four elements.
(nthcdr 4 '(pine fir oak maple))
=> nil
;; Return a copy lacking all elements.
(nthcdr 5 '(pine fir oak maple))
=> nil
nth
nthcdr重复取list的CDR部分。nth函数取nthcdr返回值的CAR部分。它返回list中的Nth元素。
如果nth没有被因为效率原因而用C定义,那么nth的定义将会是下面的样子:
(defun nth (n list)(最初的nth在定义在Emacs Lisp文件subr.el中,但后来在1980年被重新用C实现。)
"Returns the Nth element of LIST.
N counts from zero. If LIST is not that long, nil is returned."
(car (nthcdr n list)))
元素计数从0开始而不是1。这就是说list的第一个元素CAR是第零个元素。
(nth 0 '("one" "two" "three"))注意:nth与nthcdr和cdr一样,也不修改原来的list,也是一个无害函数。
=> "one"
(nth 1 '("one" "two" "three"))
=> "two"
setcar
从命名上就可以猜想到,setcdr和setcar函数用于设置list的CAR或CDR部分为一个新值。与car和cdr不同,它们将修改原始的list。
例:
(setq animals '(antelope giraffe lion tiger))可以看到setcar函数并非像cons那样向list中添加元素;它将giraffe替换为hippopotamus;它修改了list。
animals
=> (antelope giraffe lion tiger)
(setcar animals 'hippopotamus)
animals
=> (hippopotamus giraffe lion tiger)
setcdr
setcdr与setcar函数类似,它用于替换list中除首元素外的其它元素。
例:
(setq domesticated-animals '(horse cow sheep goat))
domesticated-animals
=> (horse cow sheep goat)
(setcdr domesticated-animals '(cat dog))
domesticated-animals
=> (horse cat dog)
评论
不知道现在lisp还有什么发展和应用
发表评论
-
emacs中使用semantic实现c代码自动完成功能
2008-11-25 16:29 9852环境: windows xp emacs 23 自已编译的cv ... -
Emacs Lisp中的hash table
2008-03-10 16:30 2307(defun zj-hash-test () "h ... -
Emacs Lisp与Shell的交互
2008-03-10 16:27 4569一直以来对于w3m、tramp、dired等与shell关系 ... -
Programming in Emacs Lisp笔记(十八) 终结
2007-07-20 11:34 2723笔记连载完毕。感谢大家的支持! 离线版本可以从这里下载。 -
Programming in Emacs Lisp笔记(十七) 调试
2007-07-20 11:11 5459调试 GNU Emacs中有两个高度器,debug和edeb ... -
Programming in Emacs Lisp笔记(十六).emacs文件
2007-07-20 11:10 6539.emacs文件 Emacs的缺省 ... -
Programming in Emacs Lisp笔记(十五)准备图表
2007-07-19 16:36 2420准备图表 我们的目标 ... -
Programming in Emacs Lisp笔记(十四)统计defun中的单词数量
2007-07-19 16:36 2882统计defun中的单词数量 我们的下一个计划是统计函数定义中 ... -
Programming in Emacs Lisp笔记(十三)计数:重复和正则表达式
2007-07-19 16:28 2668计数:重复和正则表达 ... -
Programming in Emacs Lisp笔记(十二)正则表达式查询
2007-07-19 16:26 4572正则表达式查询 在Emacs中正则表达式查询使用得很广泛。在 ... -
Programming in Emacs Lisp笔记(十一)循环和递归
2007-07-04 18:18 3596循环和递归 Emacs Lisp有 ... -
Programming in Emacs Lisp笔记(十)Yanking Text Back
2007-07-04 17:59 2980Yanking Text Back 当使用'kill'命令剪 ... -
Programming in Emacs Lisp笔记的离线版本(2007年7月20日更新,完整版)
2007-07-03 15:45 5247使用muse生成了这个笔记的html版本。里面有带链接的索引, ... -
Programming in Emacs Lisp笔记(九)List的实现
2007-07-03 14:20 2219List的实现 Lisp中list使 ... -
Programming in Emacs Lisp笔记(八)剪切和存储文本
2007-07-02 12:04 2725剪切和存储文本 当使用'kill'命令剪切文本时,Emacs ... -
Programming in Emacs Lisp笔记(六) Narrowing and Widening
2007-06-28 10:41 2336Narrowing and Widening Narrowi ... -
Programming in Emacs Lisp笔记(五)一些更复杂的函数
2007-06-27 13:04 2726一些更复杂的函数 copy-to-buffer的函数定义 ... -
Programming in Emacs Lisp笔记(四)与缓冲区有关的函数
2007-06-26 13:38 3194部分与缓冲区有关的函数 查找更多信息 可以通过C-h f查看 ... -
Programming in Emacs Lisp笔记(三)编写函数
2007-06-25 15:01 4172编写函数 关于基本函数 ... -
Programming in Emacs Lisp笔记(二)实践
2007-06-25 15:01 2435实践 执行代码 通过C-x C-e执行代码 缓冲区名称 b ...
相关推荐
Programming in Emacs Lisp英文版
- **car, cdr, cons: Fundamental Functions**:这三种函数是Emacs Lisp中最基础的操作列表的函数,分别用于获取列表的第一个元素、去除第一个元素后的剩余列表以及创建新列表。 ##### 10. 剪切和存储文本(Cutting ...
7. **car、cdr、cons:基本函数(car, cdr, cons: Fundamental Functions)**:解释了这些函数的用途,它们是操作列表的基本工具。 8. **剪切和存储文本(Cutting and Storing Text)**:讲解了如何在Emacs中剪切和...
综上所述,《An Introduction to Programming in Emacs Lisp》一书全面介绍了Emacs Lisp的基础知识和核心概念,适合初学者学习和掌握Emacs Lisp编程技巧。通过深入理解上述知识点,读者能够更好地利用Emacs Lisp进行...
An Introduction to Programming in Emacs Lisp [3.10].chm
Programming in Emacs Lisp: An Introduction (美)Robert J.Chassell 著 毛文涛、吕芳 译 洪峰 审校 本书的作者罗伯特·卡塞尔是自由软件基金会的合创人之一,也是理查德·斯托曼博士青年时期结交的挚友,他...
### Emacs Lisp 函数手册知识点概览 #### 一、引言 Emacs Lisp(简称Elisp)是Emacs文本编辑器内置的一种高级编程语言。它不仅支持编辑文档时的脚本化操作,还具备完整的编程功能,使得用户可以扩展Emacs的功能。本...
GNU Emacs Lisp编程入门(清晰版) 英文名:An Introduction to Programming in Emacs Lisp
本书不仅详细介绍了Emacs Lisp编程的基础知识,如变量的定义、函数的创建、数据类型的处理等,还深入讲解了如何通过Emacs Lisp来扩展和定制Emacs编辑器的功能,实现个性化的编辑体验。此外,书中还包含了大量实用的...
Atom是一款由GitHub开发的开源文本编辑器,它利用了现代Web技术,如HTML、CSS和JavaScript,为开发者提供了一个强大...通过安装和使用这个插件,开发者能够在享受Atom现代特性的基础上,充分利用Emacs Lisp的强大功能。
同时,还介绍了特殊形式如`cons`、`car`和`cdr`等,并讨论了它们在实际编程中的应用。 #### 6. 序列、数组和向量 这一章节重点讲解了序列、数组和向量的概念及用法。序列是一个更广泛的概念,包括了列表和向量;而...
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.
本文将深入探讨Emacs Lisp编程的基础知识,帮助你开启Emacs的无限可能。 一、Emacs Lisp简介 Emacs Lisp是由Richard Stallman和Guy Steele于1984年设计的一种Lisp方言,它是GNU Emacs的内核,也是其可扩展性的基础...
本书的英文版原名是《Programming in Emacs Lisp: An Introduction》,由自由软件基金会出版,享有复制与分发的权限。机械工业出版社在2001年5月出版了中文版,ISBN为7-111-08862-6。书籍的定价为38.00元,并承诺如...