SICP笔记(四)

sicp的第二章讨论构造数据抽象。构造数据抽象是一个非常有用的工具,构造数据之后,便可以将构造的复合数据视为一个单元体,在构建程序让我们在更高的层次上思考问题,并可以增加程序的模块性,便于修改维护。

数据抽象

数据抽象将复合数据的使用与如何通过更基本的数据对象构造分离开来。复合数据和使用其的程序由选择函数(selector)和构造函数(constructor)联系起来。
在构造有理数数据结构时,使用到愿望思维(wishful thinking)。先假设已经实现对应数据结构的构造,考虑之后我们想要实现的功能,定义好合适的接口。
从序对构造起来的数据对象称为表结构数据。
抽象屏障,使复合数据的结构清晰,从基本的数据对象构造,层层封装,显示很强的条理性。

Church numerals

课后练习一道练习关于Church numerals的练习,感觉智商不够用。

1
2
3
4
(define zero (lambda (f) (lambda (x) x)))

(define (add-1 n)
(lambda (f) (lambda (x) (f ((n f) x)))))

通过代换模型,可以得到

1
2
3
(define one (lambda (f) (lambda (x) (f x))))

(define two (lambda (f) (lambda (x) (f (f x)))))

one中f作用了一次,two中f作用了两次,而zero中f并没有产生作用,得出规律,这是指的0和1的实现是指f的作用次数。f是一个函数,接受一个参数xf就像一个生成器,实现生成的功能,而x就是一个基线条件,给定这两个具体的参数,便可生成一系列对应元素。题中所指“1”非平常的1,和普通的自然数1相比,其具有更高的抽象层次,自然数只是这个系统中的一个实例。毫无疑问,可以对fx实例化,推演出所有的自然数。
定义(inc x),将f实例为inc,给定基线条件x为0,就可以推演所有的自然数了。

1
(define (inc x) (+ x 1))

试试,顺利产生了想要的结果~

1
2
3
4
5
6
> ((one inc) 0)
1
> ((two inc) 0)
2
> (((add one two) inc) 0)
3

基于一个自增的操作和一个基线条件0,我们就可以通过Church numerals生成所有的自然数了,Unbelievable!

设置Racket环境变量

未添加环境变量之前,任意目录下命令行无法直接使用racket命令,添加Racket的安装路径至PATH中,便解决了这个问题。

有话说

道生一,一生二,二生三,三生万物


习题解答:传送门