练习 3.6

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

讨论

blog comments powered by Disqus