numbbbbb/sicp

Exercise 3.39 答案有误

xuxiaoqiao opened this issue · 2 comments

题目见 http://sarabander.github.io/sicp/html/3_002e4.xhtml#Exercise-3_002e39

你的答案如下

; except two normal value, there are one special case
; second proc read x before first set! works (after square operator, because set! is not included in serializer), so result is 11.

但是我认为,那个 special case 的答案是 100, 而11的情况不会发生
网络上的其他资源也与我的判断一致:

我的思考过程是这样:

(lambda () (set! x ((s (lambda () (* x x))))))
(s (lambda () (set! x (+ x 1))))

第一行的函数会进行两个 process : 1. 计算新的值(计算新值的过程是 atomic 的,这一点由 serializer 保证)(我把这个操作记为p); 2. 赋值给x(我把这个操作记为q)
第二行的函数进行一个操作: 计算新值并赋值(整个过程是 atomic 的)(我把这个操作记作a)

如果整个程序以"paq"的顺序发生,那么结果就是100

(啊开学前看不完SICP要死了orz

(define (last-pair a)
	(if (null? (cdr a))
		a
		(last-pair (cdr a))
	)
)

错误貌似有点多~

感谢指出错误,时间有点久我都忘的差不多了……等有空了我再重新看一边题。