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

在学习书中第二章的时候有个问题一直让我很困扰,那就是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,那么你便拥有全局的控制,所以如果去进行一点点的改变,更可能的便是你的方法将有能力去捕获、去适应这一改变。而这样的设计则不会是强大的,因为如果我去改变一些东西,可能会影响整个层次,进而进入树的下一层。

对于由表,亦或是由符号来构造的软件的方法,去设计过程与其说是实现一个程序,不如说是构造一门语言。




为使本文得到斧正和提问,转载请注明出处:

http://blog.csdn.net/nomasp

邮箱及Skype:[email protected]

Facebookhttps://www.facebook.com/yuwang.ke

CSDN博客http://blog.csdn.net/nomasp

新浪微博http://weibo.com/nomasp

时间: 2024-10-10 04:02:15

【SICP归纳】3 层次性数据和符号数据的相关文章

【SICP感应】3 级数据和符号数据

在本书的第二章学习时,有一个问题我一直很困扰,那是2.2.4举例节.因为没有华丽的输出模式书,它只能有一个对的英文字母.两三个月的这浅浅的学校前Common Lisp同样是真实的,当.了非常赞的线条,而我仅仅会输出一堆点.后来才知道让Lisp输出图形化界面是更高层次的project,想想还是先把SICP搞定. 上一篇博文中我们谈到了复合数据,关于它有两个重点.第一.数据抽象,这也就意味着你能够隔离那些数据对象.第二.在Lisp中有个特殊的方式能够黏住一些东西.它就是pair,而cons.car.

Scheme 4 Javaer-7.符号数据

SICP有个缺点:不利于我们跳读. 当我想忽略或快速浏览某些章节后,阅读<2.3符号数据>,又逼得我不得不回头找一下某些东西. 例如 练习2.53中提到的cadr,我得回头查一查: 练习2.54中,如何判断表的一个元素是否表,是否符号?我不会耶!!!2.3.2中提到判断表达式是否数值的基本函数number?,应该有相关的基本过程吧,那里提到了呢?晕,在<代数表达式的表示>中提到了symbol?, 还能不能让我好好玩耍? 本节对我们应该有点吸引力,因为在<编程导论(Java)?

【002】有符号数据传递给无符号变量

[例2] 将有符号数据传送给无符号变量. #include <iostream> using namespace std; int main( ) { unsigned short a; short b=-1; a=b; cout<<"b="<<b<<endl; cout<<"a="<<a<<endl; return 0; } [输出结果] b=-1 a=65535 short  型

sas数据读取详解 四种读取数据方式以及数据指针的位置 、读取mess data的两个小工具、特殊的读取技巧、infile语句及其选项(dsd dlm missover truncover obs firstobs)、proc import、自定义缺失值

(The record length is the number of characters, including spaces, in a data line.) If your data lines are long, and it looks like SAS is not reading all your data, then use the LRECL= option in the INFILE statement to specify a record length at least

图像数据到网格数据-1——MarchingCubes算法

原文:http://blog.csdn.net/u013339596/article/details/19167907 概述 之前的博文已经完整的介绍了三维图像数据和三角形网格数据.在实际应用中,利用遥感硬件或者各种探测仪器,可以获得表征现实世界中物体的三维图像.比如利用CT机扫描人体得到人体断层扫描图像,就是一个表征人体内部组织器官形状的一个三维图像.其中的感兴趣的组织器官通过体素的颜色和背景加以区别.如下图的人体足骨扫描图像.医生通过观察这样的图像可以分析病人足骨的特征,从而对症下药. 这类

面板数据、截面数据、时间序列数据

截面数据.时间序列数据.面板数据是最常见的三种样本数据形式,网上对于此类数据的介绍比较零散,我在此做一个汇总归纳,如有错误,欢迎指正,我在此只做简单介绍,并不涉及具体分析,特别是面板数据,分析比较复杂,有专门的书籍可以参阅. 一.截面数据(Cross Section data) 1.概念: 截面数据是指由同一时期.不同个体的一个或多个统计指标所组成的数据集.该数据强调同一时期,因此也称为静态数据,我们平时获取的样本数据,大都具有同期性,因此截面数据也是最常见的 样本数据.例如:2016年各省份人

SQL语句汇总(二)——数据修改、数据查询

首先创建一张表如下,创建表的方法在上篇介绍过了,这里就不再赘述. 添加新数据: INSERT INTO <表名> (<列名列表>) VALUES (<值列表>)  如: INSERT INTO t_student (student_id,student_name,student_age,student_sex) VALUES (1,'大毛',18,'男'); 其中列名可以省略,省略之后要求插入的值必须与列一一对应: INSERT INTO t_student VALUE

如何区分三个大数据热门职业–数据科学家、数据工程师、数据分析师?

随着大数据行业的逐步兴起,相关大数据的职业也成为热门职业,给人才的发展带来了很多机会.数据科学家.数据工程师.数据分析师已经成为大数据行业最热门的职位.那么它们又是如何定义的呢?有什么职责? 1.数据科学家是指能采用科学方法.运用数据挖掘工具对复杂多量的数字.符号.文字.网址.音频或视频等信息进行数字化重现与认识,并能寻找新的数据洞察的工程师或专家(不同于统计学家或分析师). 2.数据工程师一般被定义成“深刻理解统计学科的明星软件工程师”.如果你正为一个商业问题烦恼,那么你需要一个数据工程师.他

数据可视化(9)--数据可视化6步法

在当前互联网,各种数据可视化图表层出不穷,本文尝试对数据可视化的方法进行归纳,整理成6步法.一般的数据图表都可以拆分成最基本的两类元素: 所描述的事物及这个事物的数值,我们暂且将其分别定义为指标和指标值.比如一个性别分布中,男性占比30%,女性占比70%,那么指标就是男性.女性,指标值对应为30%.70%. 1. 将指标值图形化 一个指标值就是一个数据,将数据的大小以图形的方式表现.比如用柱形图的长度或高度表现数据大小,这也是最常用的可视化形式.传统的柱形图.饼图有可能会带来审美疲劳,可尝试从图