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))执行时回显区将显示(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是不可见的。

检查list的长度:length

可以用函数length检查list中的元素数量:

(length '(buttercup))
=> 1(length '(daisy buttercup))
=> 2(length (cons 'violet '(daisy buttercup)))
=> 3

也可以将length应用于空list上:

(length ())
=> 0

当调用length函数而不传递参数给它时:

(length)

你将得到一个错误信息:

Wrong number of arguments: #<subr length="">, 0
</subr>

这表示函数接收到了错误的参数个数,0,函数需要一定数量的参数。在这里length需要一个参数,参数应该是一个list。(一个list也是一个参数而不管list中有多少元素)

错误信息中的#是函数的名称。#

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)
"Returns the Nth element of LIST.
N counts from zero. If LIST is not that long, nil is returned."
(car (nthcdr n list)))

(最初的nth在定义在Emacs Lisp文件subr.el中,但后来在1980年被重新用C实现。)

元素计数从0开始而不是1。这就是说list的第一个元素CAR是第零个元素。

(nth 0 '("one" "two" "three"))
=> "one"(nth 1 '("one" "two" "three"))
=> "two"

注意:nth与nthcdr和cdr一样,也不修改原来的list,也是一个无害函数。

setcar

从命名上就可以猜想到,setcdr和setcar函数用于设置list的CAR或CDR部分为一个新值。与car和cdr不同,它们将修改原始的list。

例:

(setq animals '(antelope giraffe lion tiger))animals
=> (antelope giraffe lion tiger)(setcar animals 'hippopotamus)animals
=> (hippopotamus giraffe lion tiger)

可以看到setcar函数并非像cons那样向list中添加元素;它将giraffe替换为hippopotamus;它修改了list。

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基础函数:car, cdr, cons...相关推荐

  1. 深度学习(三)theano学习笔记(2)基础函数-未完待续

    theano学习笔记(2)基础函数 1.随机函数库的调用 2.卷积神经网络 [python] view plaincopy #-*-coding:utf-8-*- import theano impo ...

  2. pytorch基础函数学习

    深度学习框架,似乎永远离不开哪个最热哪个最实用的话题,自己接触甚浅,尚不敢对齐进行大加评论,这里也只是初步接触.目前常见的有TensorFlow,pytorch,Keras等,至于目前哪个做好用,就像 ...

  3. ostream作为函数返回值_GO语言基础函数

    GO语言基础–函数 函数是组织好的.可重复使用的.用于执行指定任务的代码块.本文介绍了Go语言中函数的相关内容. 函数定义 Go语言中定义函数使用func关键字,具体格式如下: func 函数名(参数 ...

  4. c++将小写转换为大写函数_必须掌握的基础函数组合应用技巧,提高效率,准时下班...

    点击上方"Excel函数公式"免费订阅 货币,生活中必不可少的东西,是物品价值等的直接体现,在实际的工作中也经常遇到,如果给定的数据中,要对其进行格式的设置,你会怎么做? 一.Do ...

  5. python语言基础实验_实验二Python语言基础函数包练习.doc

    实验二Python语言基础函数包练习 实验 Python语言基础函数包练习:1208 学号: 实验目的 1.Python语言包,如math.NumPySciPy和Matplotlib等函数包的使用实验 ...

  6. 【数据库】第二章 基础函数、聚合函数、条件查询、子查询和多表查询

    [数据库]第二章 基础函数.条件查询.聚合函数.多表查询和子查询 文章目录 [数据库]第二章 基础函数.条件查询.聚合函数.多表查询和子查询 一.基础函数 二.聚合函数 1.COUNT 2.MAX/M ...

  7. tensorflow线性回归基础函数

    以下先使用tensorflow 的矩阵乘积,注意不是内积,然后使用基础函数求平方 .平方和.均值,这是使用tensorflow 使用线性回归分析的基础,基础好了,才能走出下一步,要不然怎么数据分析呢, ...

  8. Python学习---基础函数的学习

    1.1. 基础函数 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. 灌输一个概念:Python中函数就是对象,函数和我们之前的[1,2,3],'abc ...

  9. Python基础-函数,高阶函数

    Python基础-函数 1.函数的定义和函数的执行流程: """ 函数学习 """print('程序开始') a = 10 # 在内存中申请 ...

最新文章

  1. 软件性能测试vu脚本录制,利用LR插件完成性能测试脚本
  2. 使用Python,dlib中新型、更快、更小的5点面部标志检测器检测人脸、眼睛、鼻子
  3. abaqus二次开发python 建立集合,ABAQUS二次开发-Python脚本运行方式
  4. MYSQL.版本查看-LINUX
  5. eslint规范_规范统一前端代码风格
  6. cf1207解题报告
  7. 【操作系统复习】中断和异常
  8. 路由器 刷 linux系统版本,在Linux下用tftp刷写路由器固件
  9. vue-cli3.0(创建项目)如何引入element-ui(指令篇)
  10. 深入探索PowerPivot客户端和服务器端架构
  11. 【BIRT】在页面上展示xxxx年xx月xx日
  12. 在网页中使用超链接来打开本地应用(可传参数)
  13. 2.深入分布式缓存:从原理到实践 --- 分布式系统理论
  14. php中的图片变名为8位用什么,CSS_详解PNG图片,1、PNG图片类型 PNG格式有8位、 - phpStudy...
  15. win11家庭版,如何进入海康摄像头web后台
  16. iis aspnet_iisreg.exe 0x8007000B
  17. 计算机内存类型包括什么,计算机内存类型是什么
  18. 2022-2028全球与中国定时器市场现状及未来发展趋势
  19. CDH 配置CM Server的数据库时错误
  20. iOS中视频播放的学习

热门文章

  1. 第二十三章 Unity 材质
  2. 2022南阳理工计科ACM计科TC招新热身赛题解
  3. 爆笑:学生假条和老师批示
  4. DBA常用Sql语句--留着给自己看
  5. 磨金石教育摄影技能干货分享|王汉冰摄影作品欣赏—《沙狐之眼》
  6. 商品评论信息与评论信息分类
  7. 安装Phoenix时,执行./splline.py报错File “./sqlline.py“, line 25, in <module> import phoenix_utils File
  8. 天辰的救赎(JS)第四章(组合元素)
  9. 大学必须掌握的软件基础课程
  10. python 抠图源码_比PS还好用!Python 20行代码批量抠图