美文网首页
scheme 序对pair 和 表list

scheme 序对pair 和 表list

作者: 青枫 | 来源:发表于2017-03-25 23:14 被阅读0次

今天在看SICP 的时候发现一个问题,2.2.2层次性结构,构造一个 (cons (list 1 2) (list 3 4)) ,输出的结果 ((1 2) 3 4) ,想象中的结果应该是 ((1 2) (3 4)) 才对啊。

我们知道,构造一个表 (list 1 2 3 4) 等价于 (cons 1 (cons 2 (cons 3 (cons 4 nil)))) ,精简一下 (list 1) 等价于 (cons 1 nil) 。nil表示不包含任何元素的空表。也就是说 表 list 是一个以 nil 结尾的特殊的 序对 pair 。

回到刚开始的问题, (cons (list 1 2) (list 3 4)) 等价于 (cons (cons 1 (cons 2 nil)) (cons 3 (cons 4 nil))) ,因为以nil结尾,所以该表达式返回的是一个list,而 (cons 1 (cons 2 nil)) 也就是表 (1 2) , 是返回的表中的第一个元素,而3是第二个元素,4是第三个元素,返回表的长度是3。

对比看一下, (list (list 1 2) (list 3 4)) 等价于 (cons (list 1 2) (cons (list 1 2) nil)) 等价于
(cons (cons 1 (cons 2 nil)) (cons (cons 3 (cons 4 nil)) nil)) ,表示式返回值为 ((1 2) (3 4))
也就是说 返回的表是由表 (1 2) 和 表 (3 4)组成的,长度为2。

注意:在 chez scheme 的解释器中nil空表要用 '() 表示。

这里我突然想构造一个空表,于是在解释器里尝试了以下方法,

p1

这里你会发现直接用 '() 或者 (list) 都能构造一个空表,但是用 (cons '() '()) 却返回一个包含空表的空表(返回的表长度为1),我这又有疑问了,'()空表到底是怎么实现的?
google了一下 http://deathking.github.io/yast-cn/contents/chapter3.html ,发现Cons单元(Cons cells)外,还有一种更简单的数据类型叫原子Atom。不使用Cons单元的数据结构就叫原子,其中空表 '() 即是表,又是原子。(关键字 lisp的7个公理 https://zh.wikipedia.org/wiki/LISP

相关文章

  • scheme 序对pair 和 表list

    今天在看SICP 的时候发现一个问题,2.2.2层次性结构,构造一个 (cons (list 1 2) (list...

  • 力扣 632 最小区间

    题意:给定几个拍好序的list,找出一个最小的区间包含至少一个list中的元素 思路: 用一个pair记录list...

  • STL: list ,set ,pair.map的使用

    STL: list ,set ,pair.map的使用

  • Java字典序排序

    Java中对List进行字典序排序

  • diskutil

    MacOS下,查看磁盘分区: sudo diskutil list 挂载disk「0」序表「1」: sudo di...

  • 习惯用法

    函数的默认参数 过滤list 模板字符串 ,String内插 类型判断 遍历map/pair型list 只读lis...

  • Go map

    哈希表 map又称为哈希表,是一种无序的键值对(key-value pair)的集合。 map也是一种集合,因此可...

  • 集合

    1:collection 下面有list set 线性表包含两者 顺序表和链表 其中List属于线性表的一种。 ...

  • 线性表

    ——主要参考了中国大学MOOC数据结构课程的内容数据名称:线性表(List)数据对象集:线性表是个元素构成的有序序...

  • 数据结构_java标准库

    List list(表)继承Collection(集合)接口,主要有Arraylist,LinkedList和Ve...

网友评论

      本文标题:scheme 序对pair 和 表list

      本文链接:https://www.haomeiwen.com/subject/fdthottx.html