精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-06-29
基础函数:car, cdr, consLisp中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可以用于构造列表,但也不能用于数组。 conscons函数是构造list的函数。例: (cons 'pine '(fir oak maple))在第一个例子中,()是一个空的list并且用空list和buttercup构造了一个list。可以看到空list并没有显示在被构造的list中。 只能看到(buttercup)。空list不会被当作一个list元素,因为空list中没有任何元素。空list是不可见的。 检查list的长度:length可以用函数length检查list中的元素数量: (length '(buttercup))也可以将length应用于空list上: (length ()) 当调用length函数而不传递参数给它时: (length)你将得到一个错误信息: Wrong number of arguments: #<subr length="">, 0这表示函数接收到了错误的参数个数,0,函数需要一定数量的参数。在这里length需要一个参数,参数应该是一个list。(一个list也是一个参数而不管list中有多少元素) 错误信息中的#是函数的名称。# nthcdrnthcdr是一个与cdr相关的函数。它用于多次获取list的CDR部分。 如果获取(pine fir oak maple)的CDR部分,将得到(fir oak maple)。如果在这个结果上再重复操作将得到(oak maple)。(如果你在原来的list上取CDR,将一直得到同样的结果,因为原来的list并没有被修改)如果继续下去,将得到一个空的list,这 时将不会显示为(),而是显示为nil。 例: (cdr '(pine fir oak maple))或者用下面的方式: (cdr (cdr '(pine fir oak maple))) nthcdr函数与多次调用cdr类似。下面的例子中,参数2和一个list被传递给nthcdr,返回的值与原list相比,不含前面两个元素,相当于在list上执行了两次cdr。 (nthcdr 2 '(pine fir oak maple)) ;; Leave the list as it was. nthnthcdr重复取list的CDR部分。nth函数取nthcdr返回值的CAR部分。它返回list中的Nth元素。 如果nth没有被因为效率原因而用C定义,那么nth的定义将会是下面的样子: (defun nth (n list)(最初的nth在定义在Emacs Lisp文件subr.el中,但后来在1980年被重新用C实现。) 元素计数从0开始而不是1。这就是说list的第一个元素CAR是第零个元素。 (nth 0 '("one" "two" "three"))注意:nth与nthcdr和cdr一样,也不修改原来的list,也是一个无害函数。 setcar从命名上就可以猜想到,setcdr和setcar函数用于设置list的CAR或CDR部分为一个新值。与car和cdr不同,它们将修改原始的list。 例: (setq animals '(antelope giraffe lion tiger))可以看到setcar函数并非像cons那样向list中添加元素;它将giraffe替换为hippopotamus;它修改了list。 setcdrsetcdr与setcar函数类似,它用于替换list中除首元素外的其它元素。 例: (setq domesticated-animals '(horse cow sheep goat)) 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-06-30
我用autolisp写过一个mini版的cad 现在lisp语法全部忘了
不知道现在lisp还有什么发展和应用 |
|
返回顶楼 | |
发表时间:2007-07-02
我也只是出于对Emacs的兴趣,想尽量看懂别人写的.emacs文件
|
|
返回顶楼 | |
浏览 7491 次