sicp 笔记 (11)

第四章习题 4.16 - 4.37 的解答。

E-4.16:

(a) 如果匹配到相应的变量再检查一下变量值是否为“unassigned”。

(define (lookup-variable-value var env)
  (define (env-loop env)
    (define (scan vars vals)
      (cond ((null? vars)
             (env-loop (enclosing-environment env)))
            ((eq? var (car vars))
             (let ((v (car vals)))
               (if (eq? v '*unassigned*)
                 (error 

阅读全文…

sicp 笔记 (10)

第四章习题 4.1 - 4.15 的解答。从本章开始使用 mit-scheme 9.1.1。

E-4.1: 题目的意思是,函数 list-of-values 对参数列表的求值顺序依赖于解析器的实现。如果解析器对参数列表的求值顺序是从右往左的,那么 list-of-values 的求值顺序也是从右往左的,也就是说,对于 list-of-values 中的“(cons ...)”,会先算“(list-of-values (rest-operands ...))”这部分,后算“(eval (first-operand ...))”,也就是从右往左了;如果解析器的求值顺序是从左往右,那么 list-of-values 的求值顺序也是从左往右。

(define (list-of-values-lr exps env) ; evaluates from left to right
  (if (no-operands? exps)
    '()
    (let ((first-value (eval (first-operand 

阅读全文…

sicp 笔记 (9)

第三章习题 3.73 - 3.82 的解答。

E-3.73:

(load "../examples/3.5.2-infinite-streams.scm")

(define (integral integrand initial-value dt)
  (define int
    (cons-stream initial-value
                 (add-streams (scale-stream integrand dt)
                              int)))
  int)

(define (RC resistance capacitance time-step)
  (lambda (currents initial-voltage)
    (cons-stream initial-voltage
                 (add-streams (scale-stream currents resistance)
                              (integral (scale-stream currents 

阅读全文…

sicp 笔记 (7)

第三章习题 3.21 - 3.37 的解答。

E-3.21: 因为 queue 只记录队头指针和队尾指针,而打印 front-ptr 的时候把整个队列都打印出来了,打印 rear-ptr 只打印最后一个元素。最后有一组“(# #)”应该是 map 的返回值。

(load "../examples/3.3.2-representing-queues.scm")

(define (print-queue q)
  (define (iter current end)
    (if (eq? current end)
      (map display (list (car current) "\n"))
      (begin (map display (list 

阅读全文…

sicp 笔记 (5)

第二章习题 2.73 - 2.97 的解答。

E-2.73:

(a) 因为 number 和 variable 使用的是 scheme 提供的原子类型,并不是自定义的类型。

(b)

(define (install-deriv-package)

  (define (deriv-sum expression var)
    (make-sum ((get 'deriv (operator expression)) (addend expression) var)
              ((get 'deriv (operator expression)) (augend expression) var)))

  (define (deriv-product expression var)
    

阅读全文…