【SICP归纳】5 副作用与环境模型

虽说叫做副作用显得不太好听,但在Lisp中副作用还是非常重要的。而相对于所有状态都必须显式地操作和传递额外参数的方式,如果引进赋值和将状态隐藏在局部变量中,那么就可以用更加模块化的方式来构造系统。

正如你所知道的,不用任何赋值的程序设计称为函数式程序设计。相反,广泛采用赋值的程序设计称为命令式程序设计。在C等命令式程序设计语言中,我们往往都要仔细考虑变量赋值的顺序,尤其是在循环中,但在函数式程序设计中这类问题根本不会出现。

(define x 1)
(define (add-x y)
   (set! x (1+ x))
   (+ x y))
(add-x 3)
5
(add-x 3)
6

在这里我们看到同一个表达式却会导致两种不同的结果,而这一切都取决于时间。

我们常用define来定义一个为定义的变量、函数等等,而不用其来做修改的操作。set!则来完成修改这一工作。经常用到的let实际上是一个过程调用的语法糖衣。

(let ((var1 e1) (var2 e2))
  e3)=>
((lambda (var1 var2)
        e3)
 e1
 e2)

在前面的代换模型中,我们是这样求组合式的:

1)求值该组合式的各个子表达式

2)将作为最左子表达式(运算符)的值的那个过程应用于相应的实际参数,所谓实际参数也就是其他子表达式(运算对象)的值。

而在环境模型中,第二步就有所差异了:

1)求值该组合式的各个子表达式

2)将运算符子表达式的值应用于运算对象子表达式的值。

在将一个过程应用于一组实际参数时,将会建立起一个新环境,其中包含了将所有形式参数约束与对应的实际参数的框架,该框架的外围环境就是所用的那个过程的环境。

书中这部分可谓归纳的非常好,过程应用的环境模型的两条规则:

1)将一个过程对象应用于一集实际参数,将构造出一个新框架,其中将过程的形式参数约束到调用时的实际参数,而后在构造起的这一新环境的上下文中求值过程体。这个新框架的外围环境就是作为被应用的那个过程对象的一部分的环境。

2)相对于一个给定环境求值一个lambda表达式,将创建起一个过程对象,这个过程对象是一个序对,由该lambda表达式的正文和一个指向环境的指针组成,这一指针指向的就是创建这个过程对象时的环境。

用define定义一个符号,也就是在当前环境框架里建立一个约束,并赋予这个符号指定的值。

时间: 2024-11-07 17:25:38

【SICP归纳】5 副作用与环境模型的相关文章

学习笔记TF022:产品环境模型部署、Docker镜像、Bazel工作区、导出模型、服务器、客户端

产品环境模型部署,创建简单Web APP,用户上传图像,运行Inception模型,实现图像自动分类. 搭建TensorFlow服务开发环境.安装Docker,https://docs.docker.com/engine/installation/ .用配置文件在本地创建Docker镜像,docker build --pull -t $USER/tensorflow-serving-devel https://raw.githubusercontent.com/tensorflow/servin

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

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

nomasp 博客导读:Android、UWP、Algorithm、Lisp(找工作中……

Profile Introduction to Blog 您能看到这篇博客导读是我的荣幸.本博客会持续更新.感谢您的支持.欢迎您的关注与留言.博客有多个专栏,各自是关于 Android应用开发 .Windows App开发 . UWP(通用Windows平台)开发 . SICP习题解 和 Scheme语言学习 . 算法解析 与 LeetCode等题解 .而近期会加入的文章将主要是算法和Android.只是其他内容也会继续完好. About the Author 独立 Windows App 和

NoMasp博客导读

简介 博客简介 您能看到这篇博客是我的荣幸,本博客会定期持续更新.欢迎您的关注和留言. 个人简介 本科二年级,多年C#.Lisp编程经验,Windows App开发者,了解C.C++.HTML5等语言.密切关注人工智能.图像处理.云计算等,现阶段专攻Windows App开发. 博客导航 Algorithm 暂无 Amazing 暂无 Books 内容:2015读书计划及进度 <卡耐基写给男人的12堂财商课>摘录 C 暂无 CSharp C#相关的总结等. WPF和WinRT中的导航问题 文件

linux设备驱动归纳总结

前言: (总结已经基本写完,这段时间我会从新排版和修正.错误总会有的,望能指正!) 前段时间学习了嵌入式驱动,趁着没开始找工作,这段时间我会每天抽出时间来复习. 我的总结是根据学习时的笔记(李杨老师授课).<linux内核设计与实现>第三版.<linux设备驱动程序>第三版和<linux设备驱动开发详解>第一版来归纳的.文章中涉及一些自己的想法,并不能保证所说的一定正确. 我也是一位linux初学者,在这里发博也是想跟大家分享技术,同时也希望别人能够指正错误. 我把一些

转:Delphi各种Socket组件的模式和模型

Delphi的大多数书籍里面都没有提到delphi的各种socket通信组件的模式和模型,有的书只讲解了windows的socket模式和模型,并没有归纳各种组件采用的模型,所以我们的程序员并不知道如何进行选择,只知道某组件好,为什么好,如何运用就不知道了. 笔者对这些组件进行了一个归纳,如下: 组件 单元 依赖 模式 模型 WebApp/CGI sockapp.pas Indy 阻塞/非阻塞 select Indy 阻塞/非阻塞 select ICS OverbyteIcsWSocket.pa

css学习の第一四弹—代码格式简写归纳

一.代码简写方式归纳 >>1.盒模型代码简写: 外边距(margin).内边距(padding)和边框(border)设置上下左右四个方向的边距是按照顺时针方向设置的:上右下左 1.如果top.right.bottom.left的值相同,如下面代码: margin:10px 10px 10px 10px; 可缩写为: margin:10px; 2.如果top和bottom值相同.left和 right的值相同,如下面代码: margin:10px 20px 10px 20px; 可缩写为: m

ROS 实时构建八叉树模型

ROS 实时构建八叉树模型 ROS 毕业设计的主要内容是室内环境的建模,并转换成八叉树模型,以供后续使用之需.这里介绍离线八叉树模型建立和实时的八叉树环境模型构建. 1. 环境搭建 平台: ubuntu下ROS,用过hydro和indigo,其他版本有待确认(ros的安装请参考ros wiki): 开源室内建模项目,ROS下了解的RGBD开源项目有RGBD_SLAM和rtabmap,这里使用的是rtabmap,rtabmap的安装请参考ros rtabmap. ros下的octomap包,安装$

Scheme 4 Javaer-2.功能抽象

<编程导论(Java)?第3章功能抽象>按照功能抽象的逻辑发展,介绍在Java语言环境中的三种流程.子程序和结构化分解.接口与实现相分离以及抽象方法--功能抽象的最高形式.而把操作/表达式是Java编程中最原始和起步级别的功能抽象. SICP中,作为函数式编程语言的Scheme,它以表达式为基本单元,其功能抽象/函数抽象更为直接:按照丘奇的λ演算,完成对函数抽象的基本描述: W是参数为变量x的λ表达式,则λx . W是λ表达式,如λx.( x+1).这种表达式λx . W给出了一个函数的定义: