天天看点

SICP读到第二章时对Scheme的理解

在Scheme中,

一个括号里包含了一个基本单元。

括号里可以包含基本的数据,或者由别的括号围起来的的基本单元。

比如 ( + 1 2 ),它有两种意义:第一种,它代表了1+2这个运算过程,第二种,它代表了整数3.

再比如 ( define x 1 ),有两种意义:第一种,它代表了“将x的值设置成1”这个运算过程。

第二种意义,它返回一个东西,这个东西是值还是过程我也不知道(误

但总之,( define 1 )代表了一个值或者过程。

在Scheme中,值和过程分的并不是那么清楚,这是最令我惊奇和着迷的地方。

一个过程也可以作为返回值,返回给其它的过程作为一个参数来使用。

这句话可能有点抽象。但其实在C语言中有类似的概念,那就是函数指针。

在C语言中,函数指针指向了函数的起始地址,也就是函数的入口。这个指针是一个十六进制整数值,

但是这个整数又指向了一个函数,所以它又可以被看做一个函数。

所以C语言中,使用函数指针,可以达到Scheme中的,“把过程作为参数传进去”、“把过程作为参数传出来” 这两个目的。

所以这就是函数式编程了对吗?

下面讨论一下scheme的括号的意义

一对括号就代表了一个值,这个值可以是常规意义上的值,也可以是过程,也可以是空的:()

括号里的东西由两种元素组成:数据和对数据的操作。

第一项是对数据的操作,后面的都是数据。

但是,数据和操作分的并不是那么清楚。

所以操作也可以被操作所操作(我觉得这句话会烧掉读者的大脑)

比如

(define * 2)
(+ * * * *)
           

这么做会输出8,因为你把乘号定义成了2,这个例子虽然有些匪夷所思,但是可以说明,scheme语言的灵活性。

就像SICP第一章所说的:

”Lisp不像其它程序设计语言,它给了过程完全的第一级状态。这就给有效实现提出了挑战,但由此所获得的描述能力却是极其惊人的。“

继续阅读