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