`
kidneyball
  • 浏览: 326859 次
  • 性别: Icon_minigender_1
  • 来自: 南太平洋
社区版块
存档分类
最新评论

SICP读书笔记(5) —— Sec1.1.2-Sec1.1.3

阅读更多
Sec1.1.2 命名和环境
介绍第一种特殊形式:define,也就是把名字与计算对象进行绑定。需要注意的是,在Lisp中,在同一个作用域中不能使用define对同一个名字重复绑定。在DrRacket中执行
(define s 2)
(define s 3)

会出错:
引用

module: duplicate definition for identifier in: s


也就是说,在Lisp中,define的作用非常纯粹。它所定义的变量(原文中就称为variable,但要注意与其他开发语言所说的可以多次赋值的变量不同)不负责跟踪状态的改变,而是专门为结构复杂或含义不清的计算对象提供一个使用方便,意义明确的名称。

这一节强调了“名字-值”绑定作为一种基本抽象手段的重要性。程序设计语言中一个必不可少的方面,就是它需要提供一种通过名字去使用计算对象的方式。……
define是我们所用的语言里最简单的抽象方法,它允许我们用一个简单的名字去引用一个组合运算的结果。……实际上,构造一个复杂的程序,也就是为了去一步步地创建出越来越复杂的计算性对象。……这一特性鼓励了渐进式的程序开发与测试,并且导致了一个Lisp程序往往是由大量相对简单的过程组成的。


(救命啊~~ “This feature encourages the incremental development and testing of programs and is largely responsible for the fact that a Lisp program usually consists of a large number of relatively simple procedures.”在中文版中被译成“这种特征鼓励人们采用递增的方式去开发和调试程序。在很大程度上,这一情况也出于另一个事实,那就是,一个Lisp程序通常总是由一大批相对简单的过程组成的”。忍无可忍了,testing成了“调试”,什么叫“递增方式的调试”呀?is responsible for成了“出于另一个事实”,因果关系与原文完全相反。usually成了“通常总是”,这是中学语文的修改病句例题啊。)

同时,本节简单提及了,这些绑定关系被储存在一种称为“环境”的储存空间中,并且在一个计算过程中可能涉及到多个环境。关于“环境”将会在后续章节中详述。

Sec1.1.3 组合式的求值

作者在这里点明了整个第一章的一个目标:“把与过程性思维有关的问题隔离(抽象)出来”。首先,是一般性求值过程:
1) 求值该组合式的各个子表达式。
2)将作为最左子表达式(运算符)的值的过程应用于相应的实际参数,所谓的实际参数也就是其他子表达式(运算对象)的值。


其中第一点体现了“递归”的概念(求值的定义中出现了对“求值”自身的需求)。因而反复地应用第一个步骤,总可以把我们带到求值中的某一点,在这里遇到的不是组合式而是基本表达式,例如数、内部运算符或者其他名字。这种递归式的求值过程并称为“树形积累”

并且,文中强调了内部运算符的实际意义事实上与其他的绑定名字是一样的,由环境来决定:环境所扮演的角色就是用于确定表达式中的各个符号的意义。在Lisp中,连“+”,“*”这样的基本运算符号也需要由环境来为其提供计算规则,有点像C++中的运算符重载,但计算规则不是与某个运算对象绑定,而是与表达式所在的环境绑定。

最后,文中提及了Lisp语法中的“特殊形式”,例如define等,这些特殊形式有其自身的求值规则。并且(在页脚注释中)指出这些特殊形式只不过是为那些完全可以采用统一形式描述的东西给出的另一种表面结构,通常称为“语法糖”(syntactic sugar)
1
3
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics