SICP学习感悟

第零章 概括

LISP最大的优点在于自由,你可以从无到有定义任何东西,不需要任何别人规定好的算法。

不需要接受什么void return if catch等,不需要去像别人学习,你就是逻辑的主宰,自己世界的王。

别的语言给你工具让你生活,LISP给你造物神力去变化工具然后生活。

你不仅仅是在用别人的工具编写程序,你是造物主,你创造了一门语言去实现功能,自己创造万物并用它来实现功能。

数学是对概念的精确表述,LISP是对流程的精确描述。

 

第一章 用过程构建抽象

程序只包含两部分:数据和处理数据的过程

为什么说过程与数据其实没有太大的区分呢?我的理解是过程分为复合过程和简单过程,复合过程可以由简单过程构成,简单过程是加减乘除,加减乘除在LISP都是返回一个数值(说return可能不如说得到一个数值合适),那么过程最终结果是一个数,那么一个过程就可以被当作一个数据来看待。

运算符号的前缀表示法更接近计算机的本质,因为加减乘除本质上是一个函数,那么我们把函数名写在签名,变量名写在后面岂不是理所应当,它能提醒我们所谓加减乘除也只是一种函数而已

编译器要做的只有两件事:执行过程,将过程的结果作为下一个过程的参数实现嵌套

define也是一个函数,输入前后两部分进行关联,如果有参数就空格后面加参数

 

LISP提供cond来实现条件,cond <p> <e>,但实际上cond也是一个过程,和其他过程没有区别,首先判断条件真假可以用基本运算= < >来实现,得到结果0或1,这个判断和加减乘除都是运算,可以用加减乘除实现,没有什么不同,(比如是否ab相等可以用(*(- a b) (倒数(- a b))))实现。目前实现了判断真假。然后实现后续选择执行指令,因为<e>是一个数据,所以我们返回(*<p> <e>)来实现条件控制,如果p为1返回e数值,如果p为0返回0,完美。

从宏观上想,加减乘除是一个返回任意值的函数,cond是一个返回两种值的函数。<p>是一个返回0或1的函数,<e>是返回任意值的函数,else就是if not

 

LISP中如果有函数嵌套,并且如果我们只想用最外层的函数,这时候我们要把嵌套内的所有函数的define都写一遍,这一点也不cool。我想达到的目的是我只用调用最外层名字和参数就得到答案,所以LISP允许define内define的嵌套,这样内层define只有被外层函数调用,不能被其他函数调用,实现了封装,相当于private。

 

改进前,不用define嵌套,每个内层都要在外层define

 

这种块结构有助于构建大型程序。并且由于内部定义,所以外层函数要把内层所需的所有参数传递进去,这门学科叫词法作用域。

 

 第二章 用数据构建抽象

第一章输入和输出的都是数字,但是我们处理很多问题要用到矩阵,堆栈,图树等复杂数据结构,以及nunpy,pandas包等。所以我们需要对数据的从简单到复杂的构建和抽象。

语法结构:

 

 (define z (cons x y))

posted @   srid  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示