-
Notifications
You must be signed in to change notification settings - Fork 0
/
SICP.txt
219 lines (58 loc) · 2.62 KB
/
SICP.txt
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
SICP
[(书评)Its the Best! Its the Worst! Why the split?](https://www.amazon.com/review/R403HR4VL71K8/ref=cm_cr_srp_d_rdp_perm?ie=UTF8)、
[原版书](https://web.mit.edu/6.001/6.037/sicp.pdf)、
[习题答案](http://community.schemewiki.org/)、
[公开课](https://www.bilibili.com/video/BV1Xx41117tr)
数据的使用和表示分离开的意图是什么?
TODO 视频P12中的第二节课中的20分~35分??的stream需要再看看
TODO 视频P13中的1:12~X的"矛盾y组合子"
TODO 能不能自己写一套解释器来解释自己造的单元测试模板???
### 关于最后一节课的最后一部分证明不存在一个能检测任意函数是否有死循环的算法解释:
> 这个问题等价图灵停机问题可以简单的证明如下: 假设存在一个函数bool check(code c,data d),可以对输入的code c在data d上进行判断,如果死循环则返回true,反之返回false,那么我们可以构造一个新函数
```
bool new_check(code c)
{
if(check(c,c))
return true;
while(1);
return false;
}
```
那么对于new_check(new_check)就会造成矛盾:如果new_check会死循环,则说明check(new_check)返回了false,说明new_check不会死循环如果new_check不会死循环,则说明check(new_check)返回了true,说明new_check会死循环
[参考链接](https://www.zhihu.com/question/33617297/answer/176820992)
Lisp特征: 计算过程的Lisp描述本身又可以作为Lisp的数据来表示和操作
一门强力的语言的三种机制:
1. 基本表达式,用于表示语言所关心的最简单的个体
2. 组合的方法,通过它们可以从较简单的东西出发构造出复合的元素
3. 抽象的方法,通过它们可以为复合对象命名,并将它们当作单元去操作
求值器的两种求值方法:
1. 直接运算并代入过程应用
2. 表达式代换后再运算 PS: 缺点很明显,同一表达式很容易被重复计算多次
`let`关键字的语法是基于lambda表达式的语法外衣:
```
(let ((<var1> <exp1>)
(<var2> <exp2>)
.
.
.
(<varn> <expn>))
<body>)
它可以读作:
> 令<var1> 具有值 <exp1> 并且
<var2> 具有值 <exp2> 并且
.
.
.
<varn> 具有值 <expn>
在<body>中
((lambda (<var1> ... <varn>)
<body>)
<exp1>
.
.
.
<expn>)
```
这么说明是为了方便理解并且判断同名变量时的作用域
闭包:
数据的定义: 一组适当的选择函数和构造函数,以及为使这些过程成为一套合法表示,它们就必须满足的一组特定条件