scheme简介(1)

 介绍就不多说了, 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再写一篇.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值