全部学习汇总: https://github.com/GreyZhang/g_SICP
理解这一段,先看看之前的函数实现。
上面这个函数就是之前的函数实现。这样对比之下,很容易理解这一章节中的一个替代写法。
第一个画出来的地方用来描述了函数定义的时候,lambda其实是define的一种语法糖。第二个画出来的地方用来解释lambda表达式究竟应该如何做解读。第三个之前是没有理解过的,这个仔细分析一下也容易明白其含义。其实这个表达式本身就等同于函数,因此可以与函数一样直接被调用。
这是一个函数设计的抽象设计过程,这里把两个变量相关的信息变成了中间变量的形势来做简化,从而设计出来一个精简的计算过程。这在设计上是容易理解的,然后把中间的简化过程中的定义信息代入到计算过程中。
中间的简化过程可以设计成用lambda表达式来替代,替代之后按照前面调用的方式直接传入两个参数。但是这种形式似乎没有在可读性上带来什么提升。
这样就引入了另外一种可读性更好的形式,let。这个形式之前在使用emacs的时候其实是用到过的,但是之前只是当做类似C语言局部变量的形式来用。现在看来其实这个用法跟C语言的局部变量还是不同,因为它替代掉的不是一个简单的数值而是一个表达式。而这个let的形式其实就是下面这个lambda表达式的一个变型。let会被解析成这样的lambda表达式。解析器本身其实不需要提供任何局部变量,let只是lambda表达式的一种语法糖。
这里给出了两个语法注意点的解释,第一个其实是很容易理解的。脱离了let之后,let定义的局部量其实是就无效了。第二个的理解,其实可以借助于另一种形式。把let局部变量的定义换成a、b之后,再进行理解。这样,能够看得出局部量与全局量之间的差异。为了理解上的方便,可以给一个限定性结论:局部量的定义不能够引用局部量。
这里又给出了一个写法,使用define。但是通常来说,define不用来定义局部量而是用来定义局部函数。
以上算是对使用lambda构建函数这个章节的内容整理,到此为止,我觉得我基本上已经适应了lambda表达式的使用了。