這一節主要是介紹區域性狀態變數,介紹了set!和begin的語法,看來ruby使用!號來表示改變變數值不是什麼新鮮主意。
習題3.1,不解釋了
;習題3.1
(define (make-accumulator init)
(define (accumulator num)
(set! init (+ init num))
init)
accumulator)
習題3.2,非常有趣的例子,在內部維持乙個計數的變數即可,如果傳入的引數是特定的符號就返回計數或者清0,如果不是,原過程呼叫。
;習題3.2
(define (make-monitored proc)
(let ((counter 0))
(define (proc-monitor args)
(cond ((eq? args 'how-many-calls?) counter)
((eq? args 'reset-count) (begin (set! counter 0) counter))
(else
(begin (set! counter (+ counter 1)) (proc args)))))
proc-monitor))
請注意,我的實現只能針對有乙個引數的過程,對於多個引數的過程我還不知道怎麼做。
習題3.3,passwd的區域性狀態變數,在dispatch前比較下傳入的密碼是否與之一致
;習題3.3
(define (make-account balance passwd)
(define (withdraw amount)
(if (>= balance amount)
(begin (set! balance (- balance amount)) balance)
"餘額不足"))
(define (deposit amount)
(set! balance (+ balance amount))
balance)
(define (dispatch pwd m)
(if (eq? pwd passwd)
(cond ((eq? m 'withdraw) withdraw)
((eq? m 'deposit) deposit)
(else
(error "unknow request--make-account" m)))
(lambda(x) "incorrect password")))
dispatch)
不一致的時候,返回乙個匿名過程,僅僅是輸出訊息incorrect password
習題3.4,在內部維持乙個區域性變數counter,用於計數密碼錯誤的次數,在dispatch前判斷counter是否等於7,如果是7就呼叫過程call-the-cops。
;習題3.4
(define (make-account balance passwd)
(let ((counter 0))
(define (withdraw amount)
(if (>= balance amount)
(begin (set! balance (- balance amount)) balance)
"餘額不足"))
(define (deposit amount)
(set! balance (+ balance amount))
balance)
(define (call-the-cops amount)
"您已經嘗試輸入密碼7次了!不能再試!")
(define (dispatch pwd m)
(cond ((= 7 counter) call-the-cops)
((eq? pwd passwd)
(cond ((eq? m 'withdraw) withdraw)
((eq? m 'deposit) deposit)
(else
(error "unknow request--make-account" m))))
(else
(begin (set! counter (+ counter 1)) (lambda(x) "incorrect password")))))
dispatch))
文章**莊周夢蝶 ,原文發布時間2007-07-24
sicp習題2 2節嘗試解答
習題2.17,直接利用list ref和length過程 define last pair items list list ref items length items 1 習題2.18,採用迭代法 define reverse list items define reverse iter i k ...
sicp 4 3 3小節習題
本節實現了amb求值器,題目都是擴充套件這個求值器,引入一些特殊的過程。我的嘗試解答從4.51開始 習題4.51,要求實現permanent set 這個過程的 在遇到失敗時不撤銷,實現如下 擴充analyze permanent assignment?exp analyze permanent a...
sicp 4 2 2小節部分習題
4.27,l eval input define count 0 l eval value ok l eval input define id x set count 1 count x l eval value ok l eval input define w id id 10 l eval va...