lisp eval apply_SICP远古魔法-LISP概览(1-2)

1344b65c4a3a69224efb183037062742.png

我们之所以能够像今天这样构建丰富多彩的应用是因为,我们有大系统中控制复杂度技术

实际上这种技术在其它领域早已存在。例如造火箭,盖房子。但是计算机科学又和他们不太一样,因为计算机科学处理的不是真实的情况,而是虚拟的。

例如在物理上我们构建1个放大器,或者2个放大器进行串联都很容易,这时噪声影响很小。但是当我们构造百万个放大器串联的时候,可能在还没有达到百万的时候,物理噪声的影响已经使其变得不可用了。

而计算机科学处理的都是理想化的组件。像数据结构或者是代码,我们是可以随心所欲地组合的,我们完全不用担心会有什么物理问题。从逻辑上来讲只要是我们能想出来的我们就能构建出来,完全不用担心物理定律、噪声等会对它产生某种约束。唯一的约束就是我们的想像力。

那大型系统中控制复杂度都有哪些技术呢?

1.黑盒抽象:将一些东西封装从而不关心内部细节。

a441e07d8665bb890f549ee0e9164b21.png

例如上一节提到的求平方根的方法。我们定义好输入和输出,当输入为36的时候,这个盒子可以输出6。这样做的一个优点是,我们可以把这个盒子交给其它人使用,例如有个人想计算

,他无需知道开平方是如何实现的,盒子的内部是什么样的并不重要。

41a3a25f07be2592523050f4aa8ffa25.png

使用黑盒的的好处之一是这样我们可以在不掌握所有细节的时候可以用其它的盒子去构建更大的盒子。而另一个原因是,我们可以构建更抽象一层的通用方法。例如我们上一节提到的求平方根的方法,我们在求解平方根的方法再抽象一层,将其归纳为求解不动点的通用方法。换句话说。我们可以应用获取不动点的方法来得到一个求解平方根的方法。

下面是求解平方根的方法:

如何求
的平方根?

1.随便猜一个数叫G
2.改进你的猜想通过计算 G 和 X/G的平均值
3.不断重复步骤2,直到满意为止

我们将其抽象如下图:

a9deacad39678a15252154e6fc78edfe.png

从图中,我们可以看到,我们构建盒子的时候是可以不限制输入和输出必须是数字的。输入和输出也可以是一个函数、过程、或者是其它盒子,这些都一样。换句话说,我们可以通过输入一个过程从而生成另一个过程,而这种处理方式其实非常强大,我们将在后面体会他的强大之处。

下面我们列出了黑盒抽象在后面的文章会具体讨论内容大纲:

Lisp的基本对象:基本过程和基本数据结构
组合方法:如何用基本的过程来构建更复杂的过程,基本数据组成复合数据
抽象:过程的定义简单的数据抽象。
提炼共性:高阶过程数据和过程的共性。

2.约定接口:按照约定来实现相应的接口。这个我们第2个应对大型复杂系统的方法。

下面我们通过举例的方式来理解下为什么约定接口能解决复杂性问题。首先假设我们有一个想法是想把2个元素相加后再乘以某个元素。我们用如下的符号来表示。这种表示方式大家都比较好理解,因为他有我们隐含的约定。

而计算机一般比较擅长处理前缀表达式,于是我们写成前缀表达式如下,这个表达式和上面等价,只不过位置换了一下。

当我们在进行数学运算的时候,例如我们代入下面的数字,如下的表达式结果为8。

现在思考这样一个问题,我们希望这样的描述是通用的,例如

还有
也可以是一个向量,也可以是一个多项式、也可以是一个电信号。上面的表达式可以对不同类型都起作用。

所以我们希望我们的编程语言是可以支持描述这样的抽象,也就是对于不同的参数类型,可以做不同的运算。实际上,如对于不同的类型,他们的处理方式显然是不同的。那么我们如何运用这些过程去处理不同数据类型呢?

