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。
执行下面的代码:
执行这个语句后,回显区将显示rose。
有一个更合理的car函数:first。
car并不从list移除第一个元素;它只返回第一个元素。car执行完后list并没有发生改变。car是一个无害的函数('non-destructive')。
CDR是list中的其余部分,cdr函数返回list中首元素后面的其它元素。因此'(rose violet daisy buttercup)的CDR部分是(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是不可见的。
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
- Lisp中基础函数的意思
- Lisp 匿名递归函数 v2:在 Common Lisp 中实现 Clojure 的 fn
- main函数中参数的意思
- python中函数的定义意思
- Lisp中car,cdr和cons都是基础函数。cons用于构造lists,car和cdr用于分割lisp。
- LISP 6.1 变量的基础
- Lisp基础函数:car, cdr, cons...
- 自定义Lisp的list函数
- Lisp.作为属性的函数
- Common Lisp函数的基础知识
- ntohs函数的意思
- LISP基础
- Lisp.函数
- Lisp.函数
- Lisp 函数
- fastreport中几个函数意思
- Macro in LISP (LISP中宏的要义)
- unix/LINUX 命令/函数 后面括号中数字的意思
- 标准io流
- Android activity 在AndroidMainActivity.xml 中的配置
- 数据库设计
- Please ensure that adb is correctly located at 'D:\Android\android-sdk\platf
- submit提交按钮的三种常用写法
- Lisp中基础函数的意思
- Session。
- 使用采用 Android* OS 的英特尔® 集成性能基元
- IOS 入门开发之使用XCODE4制作静态库详解
- Julia语言:让高性能科学计算人人可用
- dojo shrinksafe 使用方法-new
- 跨线程使用CSocket
- linux查看当前路径
- flex-php--des加密解密通用代码