SICP笔记1

  • 组合式:用一对括号括起一些表达式,形成一个表,用于表示一个过程的应用。

(+ 123 456)

输出:578

  • 表里最左边的是运算符,形式为前缀表示。表可以直接扩充,如(1+2×3):

(+ 1 (* 2 3))

输出:7
  • 给事物命名用define,类似其他高级语言中的变量。

(define size 2) ;为size关联一个值,即2

(* size 5)

输出:10

  • 符合过程,一般形式:

(define (<name> <formal parameters>) <body>)

举例如下:

(define (square x) (* x x))

(square 21)

输出:441

(square (+ 2 5))

输出:49

  • 正则序求值:完全展开而后归约的求值模式。现代解释器实际使用的是应用序求值:先求值参数而后应用。
  • 条件表达式与谓词

(cond (<p1> <e1>)

    (<p2> <e2>)

         ...

         (<pn> <en>))

举例:

;cond表示条件,pn是谓词,其被解释为真或假,类似C中的switch。

(define (abs x)  ;求x的绝对值

  (cond ((> x 0) x)

     ((= x 0) 0)

       ((< x 0) (- x)))) ;注意x之前有空格

求绝对值的另一种写法,类似C中的if...else:

(define (abs x)

  (cond ((< x 0) (- x))

       (else x)))

再有一种写法,(if <predicate> <consequent> <alternative>),如果<predicate>为真,则求值<consequent>,否则求<alternative>。类似C中的expr1 ? expr2 : expr3。

(define (abs x)

  (if (< x 0)

    (- x)

      x))

三个常用的符合运算符,与基本逻辑运算规则相同:

(and <e1> <e2> ... <e3>)

(or <e1> <e2> ... <e3>)

(not <e1>)

用法举例:

(define (>= x y)

  (or (> x y) (= x y)))

注:解释器输出的对或错为

;Value: #t   ;如果错误为#f

  • 局部名,类似局部变量。

(define (square x) (* x x))

(define (square y) (* y y))

这样定义解释器无法区分,无论是x或者y,对于外部来看,都没有区别,类似函数。

  • 内部定义(块结构)。之所以有内部定义,因为某过程对于用户,只有某个过程是需要的,其他的都是干扰。例如牛顿法求平方根,只有sqrt是用户需要的。故我们可以采用块结构,类似函数:

(define (sqrt x)

  (define (good-enough? guess x)
    (< (abs (- (square guess) x)) 0.001)) 

  (define (improve guess x)
    (average guess (/ x guess)))

  (define (sqrt-iter guess x)
    (if (good-enough? guess x)
      guess
      (sqrt-iter (improve guess x) x)))

(sqrt-iter 1.0 x))

由于都在一个块结构中,x在其中传递便没有必要了,我们将x定义为内部定义的自由变量。这种方法称作词法作用域。

(define (sqrt x)

  (define (good-enough? guess)
    (< (abs (- (square guess) x)) 0.001)) 

  (define (improve guess)
    (average guess (/ x guess)))

  (define (sqrt-iter guess)
    (if (good-enough? guess)
      guess
      (sqrt-iter (improve guess))))

(sqrt-iter 1.0))

posted on 2013-01-06 19:05  初级业余程序员  阅读(253)  评论(0编辑  收藏  举报

导航