1.21 簡單的將書上代碼敲了一遍, 很順利就過了。
1.22 就悲劇了。
先按書本的意思,代碼很快就寫完了。但計算的時間在機子上漂浮不定, 3-5倍之間。
代碼如下:
(define (search-for-primes start end count)
(define (timed-prime-test n)
(newline)
(display n)
(start-prime-test n (runtime)))
(define (start-prime-test n start-time)
(if (prime? n)
(report-prime (- (runtime) start-time))
0))
(define (report-prime elapsed-time)
(display " *** ")
(display elapsed-time)
1)
(define (prime? n)
(= n (smallest-divisor n)))
(define (search-iter start end count)
(if (or (> start end) (= count 0))
0
(if (= (timed-prime-test start) 1)
(search-iter (+ start 1) end (- count 1))
(search-iter (+ start 1) end count))))
(search-iter start end count))
問題就悲劇在,我想換一種想法。
一般常見的工程測試代碼都是如下風格:
記錄開始時間
調用函數
計算結束時間
於是,我很悲劇地寫了下面代碼
(print-test-time (runtime) (search-iter start end count) (runtime))
卻驚奇的發現前後2次計算的時間居然完全一樣。
再認真將書從頭看了一遍, 我暈, 這本書最重要的東西居然沒講。 函數的參數到底按什麼順序求的?
google了一下,暈, 居然是依賴編譯器確定。 也就是說不知道。
對於一般狀態無關的參數的確沒有問題。 但對於時間依賴的參數就悲劇了。
再回過頭來思考計算模型, 發現這本書更大的問題。 對什麼東西能做操作符,什麼東西能做操作數居然完全沒有給出清晰的定義。
1和1.0, 1/1, true, 到底是不是一回事,書本也完全沒講清楚。
作爲講編程語言的書來說, 這本書真是一塌糊塗。
上面的函數 (timed-prime-test n) 有3個語句, 概念進入得很突入, 這3個語句執行按什麼順序呢? 返回值是哪個呢? 基本上靠讀者去猜。
(本人猜的是從上往下執行,返回最後一個語句 ,但是不是程序確實是這樣還不大自信)
(newline)
(display n)
(start-prime-test n (runtime)))