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

在本书的第二章学习时,有一个问题我一直很困扰,那是2.2.4举例节。因为没有华丽的输出模式书,它只能有一个对的英文字母。两三个月的这浅浅的学校前Common Lisp同样是真实的,当。了非常赞的线条,而我仅仅会输出一堆点。后来才知道让Lisp输出图形化界面是更高层次的project,想想还是先把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王克在 原创文章,如需转载,请与我联系。分享智慧,维护知识产权。

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

时间: 2024-07-29 12:27:48

【SICP感应】3 级数据和符号数据的相关文章

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  型

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

在学习书中第二章的时候有个问题一直让我很困扰,那就是2.2.4节的实例,因为没法输出书中华丽的图案,只能是一对英文字母.这在几个月前浅浅的学了一会Common Lisp的时候也是如此,当时看到书中有个实例是书中输出了很赞的线条,而我只会输出一堆点.后来才知道让Lisp输出图形化界面是更高层次的工程,暂时还未有时间来学习,先把SICP搞定. 上一篇博文中我们谈到了复合数据,关于它有两个重点.第一,数据抽象,这也就意味着你可以隔离那些数据对象.第二,在Lisp中有个特殊的方式能够黏住一些东西,它就是

已知从BUF开始存放了10个字类型有符号数据,编程求出这10个数中的最大数和最小数(将最大数存入MAX字单元、最小数存入MIN字单元),并将其以10进制数的形式在屏幕上显示出来。

data segment pmax db 0dh,0ah , 'MAX : ','$' pmin db 0dh,0ah , 'MIN : ','$' buf dw 48,-2 ,49,50,30,-78,-88,-60,-1,48 max dw 99 min dw 20 data ends code segment assume cs:code , ds:data main proc far start: mov ax,data mov ds,ax call compare lea dx,pma

px4flow通过iic读取具体寄存器数据程序

底层通信用了昨天写好的iic,今天结合官方资料成功读出所有指定寄存器的数据附上源码 include.h主要包括了一些stm32 IO控制的宏定义,具体参考正点原子所有例程中都有的sys.h头文件 inc #ifndef __PX4FLOW_H #define __PX4FLOW_H #include "include.h" //器件地址 #define PX4FLOW_ADDR 0x42 //寄存器宏定义,如果是2字节一个数据地址指的低字节位,高字节是低字节地址后一位,组合起来就是完整

C# 10进制与62进制互转 数据大无压力 10进制与72,96进制任意转换

因项目需要把10进制的ID转换成62进制的字符串,分享给别人. 于是在网上搜索了很多算法,但都未能满足需要,项目里的ID是固定算法算出来的18~20位数据的ulong整型. 如:17223472272256398107,509488277152981097. 网上找的算法问题在于,将ulong的值转换62进制的字符串后,再将字符串转换成ulong值时会不准确. 于是各种测试与假象问题所在,最后确定算法确实没有问题,于是开始怀疑数据类型的问题. 果然,原因是使用了Math.Pow(double x

1-计算机中的数据信息表示

二.八.十六进制转换 对于任何一个R进制的数有:(N)R=∑n−1i=−mxiRi=xn−1Rn−1+xn−2Rn−2+...+x0R0+x−1R−1+...+x−(m−1)R−(m−1)+x−mR−m 其中R是R进制数的基数x取值范围是R-1 并且规则是逢R进1 数值转换时需要注意的问题: 不同进制数的基数不同 所使用的数字取值范围也不同 将任意进制数转换为十进制的方法是按权相加 即利用按权展开多项式系数x 与位权值相乘后 将乘积逐项求和 将十进制数转换为任意进制数时 整数部分与小数部分需要分

Modelsim设置数据以模拟波形显示

选中希望以模拟波形显示的信号,右击选择format->Analog(automatic) 如果你的数据是用无符号数表示一个完整的波形的,那么可能显示出来的波形样子是下面的样子,不过不要紧,这是因为modelsim默认是按照有符号数据解析波形数据的缘故,我们可以再进行一次设置修改. 选中希望显示波形的信号,右击,选择Radix->Unsigned. 设置完成后,波形就如下所示了: 是不是发现虽然波形已经是完整的正弦波了,但是波形有部分却跑到其他信号的地盘去了呢?这也不要紧,是模拟波形的显示范围设

常见的进制转换与有符号数据表示法

注:本内容参考与传智播客的Java内容的讲解,当然我整理了一下,做个记录~~~ 其中我认为很有价值的是有符号数据表示法,真正的去深入了解计算机,虽然我是一个渣渣~~~ 所谓进制就是指:就是位进制,是人们规定的一种进位方法.对于任何一种进制 --X进制,就表示某一位置上的数运算时是逢X进一位.二进制就是逢二进一,八进制就是逢八进一,十进制就是逢十进一,十六进制就是逢十六进一. 一.常见的进制转换 1.在Java中针对整数常量提供了四种表现形式 (1)二进制 由0,1组成.以0b开头. (2)八进制