/images/avatar.png

[读书笔记] sicp 第二章 符号数据

1
2
(list 'a 'b)
(eq? a b)

符号求导

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

;e是变量吗
(define (variable? x)
  (symbol? x));symbol?判断变量是不是符号

;v1和v2是同一个变量吗
(define (same-variable? v1 v2)
  (and (variable? v1) (variable? v2) (eq? v1 v2)))

;e是和式吗
(define (sum? x)
  (and (pair? x) (eq? (car x) '+)))

;e的被加数
(define (addend s) (cadr s))

;e的加数
(define (augend s) (caddr s))

;构造起a1和a2的和式
(define (make-sum a1 a2) (list '+ a1 a2))

;e是乘式吗
(define (product? x)
  (and (pair? x) (eq? (car x) '*)))

;e的被乘数
(define (multiplier p) (cadr p))

;e的乘数
(define (multiplicand p) (caddr p))

;构造起来m1与m2的乘式
(define (make-product m1 m2)
       (list '* m1 m2))

;求导
(define (deriv exp var)
  (cond ((number? exp) 0)
        ((variable? exp)
         (if (same-variable? exp var) 1 0))
        ((sum? exp)
         (make-sum (deriv (addend exp) var)
                   (deriv (augend exp) var)))
        ((product? exp)
         (make-sum
          (make-product (multiplier exp)
                        (deriv (multiplicand exp) var))
          (make-product (deriv (multiplier exp) var)
                        (multiplicand exp))))
        (else
         (error "unknown expression type -- DERIV" exp))))

(deriv '(+ x 3) 'x)
(deriv '(* x y) 'x)
(deriv '(* (* x y) (+ x 3)) 'x)

'(+ 1 0)
'(+ (* x 0) (* 1 y))
'(+ (* (* x y) (+ 1 0)) (* (+ (* x 0) (* 1 y)) (+ x 3)))

[读书笔记] sicp 第二章 构造数据抽象

第一章关注的是计算过程,以及过程在程序中所扮演的角色。 本章,讲将数据对象组合起来,形成复合数据的方式。 复合数据:能够提升我们在设计程序时所位于的概念层次,提高设计的模块性,增强语言的表达能力。 将程序中处理数据对象的表示的部分与处理数据对象的使用部分相互 隔离的技术,称为数据抽象。 复合数据中的一个关键性思想是闭包的概念,也就是说,用于组合数据对象的粘合剂不但能用于组合基本的数据对象,也能组合复合数据对象。 复合数据对象能够称为以混合与匹配的方式组合程序模块的方便接口。

数据抽象引导

数据抽象的基本思想,就是设法构造出一些使用复合数据对象的程序,使它们就像是在抽象数据上操作一样。

有理数的算数运算

假定存在构造函数与选择函数

1
2
3
(make-rat n d);返回一个有理数,分子是整数n,分母是整数d
(numer x);返回有理数x的分子
(denom x));返回有理数x的分母

那么可以定义以下的规则

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
;加法
(define (add-rat x y)
  (make-rat (+ (* (numer x) (denom y))
               (* (numer y) (denom x)))
            (* (denom x) (denom y))))
;减法
(define (sub-rat x y)
  (make-rat (- (* (numer x) (denom y))
               (* (numer y) (denom x)))
            (* (denom x) (denom y))))
;乘法
(define (mul-rat x y)
  (make-rat (* (numer x) (numer y))
            (* (denom x) (denom y))))
;除法
(define (div-rat x y)
  (make-rat (* (numer x) (denom y))
            (* (denom x) (numer y))))
;等于?
(define (equal-rat? x y)
  (= (* (numer x) (denom y))
     (* (numer y) (denom x))))

[读书笔记] sicp 第一章 构造过程抽象

关于读书的目的

很多时候对于一本比较复杂的书,你在到达一定阶段的时候是难以读进去的。Sicp我曾经在几个月前尝试的去读了第一章。很快就读完的,但是对于其的理解实在浅薄。 我希望在这一次的阅读的过程中能够顺利的过一次不本书有所收获。 在接下来的日子里,我会记录下读书笔记以及习题的解答。 这是一个开始。

构造过程抽象

每一种强有力的语言为此提供了三种机制

  • 基本的表达形式, 用于表示语言所关心的最简单的个体。
  • 组合的方法,通过它们可以从简单的东西出发构建出复合的元素。
  • 抽象的方法,通过它们可以为 复合对象命名,并将它们作为单元去操作。

在程序设计中,我们需要处理两类元素:过程和数据。非形式的说,数据是一种我们希望去操作的”东西“,而过程是有关操作这些数据的规则的描述。

1
2
3
4
5
6
7
8
(* ( + 2 ( * 5 6 ))
	( + 3 5 7))

(define (square x) (* x x))

(square 21)
441

[读书摘录] 黑客与画家

2016-08-31 08:09:42

为什么小孩子会这样做呢?

  一部分原因是,青少年在心理上还没有摆脱儿童状态,许多人都会残忍地对待他人。他们折磨书呆子的原因就像拔掉一条蜘蛛腿一样,觉得很好玩。在一个人产生良知之前,折磨就是一种娱乐。

  孩子们欺负书呆子的另一个原因是为了让自己感到好受一些。当你踩水的时候,你把水踩下去,你的身体就会被托起来。同样,在任何社会等级制度中,那些对自己没自信的人就会通过虐待他们眼中的下等人来突显自己的身份。我已经意识到,正是因为这个原因,在美国社会中底层白人是对待黑人最残酷的群体。

2016-08-31 08:12:26

我认为,真实世界的关键并非在于它是由成年人组成的,而在于它的庞大规模使得你做的每件事都能产生真正意义上的效果。学校、监狱、上流社会的女士午餐会,都做不到这一点。这些场合的成员都好像关在封闭的泡沫之中,所作所为只对泡沫内部有影响,对外部没有影响。那么很自然地,这些场合就会产生野蛮的做法。因为它们不具备实际功能,所以也就无所谓采用的形式^。

2016-08-31 08:13:16

真实世界的特点是,它极其庞大。如果总体足够大,即使是人数最少的少数派,只要聚集在一起,也能产生可观的力量。在真实世界中,书呆子在某些地方聚集起来,形成自己的社区,智力因素成为那里最被看重的东西。有时,这种因素甚至会以相反的形式表现出来,特别是在大学的数理学系,书呆子甚至会夸大笨拙,以显示自己的聪明。约翰·纳什^非常钦佩诺伯特·维纳^^就学维纳的样子,经过走廊的时候都用手扶着墙走路。

[读书笔记] 深入探索C++对象模型 第六章 执行期语意学

执行期语意学

以下一个简单的式子

1
if (yy == xx.getValue)

xx yy定义如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
X xx;
Y yy;
class Y
{
public:
  Y();
 ~Y();
  bool operator==(const& Y) const;
};
class X
{
public:
  X();
  ~X();
  operator Y() const;
  X getValue();
};

那么编译器在我们之后做了什么呢

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
if(yy == xx.getValue())

//转换为
if(yy.operator==(xx.getValue())

//接着转换
if(yy.operator==(xx.getValue().operator Y()))

//接着转换
X temp1 = xx.getValue();
Y temp2 = temp1.operator Y();
int temp3 = (yy.operator==(temp2));
if(temp3)

temp2.y::~Y();
temp1.x::~X();

[读书笔记]深入探索C++对象模型 第五章 构造 解构 拷贝语意学

构造、解构、拷贝语意学

纯虚函数的存在

纯虚函数能够被静态的调用,不能经过虚拟机制调用。 虚析构函数不能定义为纯虚的,一定要有定义,否则即使可以编译,但是链接的时候会有错误。因为其子类会静态调用上一层的析构函数。如果说上一层的析构函数是一个纯虚函数的话,那么链接的时候会失败。

虚拟规格的存在

不应该把所有的函数都声明为虚函数,然后靠编译器去优化操作吧virtual invocation去除。

虚拟规格中的const的存在

实际上你很难知道一个类的子类对于这个函数是不是应该定义为const,因为即使现在你不需要修改类的内容,但子类可能需要修改,你没法预料到。那么最好不要定义一个有const函数的基类了。

“无继承”情况下的对象构造

1
2
3
4
typedef struct
{
    float x,y,z;
} Point;

编译器会分析声明,贴上Plaint OI' Data的卷标,被贴上该卷标的类,不会有构造函数或者析构函数的调用了。直接使用C的方式。