- 浏览: 233919 次
文章分类
最新评论
-
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 9782环境: windows xp emacs 23 自已编译的cv ... -
Emacs Lisp中的hash table
2008-03-10 16:30 2241(defun zj-hash-test () "h ... -
Emacs Lisp与Shell的交互
2008-03-10 16:27 4517一直以来对于w3m、tramp、dired等与shell关系 ... -
Programming in Emacs Lisp笔记(十八) 终结
2007-07-20 11:34 2683笔记连载完毕。感谢大家的支持! 离线版本可以从这里下载。 -
Programming in Emacs Lisp笔记(十七) 调试
2007-07-20 11:11 5415调试 GNU Emacs中有两个高度器,debug和edeb ... -
Programming in Emacs Lisp笔记(十六).emacs文件
2007-07-20 11:10 6492.emacs文件 Emacs的缺省 ... -
Programming in Emacs Lisp笔记(十五)准备图表
2007-07-19 16:36 2336准备图表 我们的目标 ... -
Programming in Emacs Lisp笔记(十四)统计defun中的单词数量
2007-07-19 16:36 2803统计defun中的单词数量 我们的下一个计划是统计函数定义中 ... -
Programming in Emacs Lisp笔记(十三)计数:重复和正则表达式
2007-07-19 16:28 2616计数:重复和正则表达 ... -
Programming in Emacs Lisp笔记(十二)正则表达式查询
2007-07-19 16:26 4505正则表达式查询 在Emacs中正则表达式查询使用得很广泛。在 ... -
Programming in Emacs Lisp笔记(十一)循环和递归
2007-07-04 18:18 3533循环和递归 Emacs Lisp有 ... -
Programming in Emacs Lisp笔记(十)Yanking Text Back
2007-07-04 17:59 2940Yanking Text Back 当使用'kill'命令剪 ... -
Programming in Emacs Lisp笔记的离线版本(2007年7月20日更新,完整版)
2007-07-03 15:45 5212使用muse生成了这个笔记的html版本。里面有带链接的索引, ... -
Programming in Emacs Lisp笔记(九)List的实现
2007-07-03 14:20 2120List的实现 Lisp中list使 ... -
Programming in Emacs Lisp笔记(八)剪切和存储文本
2007-07-02 12:04 2660剪切和存储文本 当使用'kill'命令剪切文本时,Emacs ... -
Programming in Emacs Lisp笔记(六) Narrowing and Widening
2007-06-28 10:41 2295Narrowing and Widening Narrowi ... -
Programming in Emacs Lisp笔记(五)一些更复杂的函数
2007-06-27 13:04 2626一些更复杂的函数 copy-to-buffer的函数定义 ... -
Programming in Emacs Lisp笔记(四)与缓冲区有关的函数
2007-06-26 13:38 3151部分与缓冲区有关的函数 查找更多信息 可以通过C-h f查看 ... -
Programming in Emacs Lisp笔记(三)编写函数
2007-06-25 15:01 4140编写函数 关于基本函数 ... -
Programming in Emacs Lisp笔记(二)实践
2007-06-25 15:01 2399实践 执行代码 通过C-x C-e执行代码 缓冲区名称 b ...
相关推荐
Programming in Emacs Lisp英文版
Robert Chassell:An Introduction to Programming in Emacs Lisp
An Introduction to Programming in Emacs Lisp Second Edition 经典中的经典!
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 著 毛文涛、吕芳 译 洪峰 审校 本书的作者罗伯特·卡塞尔是自由软件基金会的合创人之一,也是理查德·斯托曼博士青年时期结交的挚友,他...
emacs lisp 函数手册,emacs 24.3版本
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 编程指南, 很好的一本书
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