Warning
本解法有错误,正等待修复中,具体请参考: http://sicp.readthedocs.org/en/latest/chp3/6.html#comment-770974238
这题使用了 3.1.1 和 3.1.2 小节的状态、消息传递和随机数等知识:
;;; 6-rand.scm
(define random-init 1008611)
(define rand
(let ((state random-init))
(lambda (mode)
(cond ((eq? mode 'generate) ; 产生随机数
(random state))
((eq? mode 'reset) ; 返回一个过程
(lambda (new-value) ; 这个过程将 state 修改为新值 new-value
(set! state new-value)
state))
(else
(error "Unknow mode -- RAND" mode))))))
测试:
1 ]=> (load "6-rand.scm")
;Loading "6-rand.scm"... done
;Value: rand
1 ]=> (rand 'generate)
;Value: 402729
1 ]=> (rand 'generate)
;Value: 375910
1 ]=> ((rand 'reset) 3.14)
;Value: 3.14
1 ]=> (rand 'generate)
;Value: .07085172217140417
1 ]=> (rand 'generate)
;Value: 2.98251778866498