我们不但要面对已知的类型,还需要应对未来,例如未来某一天一个人又提出了一种数据类型,也需要支持这2种基本运算,我们如何能保证将他引入到系统中而且不把系统变得一团糟呢?

解决这个问题的办法就是约定接口。人们通过对不同的类型,定义相同的接口标准,这样便可以将这些组件进行组合,组件之间能组合而不关心细节是构建大型系统的关键。

下面列出了约定接口后面会具体讨论内容:

基本操作
大型架构问题
面向对象编程
聚合流操作

3.元语言抽象:这是处理大型系统的第三个方法,有时候你可能受不了处理这个复杂度时,你其实可以自己设计一个语言,它的本质其实是在一方面隐藏了部分细节,另一方面强调了一些其它细节,这也是SICP里最神奇的部分。

2ab35c09d134341f70a0a0b15d66aa1c.png

我们后面可以看到如何用LISP来解释LISP,这其实主要是通过LISP里的2个过程APPLY和EVAL来不断地交替进行。另外还一个魔法符号

在过程式语言用于表达无限,这些内容会在后面进行讨论这里只是列举了一个大纲。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433588.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

奥拉星插件flash下载手机版下载安装_终于等到你!安卓微信7.0.13内测版发布 支持夜间模式 附下载地址!...

3月22日,iOS版微信迎来了7.0.12正式版更新,最大的亮点在于为iOS13设备加入了“深色模式”功能,虽然没有独立的控制开关,但可以跟随系统开启或关闭夜间模式。此外,iOS版微信7.0.12还优化了语音消息的发送体验&#xff0…

boost::weak_ptr和enable_shared_from_this

boost::weak_ptr和enable_shared_from_this shared_ptr在我的实践中使用很广,在接口层面上,我基本都会默认的使用shared_ptr.而weak_ptr则很少使用;即便使用,也是间接的使用,例如使得class A继承自boost::enable_shared_from_this,这样A便具有了一个weak_ptr的成员对象,我便可以…

WebSite和Web Application\网站与Web项目的区别

简要记录下:1、web应用程序Default.aspx显示有两个原有文件及Default.aspx.cs和Default.aspx.designer.cs;1、Web网站Default.aspx显示有一个原有文件Default.aspx.cs。 2、web应用程序有重新生成和发布两项;Web网站只有一个发布网站。 3、we…

linux(centos7)安装jdk

一、下载jdk1.8压缩包 官网链接如下: jdk官网 用xftp直接传输文件, 把下载好的jdk压缩包上传到Linux的文件夹下去到我们存放软件的文件夹下面,将刚刚下载好的压缩包通过如下命令进行解压: tar -zxvf jdk-8u321-linux-x64.tar.g…

inner join 和join的区别_left join、right join和join ???

点击上方“JAVA”,星标公众号重磅干货,第一时间送达有个困扰 说到SQL,很多人可能用了挺久,但依然有个问题一直困扰着,那就是 left join、 join、 right join和 inner join等等各种 join的区别。网上搜,最常…

黑马程序员顺义校区php_黑马程序员:从PHP零基础到月薪11K为何送锦旗给班主任?...

2016年我在传智播客学习完PHP以后,特意给班主任王智慧老师送了一面锦旗。为什么我会送锦旗,那是因为从她当我们班主任开始,就非常的负责,对我们非常的好,这个可以随便问问班里的同学。而且我能找到高薪工作跟她对我的鼓…

C++中std::tr1::function和bind 组件的使用

在C的TR1中(Technology Report)中包含一个function模板类和bind模板函数&#xff0c;使用它们可以实现类似函数指针的功能&#xff0c;但却却比函数指针更加灵活&#xff0c;特别是函数指向类的非静态成员函数时。可以参考Scott Meyers. <<Effective C (3rd Edition)>…

linux(centos7)安装MySQL

一、删除MariaDB的文件 通过命令查询MariaDB&#xff1a;rpm -pa | grep mariadb 通过命令删除查找到的程序rpm -e 查找到的文件名 如果删除失败&#xff0c;就通过下面的命令强制删除&#xff1a;rpm -e --nodeps 查找到的文件名 二、安装MySQL 1、安装mysql repo源 …

