文档章节

【SICP归纳】3 层次性数据和符号数据

NoMasp
 NoMasp
发布于 2015/09/08 21:47
字数 2020
阅读 1
收藏 0

在学习书中第二章的时候有个问题一直让我很困扰,那就是2.2.4节的实例,因为没法输出书中华丽的图案,只能是一对英文字母。这在几个月前浅浅的学了一会Common Lisp的时候也是如此,当时看到书中有个实例是书中输出了很赞的线条,而我只会输出一堆点。后来才知道让Lisp输出图形化界面是更高层次的工程,想想还是先把SICP搞定。

上一篇博文中我们谈到了复合数据,关于它有两个重点。第一,数据抽象,这也就意味着你可以隔离那些数据对象。第二,在Lisp中有个特殊的方式能够黏住一些东西,它就是pair,而cons、car、cdr的实现方式我们暂时不必去研究。在BASIC和Fortran中构造一个数组并不是一个闭合的操作,因为你可以用数字、字符串和其它东西来构造数组,但你不能用数组来构造数组。而当你看着组合的定义时,你应该看看这些东西在组合的定义下是否是闭合的。因为我们可以形成序对的序对,我们就可以用序对用各种方式粘起各种东西。比如我们用1、2、3、4来构成一个序对,就可以有非常多种方式,一下只是一部分,而且还仅仅是按照大小顺序来构造的。

(cons 1 (cons 2 (cons 3 4)))
(cons (cons 1 2) (cons 3 4))
(cons (cons 1 (cons 2 3)) 4)
(cons 1 (cons (cons 2 3) 4))
(cons (cons (cons 1 2) 3) 4)

而且在任意的序对中,都可以有car、cdr的组合来得出其中的任一元素。我们可以建立元素本身也是序对的序对,这就是表结构得以作为一种表示工具的根本基础。我们将这种能力称为cons的闭包性质(the closure property of cons)。一般说,某种组合数据对象的操作满足闭包性质,那就是说,通过它组合起数据对象得到的结果本身还可以通过同样的操作再进行组合。闭包性质是任何一种组合功能的威力的关键要素,因为它使我们能够建立起层次性的结构(hierarchical structures),这种结构由一些部分构成,而其中的各个部分又是由它们的部分构成,并且可以如此继续下去。

在2.2.4节中,我们怎样在如此短的时间内就可以用简单图片来构造出复杂的图片,这就是因为Lisp有闭包的性质。我们可以拿一张图片来得到另一张beside版的图片,而且这张图片还可以rotate和flip,或者用这所有的操作。关于这部分作者说:When I take that element P, which is the Beside or the Flip or the Rotate of something, that’s, again, a picture. The world of pictures is closed under those means of combination. So whenever I have something, I can turn right around and use that as an element is something else. So maybe better than List and segments, that just gives you an image for how fast you can built up complexity, because operations are closed.

一个复杂的系统应该通过一系列的层次构造出来,为了描述这些层次,需要使用一系列的语言。构造各个层次的方式,就是设法组合起作为这一层次中部件的各种基本元素,而这样构造出的部件又可以作为另一个层次里的基本元素。在分层设计中,每个层次上所用的语言都提供了一些基本元素、组合手段,还有对该层次中的适当细节做抽象的手段。分层设计有助于使程序更加强健,使我们更有可能在给定规范发生一些小改变时,只需对程序做少量的修改。

我们可以组合东西,可以递归过程,可以做各种事情,而且这些都是自动的。我们仅仅使用语言的句法和将句法嵌入语言,这样我们就不会失去语言最原始的能力。表最伟大的是什么,如果只是用表去做一些尖刻的问题,这便是一门糟糕的语言。而去补充你想要的语言并且将其嵌入到表中,这才是表的伟大之处。这也正是所谓实现的真正力量——去设计一门语言。我们甚至可以走得更远,用表来让常规方法像高阶函数一样完成一些事情。

