乐正

Actions speak louder than words.

Sicp-ex3-34

问题

Louis Reasoner 想做一个平方器,也就是一种带有两条引线的约束装置,使得连接在它的第二条引线上的连接器b的值是其第一条引线上的值a的平方。他提出了用乘法约束定义这一设备的简单方法:

1
2
(define (squarer a b)
  (multiplier a a b))

这一建议有一个严重缺陷,请给出解释。

解答

将通过b的值求a的值的时候,因为multiplier需要两个已知变量的值才能计算另一个变量的值。所以,无法通过只设置b而获取到a的值。

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(define a (make-connector))
(define b (make-connector))

(squarer a b)
$47 = #<procedure me (request)>

(probe "Squarer a" a)
$48 = #<procedure me (request)>

(probe "Squarer b" b)
$49 = #<procedure me (request)>

(set-value! b 0 'user)
Probe: Squarer b = 0
$50 = done

(has-value? a)
$51 = #f

draft

« sicp-ex3-33 sicp-ex3-35 »

Comments