SICP读后总结+对函数式编程的理解 - zztant的专栏 - 博客频道 - CSDN.NET
花了两个月的时间瞄完了SICP,完成了一到三章的大部分习题,第四章照着书上实现了一个元循环解释器,以及一个查询系统,第五章也照着书上模拟了一下机器语言,最后一节编译没有细看,现在做一下总结。
整本书依次介绍了过程抽象、数据抽象、环境模型、解释器、编译器
一、过程抽象
1.正则序先将参数展开然后规约,应用序先对参数求值,然后将值代入,特别要注意的著名的Y combinator只适用于正则序,而通常的lisp解释器都是基于应用序的。
2.迭代型递归只使用常量的内存空间,类似于命令式语言中的循环结构,而普通的递归需要调用栈。
3.高阶函数----过程作为参数,常见的过程map,apply,filter等都用到了高阶函数,lambda表达式返回一个函数。高阶函数是函数式编程最大的特点,C/C++虽然可以调用函数指针模拟map,apply等函数,但并没有lisp这样直观,函数是一等公民。
二、数据抽象
1.闭包性质,以cons为例子,构成序对的元素本身仍然可以是一个序对。按照书上的话说,某个操作满足闭包性质,意味着,通过该操作组合起数据对象的结构本身还可以通过同样的操作继续进行组合。2013.12.05:今天明白当时对闭包的解释存在错误,那么到底什么是fp中的closure到底是什么呢?通俗的讲,闭包性质就是子函数可以访问父函数的局部变量的性质。结合下面的队列实现,闭包性质可以模拟面向对象的代码风格,有另一种解释js闭包的说法是:一个闭包就是当一个函数返回时,一个没有释放资源的栈区
2.lisp的动态数据类型似乎使数据抽象的实现更加灵活。
三、环境模型
1.以消息传递为基础的面向对象系统,通过环境模型(let操作实质为lambda的语法糖)保存局部变量,模拟事物状态的变化过程。下面是一个用消息传递机制实现的队列
Read full article from SICP读后总结+对函数式编程的理解 - zztant的专栏 - 博客频道 - CSDN.NET
No comments:
Post a Comment