这里有一个层次允许我们去创建一个原始的图片,然后我们对图片进行各种操作。这些操作所发生的事情归结起来就是Henderson创建的图形语言。而且在这之上,我们也看到了由组合构成的schemes,由schemes构成的语言。比如说这里反复地使用一个比例系数。在这个层次所拥有的,这些被提到的事物被架设到上一个层次。事实上每一个节、每一个到这一层次的分解都被设计成执行具体的任务,而在其他层次,你却拥有全方位的力量。在任何层次,它没有被设置成一个具体的任务,而是被设置成整个范围。这一设计的结果就是被设计在方法中的功能更加健壮。

如果你在函数的描述中做些改变,它更可能是由相应的变化所捕获,在这里语言也会自动在下一级别执行,因为你已经完全控制了这一个层次。所以如果不是在谈论一个具体的函数,比如说Beside,那么你便拥有全局的控制,所以如果去进行一点点的改变,更可能的便是你的方法将有能力去捕获、去适应这一改变。而这样的设计则不会是强大的,因为如果我去改变一些东西,可能会影响整个层次,进而进入树的下一层。

对于由表,亦或是由符号来构造的软件的方法,去设计过程与其说是实现一个程序,不如说是构造一门语言。如果要构造出表(a b),不能用(list a b),因为这构造出来的是a和b的值的表,而不是这两个符号本身的表。因为假如a和b都被define定义成了具体的数值,比如1和2,那么(list a b)得出来的就是(1 2)而不是(a b)了。引号是很有威力的东西,因为它使我们可以构造起一种能操作其他表达式的表达式。所以我们应该用要这样写:(list ‘a ‘b)。

符号求导是一个挺难的部分,在这样有一个很重要的思想,在后面的习题中会有很多体现,那就是按愿望思维。所谓的思想,对于不同的编程语言都是通用的,这也就是为什么SICP是学习函数式编程最好的书籍。即便对于C等语言也是如此,当需要完成一个操作时,我们写了一个函数,一个类,但这个函数可以还要调用其它的函数,这个类也可能是由其它类继承而来。Lisp也是支持面向对象编程的,只不过比较痛苦。



感谢访问,希望对您有所帮助。 欢迎关注或收藏、评论或点赞。


为使本文得到斧正和提问,转载请注明出处:
http://blog.csdn.net/nomasp


版权声明:本文为 NoMasp柯于旺 原创文章,未经许可严禁转载!欢迎访问我的博客:http://blog.csdn.net/nomasp

本文转载自:http://blog.csdn.net/nomasp/article/details/44277321

NoMasp
粉丝 7
博文 334
码字总数 0
作品 0
镇江
程序员
私信 提问
nomasp 博客导读:Lisp/Emacs、Algorithm、Android

版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/44966625 Profile Introduction to Blog 您能看到这篇博客导读...

nomasp
2015/09/17
0
0
YAML简介与使用实例

一、YAML介绍 YAML:是YAML Ain't a Markup Language(YAML不是一种置标语言)的递归缩写,早先YAML的意思其实是:Yet Another Markup Language(另外一种置标语言),但为了强调这种语言以数...

孟飞阳
2016/07/12
1K
3
数据的机器层次表示

数据是计算机处理和加工的基本单位和对象。在计算机中数据分为无符号数(绝对值)和有符号数(真值)。其中带符号数根据编码分为原码、反码、补码、移码。 计算机中数据的表示最基本的为二进...

sinat_38321889
2018/01/24
0
0
第1、2章笔记

1 数据 ->数据结构 数据(操作对象):描述客观事物的符号,能被计算机识别,并输入给计算机处理的符号集合 数据元素(建立数据结构的着眼点):组成数据的、有一定意义的基本单位 数据项:不可...

xuhuiyue
2018/02/07
0
0
数据库基本概念

一、 数据库相关的概念:数据、数据库、数据库管理系统、数据库系统 二、 三、 数据库三个阶段:人工管理阶段,文件系统阶段,数据库系统阶段。 四、 数据库系统特点:1.数据结构化;2.数据共...

mehome
2017/04/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
昨天
59
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
昨天
28
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
昨天
65
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
昨天
58
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
昨天
60
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部