|
零基础SICP:第8课
|
|
数据抽象导引
|
Introduction to Data Abstraction |
实例:有理数的算术运算 |
Example: Arithmetic Operations for Rational Numbers |
抽象层级 |
Abstraction Barriers |
数据意味着什么 |
What Is Meant by Data? |
编程的基本原理是对数据和计算的组合和抽象
有理数与分式
|
|
预定义函数:分式、分式显、分子、分母
Scheme]
(define 二分之一 (分式 1 2))
Scheme]
(define 三分之一 (分式 1 3))
Scheme]
(分子 二分之一)
1
Scheme]
(分母 二分之一)
2
Scheme]
(分式显 三分之一)
1
3
Scheme]
(分式显 二分之一)
1
2
Scheme]
构造函数:分式
选择函数:分子、分母
显示函数:分式显 (和人类做交互)
有理数的算术运算
|
|
Scheme]
(分式显 (分式加 二分之一 三分之一))
5
6
Scheme]
(分式显 (分式减 二分之一 三分之一))
1
6
Scheme]
(分式显 (分式乘 二分之一 三分之一))
1
6
Scheme]
(分式显 (分式除 二分之一 三分之一))
3
2
Scheme]
算术运算函数:分式加,分式减,分式乘,分式除
分式加
|
|
Scheme] |
(define (分式加 x y) (let* ((n1 (分子 x)) (d1 (分母 x)) (n2 (分子 y)) (d2 (分母 y))) (分式 (+ (* n1 d2) (* n2 d1)) (* d1 d2)))) |
分式加
Scheme] |
(分式显 (分式加 (分式 1 2) (分式 1 4))) |
Scheme] |
抽象层级
|
|
将接口与实现的隔离
有理数的使用者
有理数的算术运算 (用户自定义的算术运算)
有理数的构造与选择 (用户自定义的数据结构)
有序对 pair (用户自定义的数据结构)
基础数据结构:链表(Scheme语言定义)
...
内存、寄存器、指令中的实现([Scheme解释器])
蛋挞(不用管现有鸡还是先有蛋)
鸡、蛋
有序对的抽象
|
|
构造器:提供两个参数,构造一个有序对
选择器:有序对中的第一个元素
选择器:有序对中的第二个元素
Scheme] |
(define (pair x1 x2) (cons x1 x2)) |
Scheme] |
(define (pair.x1 p) (car p)) |
Scheme] |
(define (pair.x2 p) (cdr p)) |
Scheme] |
(pair 1 2) |
Scheme] |
(pair.x1 (pair 3 4)) |
Scheme] |
(pair.x2 (pair "父亲" "母亲")) |
Scheme] |
基础数据结构:链表
|
|
构造器:表示空链表
构造器:提供一个元素和一个链表,将两者组合成链表。
选择器:取出链表头部的元素。
选择器:移除链表头部之后,剩下的元素按照原来的顺序组合成的链表。
构造器:提供一组元素,可以将这一组元素组合成链表。
Scheme] |
(list 1 2 3 4) # (cons 1 (cons 2 (cons 3 (cons 4 ())))) |
Scheme] |
(car (list 1 2 3 4)) |
Scheme] |
(cdr (list 1 2 3 4)) |
Scheme] |
(car (list )) |
Scheme] |
(eq? (list ) (list )) |
Scheme] |
定义数据
|
|
通过定义一组逻辑自洽的选择函数和构造函数,定义数据。
比如
定义自然数这种数据
|
|
Scheme] |
(define 零 (list )) |
()
Scheme] |
(define (后继 x) (cons (list ) x)) |
后继
Scheme] |
(后继 零) |
(())
Scheme] |
(后继 (后继 零)) |
(() ())
Scheme] |
(后继 (后继 (后继 零))) |
(() () ())
Scheme] |
cons/car/cdr的其中一种实现
|
|
Scheme] |
(define (cons2 x y) (define (dispatch m) (cond ((= m 0) x) ((= m 1) y) (else (error "Argument not 0 or 1 -- CONS" m)))) dispatch) |
Scheme] |
(define (car2 z) (z 0)) |
Scheme] |
(define (cdr2 z) (z 1)) |
Scheme] |
(car2 (cons2 1 2)) |
Scheme] |
(cdr2 (cons2 1 2)) |
Scheme] |
(car2 (cons2 1 (cons2 2 (cons2 3 ())))) |
Scheme] |
(car2 (cdr2 (cons2 1 (cons2 2 (cons2 3 ()))))) |
Scheme] |
总结
|
|
为什么需要抽象层级
如何定义数据
Schem原语 (R7RS small)
链表
有序对
分式
有理数