lisp eval apply_SICP远古魔法-LISP概览(1-2)

1344b65c4a3a69224efb183037062742.png

我们之所以能够像今天这样构建丰富多彩的应用是因为,我们有大系统中控制复杂度技术

实际上这种技术在其它领域早已存在。例如造火箭,盖房子。但是计算机科学又和他们不太一样,因为计算机科学处理的不是真实的情况,而是虚拟的。

例如在物理上我们构建1个放大器,或者2个放大器进行串联都很容易,这时噪声影响很小。但是当我们构造百万个放大器串联的时候,可能在还没有达到百万的时候,物理噪声的影响已经使其变得不可用了。

而计算机科学处理的都是理想化的组件。像数据结构或者是代码,我们是可以随心所欲地组合的,我们完全不用担心会有什么物理问题。从逻辑上来讲只要是我们能想出来的我们就能构建出来,完全不用担心物理定律、噪声等会对它产生某种约束。唯一的约束就是我们的想像力。

那大型系统中控制复杂度都有哪些技术呢?

1.黑盒抽象:将一些东西封装从而不关心内部细节。

a441e07d8665bb890f549ee0e9164b21.png

例如上一节提到的求平方根的方法。我们定义好输入和输出,当输入为36的时候,这个盒子可以输出6。这样做的一个优点是,我们可以把这个盒子交给其它人使用,例如有个人想计算

,他无需知道开平方是如何实现的,盒子的内部是什么样的并不重要。

41a3a25f07be2592523050f4aa8ffa25.png

使用黑盒的的好处之一是这样我们可以在不掌握所有细节的时候可以用其它的盒子去构建更大的盒子。而另一个原因是,我们可以构建更抽象一层的通用方法。例如我们上一节提到的求平方根的方法,我们在求解平方根的方法再抽象一层,将其归纳为求解不动点的通用方法。换句话说。我们可以应用获取不动点的方法来得到一个求解平方根的方法。

下面是求解平方根的方法:

如何求
的平方根?

1.随便猜一个数叫G
2.改进你的猜想通过计算 G 和 X/G的平均值
3.不断重复步骤2,直到满意为止

我们将其抽象如下图:

a9deacad39678a15252154e6fc78edfe.png

从图中,我们可以看到,我们构建盒子的时候是可以不限制输入和输出必须是数字的。输入和输出也可以是一个函数、过程、或者是其它盒子,这些都一样。换句话说,我们可以通过输入一个过程从而生成另一个过程,而这种处理方式其实非常强大,我们将在后面体会他的强大之处。

下面我们列出了黑盒抽象在后面的文章会具体讨论内容大纲:

Lisp的基本对象:基本过程和基本数据结构
组合方法:如何用基本的过程来构建更复杂的过程,基本数据组成复合数据
抽象:过程的定义简单的数据抽象。
提炼共性:高阶过程数据和过程的共性。

2.约定接口:按照约定来实现相应的接口。这个我们第2个应对大型复杂系统的方法。

下面我们通过举例的方式来理解下为什么约定接口能解决复杂性问题。首先假设我们有一个想法是想把2个元素相加后再乘以某个元素。我们用如下的符号来表示。这种表示方式大家都比较好理解,因为他有我们隐含的约定。

而计算机一般比较擅长处理前缀表达式,于是我们写成前缀表达式如下,这个表达式和上面等价,只不过位置换了一下。

当我们在进行数学运算的时候,例如我们代入下面的数字,如下的表达式结果为8。

现在思考这样一个问题,我们希望这样的描述是通用的,例如

还有
也可以是一个向量,也可以是一个多项式、也可以是一个电信号。上面的表达式可以对不同类型都起作用。

所以我们希望我们的编程语言是可以支持描述这样的抽象,也就是对于不同的参数类型,可以做不同的运算。实际上,如对于不同的类型,他们的处理方式显然是不同的。那么我们如何运用这些过程去处理不同数据类型呢?

我们不但要面对已知的类型,还需要应对未来,例如未来某一天一个人又提出了一种数据类型,也需要支持这2种基本运算,我们如何能保证将他引入到系统中而且不把系统变得一团糟呢?

解决这个问题的办法就是约定接口。人们通过对不同的类型,定义相同的接口标准,这样便可以将这些组件进行组合,组件之间能组合而不关心细节是构建大型系统的关键。

下面列出了约定接口后面会具体讨论内容:

基本操作
大型架构问题
面向对象编程
聚合流操作

3.元语言抽象:这是处理大型系统的第三个方法,有时候你可能受不了处理这个复杂度时,你其实可以自己设计一个语言,它的本质其实是在一方面隐藏了部分细节,另一方面强调了一些其它细节,这也是SICP里最神奇的部分。

2ab35c09d134341f70a0a0b15d66aa1c.png

我们后面可以看到如何用LISP来解释LISP,这其实主要是通过LISP里的2个过程APPLY和EVAL来不断地交替进行。另外还一个魔法符号

在过程式语言用于表达无限,这些内容会在后面进行讨论这里只是列举了一个大纲。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值