Lisp中基础函数的意思

来源:互联网 发布:汉王识别软件 编辑:程序博客网 时间:2024/05/22 02:28

笔者按:一直很好奇,Lisp的7个定理中,car cdr 与cons的意思到底是什么,搜了一下,发现几乎都不讲,找了一个,觉得挺好,转载如下:

声明:本转载如有侵犯原作者权益,请联系本人删除

http://www.iteye.com/topic/95409 

奇怪的命名   

    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))


执行时回显区将显示(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并且用空list和buttercup构造了一个list。可以看到空list并没有显示在被构造的list中。 只能看到(buttercup)。空list不会被当作一个list元素,因为空list中没有任何元素。空list是不可见的。

0 0