博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Scheme 中的 pair 和 list 简述
阅读量:6436 次
发布时间:2019-06-23

本文共 2082 字,大约阅读时间需要 6 分钟。

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

1157210-20170502214005023-1937677278.png

连续的点对且以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)

转载于:https://www.cnblogs.com/ftae/p/6798649.html

你可能感兴趣的文章
[译] 原生 JavaScript 值得学习吗?答案是肯定的
查看>>
29岁了还一事无成是人生的常态?
查看>>
gRPC-rs:从 C 到 Rust
查看>>
Mysql-高性能索引
查看>>
chrome浏览器最小字号解决方案
查看>>
富文本编译器UEditor+SSM的使用
查看>>
Java EE之旅02 CSS基础
查看>>
kubernetes学习笔记 (二):k8s初体验
查看>>
swift3 0 流控制
查看>>
Data-Mediator专题之属性回调
查看>>
每天一个Linux命令之ps-查看系统进程信息
查看>>
图解JavaScript原型链继承
查看>>
用VIPER构建iOS应用
查看>>
Java开源诊断工具 Arthas 发布v3.1.0
查看>>
什么是以太坊
查看>>
高效开发者是如何个性化VS Code插件与配置的?
查看>>
Java日志那些事
查看>>
117. Populating Next Right Pointers in Each Node II
查看>>
【笔记】重学前端-winter
查看>>
大数据构建模块:选择体系结构和开源框架
查看>>