【发布时间】:2020-03-15 11:51:14
【问题描述】:
我在 SICP 中的练习 3.6 中遇到困难。 他们为伪随机数生成器提供了以下代码:
(define rand
(let ((x random-init))
(lambda ()
(set! x (rand-update x))
x)))
我添加的,用于测试目的:
(define (rand-update x) (+ x 1))
(define random-init 4)
重复申请产生
> (rand)
5
> (rand)
6
> (rand)
7
正如希望的那样,虽然我不明白为什么会这样。
无论如何,练习 3.6 要求我们修改 rand,使其接受一个参数,指示它为 'generate 或 'reset。
首先,我尝试设置一个带有会生成条件的 rand。然而,我在第一个障碍中绊倒了。
(define (rand-new instruction)
(let ((x random-init))
(cond ((eq? instruction 'generate)
(lambda ()
(set! x (rand-update x))
x)))))
给我
> ((rand-new 'generate))
5
> ((rand-new 'generate))
5
> ((rand-new 'generate))
5
就像将 let 表达式移动到条件中一样,像这样:
(define (rand-new instruction)
(cond ((eq? instruction 'generate)
(let ((x random-init))
(lambda ()
(set! x (rand-update x))
x)))))
那么为什么第一个函数可以工作,而新函数却不行呢? 和使用条件有关吗?还是加个参数?
更新(19/03/20)
阅读关于计算环境模型的下一部分(第 3.2 节),让我了解了弄清楚发生了什么所必需的理论。 我最终得到了
(define (random-number-generator initial update)
(define (generate)
(begin (set! initial (update initial))
initial))
(define (reset new-value)
(begin (set! initial new-value)
initial))
(define (dispatch message)
(cond ((eq? message 'generate) (generate))
((eq? message 'reset) reset)
(else "Procedure not found!")))
dispatch)
(define rand (random-number-generator 5 rand-update))
【问题讨论】:
-
“虽然我不明白为什么会这样” -> 那么,在尝试修改它之前,您需要花时间了解为什么它会起作用!
标签: functional-programming scheme sicp