《计算机程序的构造与解释》(总结)

来源:互联网 发布:数据库应用教程 编辑:程序博客网 时间:2024/06/06 00:11

这本书看了好几遍(主要是前三章),是时候来个总结,结束这个系列。

语法

程序语言的语法,就是它“看起来的样子”——它的外形,由它的外形指向的意义,则是语义。其他语言可能包括关键字、中缀操作符、操作符优先级、分号等等。scheme的语法极其简单,就是中缀表示和表结构,并且表现出非常的一致性,无论是函数抽象、函数应用还是变量定义。例如:

java:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;if (x.val() > 0) {   z = f(a * x.val() + b[i]); }
scheme:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;(if (> (val x) 0)     (set! z (f (+ (* a (val x))                   (aref b i)))))

java语言里有小括号、大括号、中括号、分号和赋值号=、大于号等,而表达相同的语义,scheme只需要小括号、以及表示逻辑比较的大于号,set!和aref也比数字下标更清晰;更重要的,scheme在形式上是一致的,如if语句的条件,是通过表(> (val x) 0)表示,数组下标求值也是表(aref b i)。这点在java以及其他语言是没有的,由此带来的编译器实现也简单很多。在逻辑上对表的求值,统一为:它的第一个元素作为操作符,将作用于表达式的操作数上,也就是这个表的剩余元素。

scheme语法分如下几种:

变量定义:(define var exp),通过define在当前环境中,建立名字——对象映射,也就是var指向exp的值。其实在函数定义时,对lambda表达式命名,用户通过函数名引用过程运算。

表(list):表的数据结构可以说跟scheme深深的融合在一起了。因为语言本身就是通过表形式书写的,对表的操作也非常方便。基本操作分三种:cons、car和cdr。cons带两个参数,分别将这两个参数构造成对(pair).空表就是没有元素的表,通过quote ()或者'()表示。如果一个对象是一个list,那么它肯定是pair;反过来则不一定。因为表的结尾必须为空表,即以'()为结束标志。

数据类型:任何一门语言都必须规定它支持的基本数据类型,scheme的数据类型有number、Boolean、symbol;通过基本数据类型进行扩展,有string、list、pair等等。类型扩展需要语言有相应的数据结构工具的支持。

分支:有两个if和cond,它们都通过谓词表达式,根据这个表达式为true或者false,执行不同的分支语句。谓词表达式就是该表达式的值为true或者false。scheme任何表达式都有值,程序运行就是不断的求值过程。有了分支语句,语言的表达能力得到极大的提升,可以被称为图灵完备。

函数定义:函数或者过程是对计算的抽象,代表了一类计算过程。通过输入参数,执行相关的操作,并且可以被重复调用。在函数定义时,参数称为形式参数(formal parameter),本质上它就是占位符(placeholder);函数调用时,就是给这个占位符赋值,然后按照已定义的顺序执行运行。

函数调用:函数定义相当于建立电路模块,但是还没有给它的输入插电。而函数调用就是将已经造好的电路模块,插入设计的电路系统中,给它通上电,然后系统就开始运行,运行的结果通过输出按钮表现出来。插电的过程,就是将实参(argument)赋值给形参(parameter)的过程。



0 0
原创粉丝点击