python ddos攻击脚本_python版本DDOS攻击脚本

今天为了休息下&#xff0c;换换脑子&#xff0c;于是就找到了我之前收藏的一篇python的文章&#xff0c;是关于ddos攻击的一个脚本&#xff0c;正好今天有空&#xff0c;就实践下了。 附上源码pyDdos.py:#!/usr/bin/env python import socket import time import threading #P…

设计模式 - Command

意图&#xff1a;将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤消的操作。 class Receiver { public:Receiver(){}virtual ~Receiver(){}virtual void Action(){cout<<&quo…

代码中特殊的注释技术——TODO、FIXME和XXX的用处

前言&#xff1a;今天在阅读Qt Creator的源代码时&#xff0c;发现一些注释中有FIXME英文单词&#xff0c;用英文词典居然查不到其意义&#xff01;实际上&#xff0c;在阅读一些开源代码时&#xff0c;我们常会碰到诸如&#xff1a;TODO、FIXME和XXX的单词&#xff0c;它们是…

我有机器人合体成一个大力神_史上最菜大力神(三)——SS加强级高塔

史上最菜大力神&#xff08;三&#xff09;——SS加强级高塔​mp.weixin.qq.com上次开箱废渣和狂暴的时候&#xff0c;误把电影中出现的高塔当作废渣&#xff0c;犯下了一个不大不小的错误&#xff0c;如今真正的高塔终于来了。史上最菜大力神&#xff08;一&#xff09;——SS…

c语言判断闰年_C语言1博客作业06 - D丶千思

1.作业头实验作业输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意&#xff1a;闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。.1数据处理数据表达&#xff1a;采用整形定义变量Y(year)&#xff0c;M(month)&#x…

新版本idea的run/debug configuration

点击Edit Configuration点击modify options的下拉选项根据需要勾选相应的选项

登录用户Eclipse中SVN访问用户的变更办法

废话就不多说了&#xff0c;开始。。。 有点标题党了&#xff0c;呵呵 其实不止Eclipse成集SVN&#xff0c;全部SVN拜访用户的更变&#xff0c;都可以参照面下的式方 每日一道理 谁说人与人隔着遥远的重洋&#xff0c;谁说心与心设着坚固的堤防&#xff1f;十六岁的鸟儿飞上天空…

无法渲染窗口发黄_基础c4d教程:OC渲染器的立体光照

一、效果图昨天才把C4DR19安装好&#xff0c;之前安装一直在说无法找到系统的什么dll&#xff0c;后面查了好多方法终于弄好了&#xff0c;今天我也是第一次使用OC渲染&#xff0c;所以可能调节就没有那么好&#xff0c;大家一起进步吧&#xff01;二、教程1、首先打开我们的C4…

java8 list 去重_Java8-Stream在集合中的8种应用案例

前言Java8新特性我们使用的应该比较多了&#xff0c;今天这里整理了个人使用最多的8种场景&#xff0c;希望对大家有所帮助。Java Stream在集合中的运用案例遍历遍历也许是我们使用最多的功能了&#xff0c;在Java8之前我们遍历集合通常会采用for循环&#xff0c;迭代器&#x…

springboot——热部署

一、手动启动热部署 在进行 Spring Boot 的 Web 项目开发中&#xff0c;我们经常会遇到源代码文件、 配置文件等的修改&#xff0c;但每次修改后都会重启 Web 服务器才能修改后的文件生效&#xff0c; 这样很耗时&#xff0c;影响开发效率。而热部署就是不需要重启 Web 服务器就…

(转载)ubuntu开启SSH服务

&#xff08;转载&#xff09; http://www.cnblogs.com/xiazh/archive/2010/08/13/1798844.htmlSSH分客户端openssh-client和openssh-server如果你只是想登陆别的机器的SSH只需要安装openssh-client&#xff08;ubuntu有默认安装&#xff0c;如果没有则sudo apt-get install op…