SICP读书笔记(5) —— Sec1.1-Sec1.1.1

本文探讨了程序设计语言中的三个核心机制:基本表达形式、组合的方式及抽象的方法,并阐述了‘闭包性质’的重要性,解释了它如何支撑起语言的强大功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[b][size=medium]Sec 1.1 程序设计的基本元素[/size][/b]

[color=darkblue]“这样,当我们描述一个语言时,就需要特别注意这种语言所提供的,将简单认识组合形成复杂认识的方法。每一种强有力的都为此提供了三种机制:
1. 基本表达形式 : 用于表示语言所关心的最简单的个体。
2. 组合的方式: 通过它们能从简单的元素出发构造出复合的元素。
3. 抽象的方法: 通过它们可以为复合元素命名,[b]并将其看作单元来操作[/b]。
……
通俗来说,数据是一种我们希望去操作的“东西”,而过程是关于如何操作数据的规则的描述。这样,任何强有力的程序设计语言都必须能表述基本的数据和基本的过程,还需要提供对过程和数据进行组合和抽象的方法。”
[/color]

以上三点,是如何从机制上(而不是概念上)去考察一个开发语言。概念上的“抽象”,事实上由上面的2,3两点共同在机制上支撑。这里的“抽象”机制强调了语言在组合其关心的元素时的[color=red][b]“闭包性质”[/b][/color](参考Sec2.2,注意这里所说的闭包是抽象代数中的闭包概念,而不是函数式编程中的闭包概念)。复合元素可以被命名并看作一个简单个体单元来处理,从而使用同样的一些组合方式构造出更为高层的复合元素。只有在对其元素(不论是过程还是数据)提供了这种具有“闭包性质”的组合方式,语言才得以“强有力”。自然,我们在设计或考察任何编程模型所提供的机制时,也应该从以上三个方面入手。

关于闭包性质的描述摘录如下:[color=darkblue]一般说,某种组合数据对象的操作(在这里指“组合的方式”)满足闭包性质,那就是说,通过[b]它组合起来得到的结果本身还可以通过同样的操作再进行组合[/b]。闭包性质是任何一种组合功能的威力的关键要素,因为它使我们能够建立起层次性的结构,这种结构由一些部件组成,而其中的各个部件又是由它们各自的部件组成,并且可以如此继续下去。……除了最简单的程序外,所有程序都依赖于一个事实:[b]组合式的成员本身还可以是组合式。[/b][/color]

(composition设计模式是“闭包性质”的一个典型例子)

需要注意的是,SICP书中说明(这么重要的一段话居然用小字注释写在页脚中……):[color=darkblue]术语“闭包”来自抽象代数。在抽象代数里,一个由某些元素组成的集合称为在某个运算(操作)之下封闭,如果将该运算应用于这一集合中的元素,产生出的结果仍然是该集合中的元素。然而Lisp社区(很不幸地)还用术语“闭包”描述另一个与此毫不相干的概念:闭包也是一种表示“带有自由变量的过程”的实现技术。[b]本书中没有采用闭包这一术语的第二种意义。[/b][/color]

从这里也可以看出,sicp并不着眼于具体的函数式编程语言实现。但是(很纠结地),我在写后续章节的笔记时很需要用到“闭包”的第二种意义。为了行文流畅,现在暂定,在后续的笔记中,用“闭包”表示第一种意义,用“高阶函数的闭包”表示第二种意义。

[b][size=medium]Sec 1.1.1 表达式[/size][/b]

介绍了“前缀表示”和“缩进”。需要注意的是,这种书写为“左括号+运算符+空格+运算对象+右括号”,并且会返回一个结果的表达式,称为“一般性求值”,是LISP中最基本最普遍的表达形式,其它的表达形式都被称为“特殊形式”,例如define形式,cond形式等等。(参考Sec1.1.3)。L

SICP书中所说“前缀表示”的两个优点感觉都没写到点子上(感觉可能是要卖个关子,后面再说)。统一使用前缀表示的最大优点是把表达式和函数调用在形式上统一起来了,大大提高了LISP的语言特征正交性,从而简化了语言。

所谓语言特征正交性,是指语言特征[color=darkblue]“可以任意地组合使用,而且这些组合也都有意义;另一方面,一个特定特征的意义始终如一,无论与之组合的其他特征是什么。正交性这一术语出自线性代数里的正交向量。在一个正交向量集里的任何向量都独立于其他向量(不能用它们表示),而且对于描述整个向量空间而言,这一集合里的每个向量都是必须的。” [/color] (摘自《程序设计语言————实践之路(第2版)》,Michael L. Scott著,裘宗燕译)。

嗯,很难懂,因为这也是裘老师的译著,其最大特色是你为了看懂中文版必须拿著一本英文版对照着看,刚好我现在手头上没有……等找到了英文版再尝试改写一下……简单来说,正交性就是提倡语言的特性在设计上保持各自独立(一个特性在概念上不会和另一个特性有所重叠,例如传统的函数与表达式的区别就很暧昧,你可以有一个只包含一个函数的表达式,也可以有一个只对一个表达式求值的函数),并且其组合会产生有意义的新结果(而函数和表达式的组合还是表达式)。高度正交的语言特性可以保证语言的特性被简化为能支持其设计目标的最小特性集合(所谓的“这一集合里的每个向量都是必须的”)。当然,正交性不是语言设计的终极目标,很多不太追求正交性的语言也活得很好。但在设计语言(或任何编程模型)时适当考虑正交性可以避免引入过多繁杂而不灵活的特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值