Scheme 中的 pair 和 list 简述
pair
(cons 1 2)
> (1 . 2)
系统返回(1 . 2)。cons 操作给两个地址分配了内存空间,并把存放指向 1 的地址放在一个空间,把存放指向2的地址放在另一个空间。存放指向1的地址的内存空间被称作 car 部分,对应的,存放指向2的地址的内存空间被称作 cdr 部分。
car 和 cdr 分别是寄存器地址部分(Contents of the Address part of the Register)和寄存器减量部分(Contents of the Decrement part of the Register)的简称。这些名字最初来源于 Lisp 首次被实现所使用的硬件环境中内存空间的名字。这些名字同时也表明 Cons 单元的本质就是一个内存空间。
cons 这个名字是术语构造(construction)的简称。
(cons 1 (cons 2 (cons 3 (cons 4 5))))
=> (1 2 3 4 . 5)
(1 2 3 4 . 5) 是对 (1 . (2 . (3 . (4 . 5)))) 的一种简化。
> (cadr f)
2
> (car (cdr f)) ;等价
2
> (define f (cons 1 (cons 2 (cons 3 (cons 4 5)))))
> f
(1 2 3 4 . 5)
> (car f)
1
> (cdr f)
(2 3 4 . 5)
> (cadr f)
2
> (define f (cons 1 (cons 2 (cons 3 (cons 4 (cons 5 6))))))
> f
(1 2 3 4 5 . 6)
> (cddddr f)
(5 . 6)
> (cdddddr f)
. . cdddddr: undefined;
cannot reference undefined identifier
最多支持四级操作。c...r
> (define f (cons 1 2))
> f
(1 . 2)
> (set-car! f 10)
> f
(10 . 2)
> (set-cdr! f 20)
> f
(10 . 20)
> (define f (cons 1 (cons 2 3)))
> f
(1 2 . 3)
> (set-cdr! f 4)
> f
(1 . 4)
使用 set-car! 或 set-cdr! 修改 .
list
> '(1 2 3)
(1 2 3)
> (list 1 2 3)
(1 2 3)
> (define f (list 1 2 3))
> f
(1 2 3)
> (list-ref f 0) ;通过索引取值
1
> (list-ref f 2)
3
> (list-tail f 2) ;返回给定索引及以后的所有值
(3)
> (list-tail f 0)
(1 2 3)
pair?, list? 和 null? 判断过程可以分别用来检查它们的参数是不是一个序对,列表或空列表。
Scheme 中的 booleans 类型用 #t、#f 来分别表示 true 和 false 。
> (pair? '(1 . 2))
#t
> (pair? '(1 2))
#t
> (pair? '())
#f
> (pair? '(1 . 2))
#t
> (pair? '(cons 1 2))
#t
> (pair? '(1 2 3))
#t
> (pair? (list 1 2 3))
#t
> (list? '(1 2 3))
#t
> (list? (cons 1 2))
#f
> (list? (cons 1 (cons 2 3)))
#f
> (list? (cons 1 (cons 2 '())))
#t
> (list? (cons 1 '()))
#t
> (null? '())
#t
> (list 1 2 3 4)
(1 2 3 4)
> (define f (cons 1 (cons 2 (cons 3 (cons 4 '())))))
> f
(1 2 3 4)
> (list? f)
#t

连续的点对且以nil('())结尾,形似 C语言 的链表,而用list?判断得到的结果也为真。
在 SICP 一书中 nil 用于表示序对 ( pair ) 的链结束,也可以当作一个不包含任何元素的序列,空表。
不过作者推荐直接使用 '() 表示空表,而舍弃变量 nil 。
> (define f (list 1 2 3 4))
> f
(1 2 3 4)
> (car f)
1
> (cdr f)
(2 3 4)
> (cddr f)
(3 4)
> (caddr f)
3
可以向前面一样使用 car 和 cdr 。
> (define x '(1 2 3))
> (define y '(4 5 6))
> (define z (append x y)) ;合并两个 list
> z
(1 2 3 4 5 6)
> x
(1 2 3)
> y
(4 5 6)
Scheme 中的 pair 和 list 简述的更多相关文章
- Scheme中一些函数在C++里面的实现与吐槽
最终我失败了,这是显而意见,我试图在一个很看重类型是什么的语言中实现无类型操作,事实上,哪怕我实现了基本的cons,car,cdr,list后面的代码也无法写下去.比如说list-n,根据 ...
- Eclipse中配置SVN(步骤简述)
————Eclipse中配置SVN(步骤简述)———— 1.有客户端(tortoiseSVN),服务器端(visualSVN) 两种,根据需要安装,安装后需重启电脑 2.服务器端配置:创建版本库(放工 ...
- Web 开发中 Blob 与 FileAPI 使用简述
本文节选自 Awesome CheatSheet/DOM CheatSheet,主要是对 DOM 操作中常见的 Blob.File API 相关概念进行简要描述. Web 开发中 Blob 与 Fil ...
- C++中的pair,make_pair学习
std::pair主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型.例如std::pair<int,float> 或者 std::pair<double,do ...
- spark中的pair rdd,看这一篇就够了
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是spark专题的第四篇文章,我们一起来看下Pair RDD. 定义 在之前的文章当中,我们已经熟悉了RDD的相关概念,也了解了RDD基 ...
- Python中的file和open简述
help(file) help(open) 老规矩先看一下内置的帮助文档怎么描述file和open,毕竟官方文档是最直接最准确的描述. Help on class file in module __b ...
- scheme 中的宏使用
#lang scheme ( define-syntax my-when ( syntax-rules () [ ( _ pred body ... ) ( if ...
- MySQL中的SQL流程分析简述
分析MySQL中这条语句的整个流程 update table_a set c1=xx where c2=xxx 朋友考我的一个问题在此处列出个人见解 1 客户端连接进来首先进行权限验证 2 验证通过后 ...
- vector中插入pair
我们知道map和multimap的作用,这两种数据类型在存储数据时,会根据pair<>的first成员进行排序,不同的时前者将不会插入对first成员重复的结构,后者可以.那如果我们只想存 ...
随机推荐
- 为部署ASP.NET Core准备:使用Hyper-V安装Ubuntu Server 16.10
概述 Hyper-V是微软的一款虚拟化产品,和VMWare一样采用的hypervisor技术.它已经被内嵌到Win10系统内,我们只需要进行简单的安装即可.但是前提是要确保你的机器已经启用虚拟化,可以 ...
- Weex的环境搭建以及集成到Android项目
最近由于公司的需要,初步研究了Weex,Weex是阿里开发的一个web的框架,官方的介绍如下: Weex 是一套简单易用的跨平台开发方案,能以 web 的开发体验构建高性能.可扩展的 native 应 ...
- 讨论LSTM和RNN梯度消失问题
1RNN为什么会有梯度消失问题 (1)沿时间反向方向:t-n时刻梯度=t时刻梯度* π(W*激活函数的导数)
- Elasticsearch搜索之explain评分分析
Lucene的IndexSearcher提供一个explain方法,能够解释Document的Score是怎么得来的,具体每一部分的得分都可以详细地打印出来.这里用一个中文实例来纯手工验算一遍Luce ...
- C#事物
执行ADO.NET事务包含四个步骤,分别为: ①调用SqlConnection对象的BeginTransaction()方法,(只调用这个方法前,要打开数据库连接,否则将会出现异常) 创建一个SqlT ...
- Linux 系统管理06--磁盘管理
Linux系统管理06——磁盘管理 一.磁盘结构 1.硬盘的物理结构 盘片:硬盘有多个盘片,每个盘片2面 磁头:每面一个磁头 2.硬盘的数据结构 扇区:盘片被分为多个扇形区域,每个扇形区存放512字节 ...
- [Oracle]LogMiner工具小结
(一)LogMiner工具的作用Logminer工具主要用来分析redo log和archive log文件.通过该工具,可以轻松获得Oracle redo log和archive log文件的具体内 ...
- (原)HashMap之java8新特性
首先说一下HashMap存储结构,数组.链表.树这三种数据结构形成了hashMap.存储结构下图所示,根据key的hash与table长度确定table位置,同一个位置的key以链表形式存储,超过一定 ...
- 【代码学习】GD库中图片缩印
bool imagecopyresampled ( resource $dst_image, resource $src_image, int $dst_x, int $dst_y, int $src ...
- java-cef嵌入基于Chrome内核浏览器,做页面爬虫(可以尽在ajax异步请求数据)
1 CentOS 7.0 上安装和配置 VNC 服务器 2.1 2.1.1 首先,我们需要一个可用的桌面环境(X-Window),如果没有的话要先安装一个. 注意:以下命令必须以 root 权限运行. ...