主页
解释器的简单构想
对于单文件程序 读取字符串=> 词法分析=>语法分析=>块分割=>梯度下降控制变量=>目标语言翻译 多文件需要多一个文件链接系统 如果导出可执行文件还需要使用目标语言编译器 地球上这么多编程语言了,世界已经够乱了,为什么还要造? 因为语言的局限性,没有任何一门语言是完美的,对于某些特定场景,定制一门语言是非常有必要的,比如游戏逻辑脚本系统。 现代计算机的计算速度非常快,但很多时候需要定制硬件和语言来达到更高的效率。 计算机是一门组合技术,我们在已有条件下组合各种资源,产出一些东西,甚至可以模糊掉软硬件,对于某些问题,我们只能无限接近最优,而永远无法达到最优,凡事不能陷得太深,时不时也顶下上帝的班,提醒自己不要太过执迷。
[sicp] 1.1程序设计的基本元素
基本表达式 组合的方法 抽象的方法 以上是程序设计的三种机制,只要语言提供了这三种机制,我们便可以构建复杂,大型的系统。 基本表达式 例如 (define a 8) 定义一个变量改变一个变量,所有对基本单元的操作构成了 基本表达式 组合的方法 例如分支语句,复合数据,其本质是通过树形积累递归式求解表达式 抽象的方法 为由组合生成的复合数据命名,把其变成基本单元,那么我们便可以再次组合,如此递归式进行构建复杂系统,其中环境所提供的操作(过程)被称作抽象。 交互式语言会提供一种运行环境,这种环境提供了全局上下文,所有的关于该语言的关键字在该上下文中都是有意义的。这些是编译器程序预先定义的, 用户也可以为某些符号进行定义,所有在上下文中的符号使用之前必须是被定义过的。 求值规则 (+ 3 4) 这是一个简单的求值过程,这里的 “+” 是一个规则(我猜测这是由解释器提供的基本规则), 类似的还有-*/,它们对应加减乘除,scheme的解释器是这样反馈的 很明显,这些基本计算过程不是我们这些草民能够触碰的。 (define x 0) 这里的define也是一个基本规则,它对应数学符号 = 这也是后面扮演及其重要角色的规则,我们自定义的过程依赖这个规则,才使得程序的可读性变得更优良。 对于数学来讲,好像“=”和“*”是不同的,但是对于程序而言它们都是求值规则。 我们再看一个例子 (define add +) (add 9 8) 这里我们将“+”赋值给“add”,相当于取别称,我们将数值赋值给变量,其实是一样的含义。 所以数据和过程对于lisp来说都是同样的,这种强大的抽象手段使得我们能够游走于数据和过程之间。
魔法与lisp[新坑--序言]
著名的麻省理工课程sicp最早使用lisp方言,主要因为lisp独有的构造和特征. lisp的表达过程可以作为数据被lisp本身操作, 这使得它能够写出那些必须将其他程序当作数据进行操作的最佳语言,也就是说,它可以操作"自己",这里的操作是很宽泛的含义,可以强大到编译解释 自己, 我们可以进一步了解一下lisp是如何产生魔法的。 《计算机程序的构造和解释》  的读后感将会拆分连载在这个博客上。 如果你是一个软件开发人员或者学生,这些内容只是我的感想,你不应当把这些博客内容作为你学习的主要入口,你应当去购买书籍或者观看sicp的课程。
二三阶行列式及其计算过程
在引入行列式之前,回顾一下之前的多元一次方程组计算手段。 关于线性代数,有些教材从数域开始说起,比如李炯生那本,里面有许多证明的习题,读者对其评价也很高,不过难度对于一般工科学生来说也是相当的大,更何况我这种渣渣,所以,我入手没多久就吃灰了。 相对简单的有陈必红的 《线性代数简明教程》,这本书便是从行列式开始说起,这也是一般教程的教法,众所周知这类教法都是以应用为目标,层次也比较低,入手相对容易,尽管基础概念没有那些一来就进行铺垫的教材深刻(甚至缺少),不过先把它弄起来用着也未尝不可。 中学时考计算,所以计算是需要大量训练的,现在需要应用甚至论证,所以论证和应用也需要大量训练,同时理解其背后的运算过程,对于概念和应用都是非常有帮助的。 行列式 1.1 二三阶行列式

[katex] 

斜线算法大家都知道, 那么我们来实现一个以二维数组表示的行列式的计算过程,本来我是想用lisp来实现,但是,面对重重括号,我也有些担忧其阅读性,我也不想过多去处理低层次的东西,所以也不使用c,所以用一种更易懂的语言python---面对某些无关紧要的问题,最好的方法是想办法避开它。 def det_compute(det): return det[1][1]*det[2][2] - det[1][2]*det[2][1] 这是一个二阶行列式的计算方法,后面我们会看到更高阶的计算过程其实也并不复杂,只要我们独立出每个模块的功能。 和二阶同样的过程可以应用在三阶上,更高阶我们便要借助通用计算过程了。 1.2 n阶行列式 n阶行列式的计算过程是通过遍历所有不同行不同列,然后按照符号规则进行计算总和。