《SICP•2.1 数据抽象简介》看得不爽,吐槽一下。
The basic idea of data abstraction is to structure the programs that are to use compounddata objects so that they operate on ''abstract data.'' 接口操作于抽象数据。
At the same time, a ''concrete'' data representation is defined independentof the programs that use the data. The interface between these two parts of oursystem will be a set of procedures, calledselectors and constructors, that implement theabstract data in terms of the concrete representation.不太懂这个interface的意思。
数据的具体表示与使用它的程序无关。selectors and constructors是数据的具体表示的实现工具,为什么看成这两部分的接口?
以分数为例:
好吧,封装上面的粘接剂,假设现在有(make-rat <n> <d>)、 (numer <x>)、 (denom <x>)。我们既不考虑分数如何表示,也不管上面的函数如何实现,我们wishful thinking(这个wishful thinking、单凭愿望/一厢情愿应该是幽默,合理假定):在上面的make-rat等函数基础上,设计了add-rat等+-*/方法….
晕,selectorsand constructors指make-rat、numer、denom?!
我很不喜欢这样的讲述。
【《编程导论(Java)·4.1.3 String》,首先说明:通常认为字符串需要的最小接口集应该包含5个方法,程序员仅使用最小接口集的5个方法,判断字符串是否有指定的前缀(并说明:实际上String类提供了boolean startsWith(Stringprefix)。最小接口集外,String提供了前缀后缀判断、改变大小写,更换字符、去掉无用空白trim()等大量便宜方法。)。】
的确,(make-rat<n> <d>)、 (numer <x>)、 (denom <x>)可以构成分数的最小接口,但是我一直把pair相关的3个通用函数cons、car、cdr认为是selectorsand constructors。晕,不纠结了。
另外,(参考上一节笔记)如果以make-rat、numer、denom为最小接口,那么可以确定该数据类型是分数,直接使用cons、car、cdr,我们仅仅是粘接数据。
注:接口(interface)是使用该方法的用户所需要知道的所有信息,包括方法头(方法原型)、和非常重要的说明文档。不管有没有写出说明文档,函数的用途是接口的一部分,因而make-rat是接口。虽然,
(define make-rat cons)
make-rat 和cons,是不同层面的东西。
所谓不同层面,SICP将它叫Abstraction Barriers,其实如《4.1.3 String》,最小接口集和便宜方法没有必要分两层。如果要细分,不知道可以搞出多少barriers。而且,每一种数据类型的最小接口集,很难界定。除非像SICP,把selectorsand constructors称为所有数据类型的最小接口集而且不特指cons、car、cdr(再次吐槽一下)。
简单地说,只有一层皮——接口。用户程序使用接口;接口的实现在内部使用cons、car、cdr。
What Is Meant by Data?目前没有看懂,what is the point?
数据(类型)由其接口界定,它们必须满足的一组特定条件,即最小接口集。
序对——构成数据类型的方式,你用cons或过程都可以,然后呢?
Exercise 2.6 we can get by without numbers!
哇!!!人是什么?在某个角落说明:人是一堆原子!!!
抽象出各种数据类型,便于程序员编程。但是本质上,函数语言的所有元素,都是通过最底层的λ表达式定义的。某种程度上,我们可以不定义任何数据、操作符而全部使用λ表达式直接编程(就如同直接使用01机器语言编程一样)。但是,我们需要抽象,比较cons其过程实现….