介绍就不多说了, wiki上都有. 我这也只是个阅读sicp的笔记.
过程
定义过程,比如一个求平方的过程就可以这样写
(define (square x) (* x x)).格式是这样的
:(define (<函数名> <参数列表>) <函数体>). 其中函数名和参数, 以及参数与参数之间用空格隔开. 如何使用呢? 很简单, 比如求3的平方就可以输入
(square 3) 如果在交互的解释器环境下,就会输出 9. 一般解释器都有一些内建的函数,比如+,-,*,/之类的.
当然也可以用匿名函数, 也就是lambda函数, 格式如下
(lambda (<参数列表>) <函数体>), 上面的求平方的写成匿名的就可以是这样:
(lambda (x) (* x x)), 几乎和普通的定义函数的方法一样, 只是没了函数名. 怎么使用呢? 只需要把普通的函数调用的函数名用 lambda表达式替换掉即可,
如(
(
lambda
(
x) (* x x)) 3).
分支
分支有两种类型的,一种是if表达式, 另一种是cond表达式.下面分别说一下格式和用法.
if表达式类似c语言中的if. 格式是这样的(if <逻辑表达式> <表达式1> <表达式2>), 其中当<逻辑表达式>为真的时候返回<表达式1>, 否则返回<表达式2>.. . 比如(if (= (square 3) 9) "yes" "no"), 这里我们检查3的平方是否为9, 是的话这个表达式的结果就是"yes", 否则就是"no", 肯定是的啦.
cond表达式类似这样的结构 if (...){...} else if (...){...} else if (...){...}..... 格式是这样的
(cond (<逻辑表达式1> <表达式1>)
(<逻辑表达式2> <表达式2>) ...) .其实没有特定的逻辑表达式, 只要这个表达式的值为真即可, 至于什么是真, 什么是假得留到以后说了, 现在还没看到 :). cond执行的时候类似势如破竹的感觉, 逻辑式1不行就检查逻辑式2, 再不行就逻辑式3... 直到遇到一个为真的表达式, 并执行相应的执行体.如果没有一个逻辑式为真, cond返回空表.
循环
没有显式的,类似while for之类
循环关键字, 依靠的是递归来实现的, 书上说了两种方式的循环:迭代和递归. 当然迭代也是用递归实现的, 但其本质是用有限的程序变量来记录一个计算过程, 还是迭代:). 用例子来说明吧, 下面我们用了两种方式来计算1到100的和, 一种是递归, 一种是迭代
(define (sum-recu start end)
(if (> start end)
0
(+ start (sum-recu (+ start 1) end))))
(define (sum-iter start end)
(define (iter i result)
(if (> i end)
result
(iter (+ i 1) (+ result i))))
(iter start 0))
(print (sum-iter 1 100))
(print (sum-recu 1 100))
通过对比就能发现本质的不同:递归是把中间的计算过程让解释器给保存起来, 在c中就是在栈帧, 而迭代是用自己定义的变量来保存结果, 在我们的例子中是i和result, 如果计算被中断, 只要我们保存了i和result的值就能让计算继续下去.
在迭代版本中使用了内嵌的函数定义, 其实就是在函数中定义函数, 没啥新奇的, 不过因此能产生一些奇妙的效果, 比如闭包, 网上有介绍,
在此就不罗嗦了.
这次就先写这么多, 下次就lambda再写一篇.