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

2.2.1 Representing Sequences

> '(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

可以向前面一样使用 carcdr


> (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 简述的更多相关文章

  1. Scheme中一些函数在C++里面的实现与吐槽

          最终我失败了,这是显而意见,我试图在一个很看重类型是什么的语言中实现无类型操作,事实上,哪怕我实现了基本的cons,car,cdr,list后面的代码也无法写下去.比如说list-n,根据 ...

  2. Eclipse中配置SVN(步骤简述)

    ————Eclipse中配置SVN(步骤简述)———— 1.有客户端(tortoiseSVN),服务器端(visualSVN) 两种,根据需要安装,安装后需重启电脑 2.服务器端配置:创建版本库(放工 ...

  3. Web 开发中 Blob 与 FileAPI 使用简述

    本文节选自 Awesome CheatSheet/DOM CheatSheet,主要是对 DOM 操作中常见的 Blob.File API 相关概念进行简要描述. Web 开发中 Blob 与 Fil ...

  4. C++中的pair,make_pair学习

    std::pair主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型.例如std::pair<int,float> 或者 std::pair<double,do ...

  5. spark中的pair rdd,看这一篇就够了

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是spark专题的第四篇文章,我们一起来看下Pair RDD. 定义 在之前的文章当中,我们已经熟悉了RDD的相关概念,也了解了RDD基 ...

  6. Python中的file和open简述

    help(file) help(open) 老规矩先看一下内置的帮助文档怎么描述file和open,毕竟官方文档是最直接最准确的描述. Help on class file in module __b ...

  7. scheme 中的宏使用

    #lang scheme ( define-syntax my-when     ( syntax-rules ()       [ ( _ pred body ... )         ( if ...

  8. MySQL中的SQL流程分析简述

    分析MySQL中这条语句的整个流程 update table_a set c1=xx where c2=xxx 朋友考我的一个问题在此处列出个人见解 1 客户端连接进来首先进行权限验证 2 验证通过后 ...

  9. vector中插入pair

    我们知道map和multimap的作用,这两种数据类型在存储数据时,会根据pair<>的first成员进行排序,不同的时前者将不会插入对first成员重复的结构,后者可以.那如果我们只想存 ...

随机推荐

  1. 类似智能购票的demo--进入页面后默认焦点在第一个输入框,输入内容、回车、right时焦点自动跳到下一个,当跳到select时,下拉选项自动弹出,并且可以按上下键选择,选择完成后再跳到下一个。

    要实现的效果:进入页面后默认焦点在第一个输入框,输入内容.回车.right时焦点自动跳到下一个,当跳到select时,下拉选项自动弹出,并且可以按上下键选择,选择完成后再跳到下一个. PS:自己模拟的 ...

  2. 概率检索模型及BM25

    概率排序原理 以往的向量空间模型是将query和文档使用向量表示然后计算其内容相似性来进行相关性估计的,而概率检索模型是一种直接对用户需求进行相关性的建模方法,一个query进来,将所有的文档分为两类 ...

  3. windows平台把UliPad添加到右键菜单

    对.py文件支持右键用UliPad打开方式支持: 1.打开注册表(win+R,运行框输入regedit) 2.先对*.py文件进行设置.找到注册表目录HKEY_CLASSES_ROOT\Python. ...

  4. C#网络程序设计(1)网络编程常识与C#常用特性

        网络程序设计能够帮我们了解联网应用的底层通信原理!     (1)网络编程常识: 1)什么是网络编程 只有主要实现进程(线程)相互通信和基本的网络应用原理性(协议)功能的程序,才能算是真正的网 ...

  5. stm32的定时器学习

    看了几篇博客之后,对这个定时器也有了一些认识,其实和51差不多,就是配置定时器的时候多了几个步骤而已. 其中很好的一片是:http://blog.sina.com.cn/s/blog_49cb4249 ...

  6. JS比较思维模型

    在这里,要分享的JS中两种思维方式: 1)面向对象风格示例: function Foo(who){ this.me = who; } Foo.prototype.identify = function ...

  7. Nodejs进阶:express+session实现简易身份认证

    本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. 文档概览 本文基于express.express-session ...

  8. PHP的虚拟域名的配置

    由于本人的自己搭建的php环境,Wamp环境.虚拟域名是写程序的一个最基本的配置,也对项目的调试有一定的真实感.我在学习虚拟域名的时候是受到了一些的问题,所以说写这个是为了帮助新人少走弯路, 也是为了 ...

  9. Docker - 终端交互

    进入容器交互终端 使用docker attach命令进入容器交互终端. 注意:如果多个窗口同时attach到同一个容器,那么所有窗口都会同步显示.如果某个窗口因命令阻塞时,那么其他窗口将无法执行操作. ...

  10. JS实现鼠标悬浮,显示内容

    其实就是增加title属性